『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 39868|回复: 40

[经验分享] 我好像找到了ESP8266转发TTL串口发生丢消息问题的根本原因

[复制链接]

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

发表于 2020-6-23 15:52:24 | 显示全部楼层 |阅读模式
本帖最后由 XCray 于 2021-6-4 18:17 编辑

0、背景

前段时间,就看到好几位朋友说用esp8266接蓝牙网关的ttl、把串口消息转换成mqtt发给ha的时候,经常会出现丢失消息的现象。

当时,我是在用树莓派3B+/NanoPi R2S跑python脚本完成同样的任务(我自己写的脚本,详见之前的帖子),特意分析确信没有丢消息的问题,还有那么一点点幸灾乐祸地说esp8266丢消息很可能是性能不足的原因(硬件性能不足、或者软件没有优化好)。

我分析的思路很简单:在我的使用场景里,榉树门锁平均每71秒会发送一条门状态报告(eid 4110),我在脚本里打印出每次收到这个消息的时间,分析相邻两次的时间间隔就可以发现是否有丢失。
20210604注:实际上门锁发出蓝牙广播信息的间隔更短,大概4秒~26秒,只是蓝牙网关每71秒左右才向服务器发出一次报告。
当时,曾经观察过连续两天的记录,这个间隔的最小值是60秒、最大值是90秒、平均71.1秒。(后来小米服务器上做了修改,虽然蓝牙门锁发出这个消息的时间间隔没变,但服务器对这个消息改为每6条处理一条,是的TTL接口看到相应消息的间隔变成了原来的6倍,约426秒——20210604注:没有详细分析,不确定是网关发的少了还是服务器处理的少了)

这是根据这个思路用excel做的图,一看便知:
raspi.png

虽然树莓派/NanoPi跑这个脚本没啥问题,但人家5块钱的模块就能搞定的事情,我用一个200多块钱的板子,实在浪费啊。再说,娇小的esp模块可以塞到蓝牙网关盒子里头,怎么着都是很大的吸引力啊。

于是,我购买了ESP-01S模块,自己改写的killadm大神的代码、自己编译烧写,然后把模块塞到了蓝牙网关里头。

于是,我也碰到了丢消息的现象。虽然不多,但确确实实的发生了。

于是,处女座理工男心理大爆发——这怎么能行呢??!!!

于是,开始寻找原因和解决方法。

1、打脸的试验

首先怀疑是性能问题——其实之前我也无法确信这一点,现在则是基本排除了这一点!

查看官方文档和搜索“esp8266 性能”,结论是性能绝对不会成为这个小应用的瓶颈。

有人做过测试,串口转wifi,连续长时间数据传输,速率可以高达1Mbps以上,且没有丢包现象。这里仅仅是115200的连接、并且大部分时间里是没有数据传输的,按说esp8266的性能处理这个需求应该是绰绰有余才对。

既然怀疑到了性能,那就先把esp8266的性能潜力都发挥出来看看。很自然地,想到了这个芯片可以超频到160MHz运行(默认80MHz)。

超频很简单,由于代码里集成了RemoteDebug,telnet登录之后,运行cpu160命令即可(这个也是这几天刚学到的技能,真的很好用)。

超频了,自然也就担心会不会发热,虽然是5块钱的小玩意儿,就这么轻易地烧坏喽也于心不忍啊,于是,把蓝牙网关的盒子盖板扣掉,露出模块和电路板,放到了群晖的屁股后面——反正群晖的风扇一直在转,顺便给散散热。

这是昨天晚上9点30左右的事情。

观察分析方法呢?依然是利用门锁周期性发送的状态报告——只要相邻两次状态报告间隔的时间没问题,我就可以相信没有丢消息。

正好,利用上刚刚学会的Node-Red技能,每次收到状态报告后,计算出离上次报告的时间间隔,然后以传感器状态的形式传递到ha,这样就可以在ha里直观地进行分析了。这是node-red的流:
hasensor.png

