请选择 进入手机版 | 继续访问电脑版

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

 找回密码
 立即注册
查看: 441|回复: 13

[技术探讨] 【难题求解】ESPHome+ESP32打造通用蓝牙网关,基本可用但有坑~

[复制链接]

72

主题

1832

帖子

7014

积分

超级版主

Rank: 8Rank: 8

积分
7014
金钱
5117
HASS币
380

教程狂人突出贡献

发表于 2022-5-8 21:22:39 | 显示全部楼层 |阅读模式
玩ESPHome已经一年多了,碰到了很多问题,有的解决了,有的放弃了,有的耿耿于怀至今。。。

简单小结一下蓝牙通用网关,顺便把至今没有找到的答案的难题梳理一下,期待有大佬能给指点迷津

其实说通用有一点点夸张哈,只是把我手上有的、使用蓝牙广播的设备都实现接入,基于ble_client的还没想好怎么弄

现在在用的设备可以分为两类:

1. ESPHome内置组件,根据文档直接在yaml里面配置即可:
- 花花草草传感器
- 蓝牙温湿度计2
2. 自制组件(把ESPHome内置组件拿来修改),把代码保存至指定目录后与前面的设备一起在yaml里配置,即一个esp32即可:
- 榉树门锁
- yeelight调光开关
- 云麦好轻体脂秤
- 云米燃气灶
这几个代码之前已经发过帖子,感兴趣的找来看吧。

~~~~~~~~~~~~~~~~~~~~~~~~~
重点说说一直没解决好的难题,就是广播扫描参数的设置问题。试过多种设置,总会偶尔发生收不到设备发出的广播消息的现象

其它设备都还好,或者说偶尔丢一次消息无所谓,最关心的是蓝牙门锁,一次也不想错过。

错过门锁广播消息的现象,大概十几天能观察到一次,而同时在用小米的蓝牙网关却每次都能收到。

这几个组件都是基于 esp32_ble_tracker 的,反复阅读官方文档以及其中提到的TI的文档,可能影响的参数就两个:
扫描间隔和扫描窗口

esphome默认的设置分别时320ms和30ms,丢消息的现象比较明显;目前我在用的是160/120ms,有明显改善,但仍然会丢。

一个极端的想法是把扫描窗口设置为和扫描间隔一样大,但必须把网络连接方式改成以太网,难度太大。

如果继续使用WiFi,那么注定扫描窗口就必须小于扫描间隔(必须为WiFi预留出必要的时间),也就意味着这个简单的思路总会有错过蓝牙广播消息的可能。

小米自己的网关也是用的WiFi,它是怎么设置能够做到不错过广播消息的呢?一直也没有看到有具体的说明,小米设备蓝牙广播的参数设置也没看到过说明

那么我们应该怎么设置才好呢?耗电的事情都可以完全忽视,只求不错过广播消息!
~~~~~~~~~~~~~~~~
根据TI的文档(详见),简单描述一下技术背景:

广播发送设备可以设置使用1~3各广播信道、也可以设置广播间隔(20ms~10.24s),每次在一个信道上的广播最多需要10ms:

                               
登录/注册后可看大图

而广播接收侧不能选择信道,必须3个信道顺序扫描:

                               
登录/注册后可看大图


回复

使用道具 举报

6

主题

8

帖子

70

积分

注册会员

Rank: 2

积分
70
金钱
62
HASS币
0
发表于 2022-5-8 23:52:03 来自手机 | 显示全部楼层
请善用论坛的搜索功能,你的求助一搜就有答案。  可参考下以下这贴:https://bbs.hassbian.com/forum.php?mod=viewthread&tid=16331&highlight=esp32&mobile=2
回复

使用道具 举报

72

主题

1832

帖子

7014

积分

超级版主

Rank: 8Rank: 8

积分
7014
金钱
5117
HASS币
380

教程狂人突出贡献

 楼主| 发表于 7 天前 来自手机 | 显示全部楼层
本帖最后由 XCray 于 2022-5-9 10:12 编辑
Brewer 发表于 2022-5-8 23:52
请善用论坛的搜索功能,你的求助一搜就有答案。  可参考下以下这贴:https://bbs.hassbian.com/forum.php?m ...

我去!你还真是个大聪明呀!!
说真的,我非常羡慕你的这种自信!!!

不是我要嘲讽你,你连我的问题是啥都没看就一副教训的语气告诉我“答案”,那个帖子我不但早就看过而且早就回过,和我的问题没啥关系好不好?

而且不客气地说,无论是对于论坛的熟悉程度、对搜索功能的使用、对蓝牙/esp32等等相关基础知识的学习,我感觉你哪一方面都没有教训人的资格。

友好讨论固然欢迎,但你这种回复看着真有点反胃。

回复

使用道具 举报

72

主题

1832

帖子

7014

积分

超级版主

Rank: 8Rank: 8

