今天两个版本的d1 mini,还有aht20温湿度传感器都到了🤔我可以先拿v3随便写点玩意,比如arduino ide里面自带一个http示例程序,我可以先往discord频道里发点消息🤔
由于显而易见的原因,在esp8266里使用https是非常困难的,要么得把目标网站的证书指纹提取出来硬编码进代码,要么得套用什么什么框架,要么直接使用setInsecure()
不安全地连接🤔我肯定选用了最后一个,毕竟我只是要发送一些温湿度数据上去,甚至都不指望它回复什么东西🤔
好,那我就用之前在cloudflare workers上设置的discord反向代理,几秒钟后discord聊天室里出现了一条新消息,不错,这不是从我的某台电脑或者手机发出来的,而是从一块可能只有10块甚至⑨块钱的esp8266儿童玩具发出来的(确信🤔
接下来我需要将aht20和esp8266相连,并使用某种代码从里面读数据🤔它的示例代码并没有地方设置针脚,所以我估计只能按照它的默认针脚连了(悲🤔而且理论上来说我买的玩意可以同时测温湿度和气压,但我只找到读温湿度的代码,那就先跑它那个示例,不错,温湿度都从串口输出里读出了🤔
接下来我只需要将这两个代码缝合在一起了(确信🤔现在有一个问题,它那个代码里字符串和温湿度是陆续打印到串口输出里,但我要是想把它们post到discord webhook上的话,我得将其合并成一个字符串,此时它就开始报类型错误了,字符串和浮点数没法合并(恼🤔
这玩意貌似是c还是c++来着,c的话使用sprintf
构造字符串,结果它的http.post()
里面接受的是一个String
对象,不是char*
(全恼🤔更离谱的是它这里用的是一个叫做String
的应该是自创的字符串对象,S是大写,不是std::string
,要是自作主张地使用std字符串相关函数,肯定得吃一个类型转换不动的错误(恼🤔比如浮点数转字符串部分,std::tostring
肯定是用不了的,极其生草的是它居然提供了一个叫做String(114.514, 3)
的函数来将传感器读出来的浮点数转换成String
对象,就にま离谱(半恼🤔
反正无论如何,现在discord聊天室里终于打出了当前的温湿度,至此discord温湿度计正式搞完了,拔下来随便找个充电器插上,我就可以将其放什么鬼地方24小时监测室温了(确信🤔discord聊天室刚好可以用来做数据记录,时间戳都能记录下来,哪天我要是想画曲线图啥的,直接将discord频道的内容拖下来做处理就vans了(确信🤔
bruh
但现在这玩意有一个非常严重的问题,每次http请求的时间实在是太たま长了(全恼🤔具体来说,我给那段程序加了一个新功能,它开始发送http请求之前开始亮灯,发送完http请求之后停止亮灯,这样理论上来说每次发送http请求时会闪烁一下(确信🤔但我观察到的是,每次亮灯居然长达七八秒,哪怕我设置的采样和发送请求间隔是两秒,discord那边也得十多秒才能收到一条消息(恼🤔
我无端猜测导致它发送http请求时间如此之长的因素,无非两点:
- 本来往cloudflare的服务器发送请求,然后再由cloudflare workers处理下发往discord,再接收返回,就是个非常耗时的过程
-
https带来了额外开销
前者基本上被否定了,因为我本机不上梯子发送一个https post请求,也就用了平均1.3s,远远低于esp8266的表现🤔如果是http的话只有0.6s,这两个时间都不算很长(迫真🤔
所以我无端猜测绝对是https拖了后腿🤔具体来说,一次非保持连接的https请求对应的tcp请求貌似是http请求的三倍啊三倍左右,相比之下https带来的额外计算开销反而可以忽略不计(迫真🤔
既然如此,那么cloudflare可以改成支持http,换句话说把什么always https给关了,这样以http方式向cloudflare发送请求时不会302跳转https了(确信🤔
接下来esp8266上的程序也得改,除了网址去掉s外,创建http客户端对象啥的需要用另外一个类,不然的话http请求会发不出去(恼🤔我无端猜测,这两个类发出的http请求搞不好连端口号都不一样,所以不能混用🤔
改完后它每次亮灯基本上不超过一秒,尽管仍然比较长,但至少可以忍受了(迫真🤔现在,也许我设置的采样和发送间隔这个数字变得真正有意义起来,我可以设置一个比如五秒或者11.4514秒的时间,然后扔一边去了(确信🤔