就这样,esp8266运行在160MHz、享受着群晖散热风扇的徐徐凉风,勤勤恳恳无怨无悔地跑了一晚上。早晨起来一看,状态很好嘛!
cpu160fan.png
时间间隔最低60秒、最高88秒,一晚上没有任何异常!

似乎印证了之前性能不足的怀疑?那再把频率调回80MHz看看(telnet 后 cpu80,这个动作是早上6:38左右完成的,对应下图中的蓝线)。
cpu80fan.png

是的,你应该听到了我打脸的声音!

改回80MHz之后,又继续观察了5个多小时,没有任何能看得出来的变化!

也就是说,80MHz的性能,对于转发115200速率的TTL消息这么一个简单的任务来说是足够的。

可是,之前确实看到了丢失消息的现象,两次报告的时间间隔也曾经很长(当时没有截图、也没有留下数据,我记得最大值曾高达200多秒,130多秒很常见)。

那到底是什么原因呢?

2、猜测、验证和结论

想想之前丢数据时的状态和现在不丢数据的状态,最大的差异是现在蓝牙网关的盒盖是拿掉了的、也有个风扇在吹。

难道是发热(散热不够)造成的?这么个小芯片,厂家连散热片都不舍得装(各种文档都强调低功耗和很高的工作温度范围),会因为散热不良出这种问题?

不管怎样,试试还是可以试试的。

中午12:00,把蓝牙网关(带着esp01s模块)从群晖屁股后面拿开、盖上原来的盒盖。然后,睡个午觉先。

睡醒后一看,意外又不意外地,猜测得到了验证,丢消息的现象又回来了,状态报告时间间隔明显增加,最高到了130多秒——可以相信,肯定丢了一条消息。
cpu80nofan.png

放大来看看:
overall.png
中间下面的那条线,是我把CPU主频从160M降回80M的时间,前后没有变化。右边上面那条线,是从风扇后面拿开扣回盒盖的时间,之后明显抬升。

这个偏长的时间间隔,我之前在树莓派/NanoPi上的python脚本性能不佳时也曾经观察到过。当时由于串口接收方法不好,会导致一个cpu内核100%占用,这个时间间隔也经常到200~300秒。

3、后续

发完帖子之后,我再把蓝牙网关盒盖扣掉、放到群晖屁股后面吹风去。

就这么已经连续使用一个多月,期间也多次更换固件,但从消息间隔来看,一直处于良好状态。

至此,明确了这个结论:esp8266也需要散热!!!

评分

参与人数 1金钱 +12 收起 理由
咸味土豆 + 12 在下对你的景仰犹如滔滔长江之水,连绵不绝.

查看全部评分

回复

使用道具 举报

14

主题

155

帖子

1153

积分

论坛DIY达人

积分
1153
金钱
988
HASS币
40
发表于 2020-6-23 16:11:56 | 显示全部楼层
楼主看看时延大的时候是不是esp8266的wifi连接掉线重连,我家的esp8266也会时不时的出问题
简单点你可以看下mqtt的log有没有同一个id重复连接的消息
回复

使用道具 举报

106

主题

551

帖子

2793

积分

金牌会员

Rank: 6Rank: 6

积分
2793
金钱
2242
HASS币
20
发表于 2020-6-23 16:18:01 | 显示全部楼层
楼主的运维能力赞
像楼上说的,会不会是蓝牙和WIFI互相干扰了
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-6-23 16:20:36 | 显示全部楼层
koranayle 发表于 2020-6-23 16:11
楼主看看时延大的时候是不是esp8266的wifi连接掉线重连,我家的esp8266也会时不时的出问题
简单点你可以看 ...
看下mqtt的log有没有同一个id重复连接的消息

这个好像不行吧?没地方看啊?

我现在用的是小米路由器,反正小米的路由器app上显示的这个esp8266的最后一次联网的时间是前天,当时改代码重刷固件来着。后来应该就没有再断开重连过。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-6-23 16:26:50 | 显示全部楼层
comeon_000 发表于 2020-6-23 16:18
楼主的运维能力赞
像楼上说的,会不会是蓝牙和WIFI互相干扰了