积分
7014
金钱
5117
HASS币
380

教程狂人突出贡献

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 XCray 于 2022-5-9 07:25 编辑

TI的文档中有一段有些参考价值:
Optimizing Scanning: How to get data fast?
In a time-constrained application, when the user needs to receive the data as fast as possible, make sure that scanning window is more than the advertising interval + 10ms to guarantee discovery. (The 10 ms extra account for the 0 ms to 10 ms of pseudo-random delay in between each advertising event, assuming no interference.) Following this rule will increase the chance of receiving the advertising packet on the first scan.

就是扫描窗口要大于发射间隔再加10ms,问题是找不到小米关于广播间隔的说明呀!
回复

使用道具 举报

21

主题

1586

帖子

5260

积分

论坛元老

Rank: 8Rank: 8

积分
5260
金钱
3664
HASS币
80
发表于 7 天前 | 显示全部楼层
XCray 发表于 2022-5-9 06:43
TI的文档中有一段有些参考价值:
就是扫描窗口要大于发射间隔再加10ms,问题是找不到小米关于广播间隔的说 ...

不是很懂
来个不负责的猜测:
小米门锁会强制在扫描窗口发送报文
网关和门锁肯定有授时报文(门锁的远程设置密码就是根据时间来的,指定时间内有有效期)
如果两端能保证时间一致(就算差个几ms)
那么就可以做到门锁在扫描窗口发送报文
回复

使用道具 举报

72

主题

1832

帖子

7014

积分

超级版主

Rank: 8Rank: 8

积分
7014
金钱
5117
HASS币
380

教程狂人突出贡献

 楼主| 发表于 7 天前 | 显示全部楼层
ghostist 发表于 2022-5-9 08:39
不是很懂
来个不负责的猜测:
小米门锁会强制在扫描窗口发送报文

你把它想的太好了

网关和门锁没有授时机制,甚至网关里根本没有时钟(它当然有晶振但不知道年月日时分秒)。远程临时密码是半小时有效的,对时钟同步的要求很低,并且只是是根据固定算法生成的。

手机app倒是可以校准门锁内的时钟。

让门锁主动在网关的扫描窗口发送报文,这个可以肯定是不可能的
回复

使用道具 举报

14

主题

42

帖子

1265

积分

论坛技术达人

积分
1265
金钱
1213
HASS币
50
发表于 7 天前 来自手机 | 显示全部楼层
本帖最后由 ryanh7 于 2022-5-9 13:01 编辑

重发次数和重发间隔定义在小米蓝牙模组,sdk或者基于esp32的蓝牙网关的固件总得搞到一个,或许能从里面提取到参数
回复

使用道具 举报

11

主题

183

帖子

853

积分

高级会员

Rank: 4

积分
853
金钱
665
HASS币
70
发表于 7 天前 | 显示全部楼层
很难了,你这个配置已经接近极限了,除非单独WIFI/蓝牙独立通道, 另外小米用的是ESP32芯片么? 在手机/电脑/笔记本/盒子上可以看看会不会漏(非ESP32芯片). 如果ESP32上要作蓝牙持续扫描,除非禁用wifi.

另外那个duration没有搞懂是啥意思. 和wifi啥关系?
回复

使用道具 举报

72

主题

1832

帖子

7014

积分

超级版主

Rank: 8Rank: 8

积分
7014
金钱
5117
HASS币
380

教程狂人突出贡献

 楼主| 发表于 6 天前 | 显示全部楼层
ryanh7 发表于 2022-5-9 12:59
重发次数和重发间隔定义在小米蓝牙模组,sdk或者基于esp32的蓝牙网关的固件总得搞到一个,或许能从里面提取 ...

逆向难度太大了。

没接触过小米的模组和sdk,现有公开的资料又没有涉及到这么细的细节

不切实际地期待业内人士透露吧。。。
回复

使用道具 举报

72

主题

1832

帖子

7014

积分

超级版主

Rank: 8Rank: 8

积分
7014
金钱
5117
HASS币
380

教程狂人突出贡献

 楼主| 发表于 6 天前 | 显示全部楼层
riceball 发表于 2022-5-9 18:05
很难了,你这个配置已经接近极限了,除非单独WIFI/蓝牙独立通道, 另外小米用的是ESP32芯片么? 在手机/电脑/笔 ...

是的,除非用以太网,否则wifi和蓝牙公用一个天线,总会有空挡无法进行扫描。在和发射侧无法良好匹配的情况下,错失消息在所难免。

小米有多种型号的蓝牙模组,其中也有esp32,可惜搞不到sdk。

在电脑上搞个程序思路倒是不错,可是实现难度好像更大(编程基础太差),另外漏掉消息的现象几率很低,得长期观察才行。

那个duration根据文档,似乎没有任何实际影响,仅用于蓝牙栈的调试,默认5分钟也很长了。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2022-5-16 13:59 , Processed in 0.057752 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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