蓝牙和WiFi互相干扰的可能性一直存在、也一直没有变化,所以我觉得可以排除这一点。

另外,小米开发蓝牙网关的时候应该会考虑到这个干扰的问题吧?

现在回想,刚从树莓派迁移到esp8266的时候,也没有观察到丢消息现象,应该是那时候模块都是露在外面、没有盖上盒盖、散热不成问题的原因。

后来觉得代码基本稳定可以长时间运行了,就把盖子盖上了,于是就发现了丢消息的现象。
回复

使用道具 举报

14

主题

155

帖子

1153

积分

论坛DIY达人

积分
1153
金钱
988
HASS币
40
发表于 2020-6-23 16:27:15 | 显示全部楼层
XCray 发表于 2020-6-23 16:20
这个好像不行吧?没地方看啊?

我现在用的是小米路由器,反正小米的路由器app上显示的这个esp8266的最 ...

路由器里看不到重连的,我是通过esp8266打印看到的wifi在重连
我在mosquitto的log里也能看到几个esp8266经常重新连接,但是比较玄学,有的时候是几个小时密集出现,有的时候几个小时没问题,已经懒得折腾了

以前发过一个帖子,当时用tp路由器改一下esp8266的2.4g模式就好了,现在用k3root仍然会出问题,回头我也试试拿个风扇吹一吹
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-6-23 16:33:46 | 显示全部楼层
koranayle 发表于 2020-6-23 16:27
路由器里看不到重连的,我是通过esp8266打印看到的wifi在重连
我在mosquitto的log里也能看到几个esp8266 ...

懂你刚才说的意思了,谢谢!又学会一招。

我刚才特意看了看mosquitto的日志,自从上次重刷esp8266的固件重启之后,没有其他重新连接的记录。
回复

使用道具 举报

14

主题

155

帖子

1153

积分

论坛DIY达人

积分
1153
金钱
988
HASS币
40
发表于 2020-6-23 16:42:07 | 显示全部楼层
XCray 发表于 2020-6-23 16:33
懂你刚才说的意思了,谢谢!又学会一招。

我刚才特意看了看mosquitto的日志,自从上次重刷esp8266的固件 ...

我刚想起来因为我之前被这种问题困惑好久,在代码里加了个逻辑,wifi连接成功后会重连一下mqtt,不知道楼主的代码或者固件有没有这逻辑,楼主有条件的话可以在大循环里加个轮询wifi状态,然后连着打印试一试
我发现esp8266在掉线后会自己重连,这些情况一般感受不到


bool WiFi::isConnected()
{
  if(WiFi.status() != WL_CONNECTED)
  {
    webDebugln("INFO: no wifi connection!!");
    return false;
  }

  return true;
}
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12119
金钱
9100
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2020-6-23 16:55:07 | 显示全部楼层
koranayle 发表于 2020-6-23 16:42
我刚想起来因为我之前被这种问题困惑好久,在代码里加了个逻辑,wifi连接成功后会重连一下mqtt,不知道楼 ...

我的代码是拿killadm大神的LOCK2MQTT改的,wifi部分能精简的都被我精简掉了,不过还保留着mqtt连接的监控、断开后重连、连接成功后pub消息“alive”的逻辑。

结合mosquitto的日志,可以相信没有发生mqtt连接断开的情况,也可以间接相信wifi没有断开过。

另外,我一直依赖每分钟一次的门锁状态报告,只要能正常收到这个报告,我就简单的推断一切正常。虽然不够严谨,但差不多也够了。
回复

使用道具 举报

40

主题

2178

帖子

8336

积分

元老级技术达人

积分
8336
金钱
6143
HASS币
110
发表于 2020-6-23 17:52:17 | 显示全部楼层
LZNB  我有动力换网关了
ESP01是不是那个没屏蔽罩的?屏蔽罩如果能贴着片子也能成为散热  可能会好一些?  可以换nodemcu试试?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-12-25 13:45 , Processed in 0.137904 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表