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

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

[修仙教程] 搞不清楚蓝牙设备该怎么玩?我来一贴尝试解决所有问题!

  [复制链接]

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

发表于 2021-6-17 08:36:44 | 显示全部楼层 |阅读模式
本帖最后由 XCray 于 2021-10-1 06:38 编辑

注:本贴的思路不仅适用于小米系的蓝牙设备,其他品牌也都跳不出这个圈圈。

随着小米毫无廉耻地全面转向蓝牙,由于产品的多样性和成熟度不佳(曾经),单单蓝牙网关就丧心病狂地搞了100多种,给无数的智能家居玩家造成了极大的困扰和麻烦,就连小米自家的客服人员都被搞得稀里糊涂。

不过因为小米以及生态链企业推出得各种蓝牙子设备性价比还是不错的,所以各路大神为了实现HA对这些设备的接入,开发了很多种各式各样的接入插件,给大家带来丰富选择的同时,也让很多不太钻研基理的大白小白们犯了难、甚至犯了错。

我自己呢,也曾经疑惑、愤怒、各种尝试、到处找文章帖子、甚而至于自己怼代码,目的就是和大家一样——实现对这些设备的本地、无时延接入和联动。幸而有所收获,也发过多个帖子回馈论坛。不过因为都是在学习尝试过程中写的,每个帖子都只能针对部分具体问题或具体用例,估计很多白白看起来比较糊涂。

看到论坛里不断有人问一些已经讨论过很多次、并且已经有了很好的答案的问题,感觉有必要完整的梳理一下了。大家有任何关于HA和蓝牙方面的问题,欢迎跟帖讨论。

注:本贴不涉及ble mesh,因为我还没用过ble mesh的东西,也没兴趣买
- 目前已有的蓝牙子设备接入方法
先借用小米官网的一个图片来说明几种接入方法的基本原理(简称基理):
mi.png

1. 云端接入,有插件作者为了追求将所有的蓝牙设备接入,实现了这个鸡肋——对不起,没有对作者们不敬,只是这种接入方式真的是鸡肋,仅仅是能接入了而已,时延可以大到怀疑人生的地步。

2. 本地从蓝牙网关获取数据,我之前花了很多精力、已经使用了很长时间的针对普通蓝牙网关的 TTL 方案(2.1),以及现在很火的基于多模网关的XG3插件(2.2),都是这一类。两种方案虽然都是在本地完成,但前者受限于普通蓝牙网关,在效果上无法完全达到本地接入0时延的目的。

3. 直接在空中接收蓝牙子设备发出的广播数据。我前一段时间弄出来的利用 ESP32 直接接收解密蓝牙门锁消息并接入HA(3.1),以及 esphome 的xiaomi_ble(3.2)、passive ble monitor (3.3)等各种ble sensors方案都是这一类。显然,这类方案要求必须有蓝牙模块以完成接收的功能,可以是HA主机上的蓝牙模块,也可以是外置的树莓派等各种派、esp32,甚至普通的带蓝牙的各种windows或linux主机。

4. 最强大的、直接连接蓝牙设备,可以实现直接操作蓝牙子设备的功能,比如HA、Siri操作直接开锁。这个和第3类是有本质区别的。esphome新版本增加的ble client就是这种模式。
这个方式目前还非常少,但潜力无疑是非常大的。当前可用的有OpenMQTTGateway(适用于部分小米系设备)和ESPHome的 BLE Client
站长发车搞的那个魅族温湿度+红外,就是这种模式的典型应用。同样思路甚至代码,可以稍加改造后用于小米系设备。

显然,第1类方案最简单、也最没用,有米家账号即可,不做更多讨论。

第2类的两种方案都已经很成熟,根据自己的网关类型选择即可。

第3类需要关注的是不同的蓝牙子设备有不同的要求,有些比如花花草草啥的很简单,广播数据是明文,直接接收即可。有些比如蓝牙温湿度计2和各种门锁,发出的广播数据是加密的,需要利用 bindkey/beaconkey(密钥) 来解密。

这就涉及获取bindkey/beaconkey的问题。获取方法也有好几种,其中最愚蠢(风险最大)的就是下载改版的米家app,最麻烦的是几种抓包的方法,而最好的是利用几种开源工具,都可以很方便的获取到部分加密蓝牙子设备的密钥。
而蓝牙门锁的密钥是最麻烦的,目前知道的是创米小白万能遥控器的TTL和多模网关的日志这两种途径,改版app或抓包应该也可以得到但我没有实际验证过。

第4类?想想就很厉害。。。什么?你说可能不安全?没错,越强大越方便也就意味着安全风险越大。

这类当前讨论很少,也是实现起来最麻烦最难的,近期我打算花点时间尝试尝试。

评分

参与人数 4金钱 +38 收起 理由
lzyy1992 + 2 我来瀚思就为看你!
kleinsoul + 8 厉害了word楼主!
z741554038 + 8 我觉得这篇文需要长期置顶,有索引的性质,.
natic + 20 论坛有你更精彩!

查看全部评分

回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2024-5-15 20:21:40 | 显示全部楼层
当前HA内置的Xiaomi BLE组件已经足够完美,支持几乎所有米家标准的蓝牙设备,对应的是主贴所述第3种,纯本地操作,安全、时延性能都最佳。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-6-17 08:36:54 | 显示全部楼层

链接汇总(最终的成果类的链接,不含初期大神们的探索)

本帖最后由 XCray 于 2024-5-15 20:31 编辑

第2类:从蓝牙网关获取数据
2.1 通过普通蓝牙网关TTL接口获取数据
2.1.1 n大的,用 ESPHome 实现了 mqttl:https://bbs.hassbian.com/thread-11351-1-1.html
2.1.2 我的,也是使用 ESPHome 实现的,在n大基础上改了改代码,这也是我最终长期使用的方案:https://bbs.hassbian.com/thread-10250-1-1.html
        附:我之前用arduino ide编译的方案,其中有各种蓝牙子设备的yaml配置,无缝配合2.1.2的代码。

2.2 直接从多模网关获取数据:
著名的 xg3 插件,坛里介绍的帖子很多,感觉这几个帖子更好一些:重磅, 小米多模网关全系列固件破解telnet, 免拆机多模网关成功接入HA,可以用于生产环境,更建议大家到最大同性交友平台上去直接看原文
  其实,不用安装 HACS,直接解压到custom_components目录下就行;
  其实,也不必刷入改版固件,官方固件就很好,包括最新版的;改版固件毕竟安全方面是个问号;


第3类:直接在空中接收蓝牙广播消息
3.1 我的,基于esphome,仅针对蓝牙门锁,我是针对榉树K1写的,其他型号需要修改补充代码:https://bbs.hassbian.com/thread-12843-1-1.html ,当然,需要esp32模块
3.2 esphome,针对其他蓝牙子设备,官方提供的就非常好:Xiaomi Mijia BLE Sensors — ESPHome ,当然,需要esp32模块
3.3 passive ble monitor,也有不少帖子,比如:米家蓝牙温湿度计2接入HA,github上已发布最新版 -,我自己没用过,理论上任何有蓝牙的主机都可以使用这个思路
3.4 最棒的——HA内置的Xiaomi BLE组件,2022.8版本增加的,支持绝大多数米家蓝牙器件(可惜的是我用的榉树门锁还是不行)。搭配esphome的蓝牙代理功能,简直不要更完美。

回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-6-17 08:37:03 | 显示全部楼层

第4类:最强大、讨论最少、实现难度很大,近期打算攻攻坚

本帖最后由 XCray 于 2021-9-30 20:49 编辑

远期目标:用 esp32 实现米家app扩展程序的功能,直接连接蓝牙子设备完成开锁之类的操作(当然,只限于那些可连接的子设备;是的,很多子设备是不可连接的,它们只是发射广播信号)。

这样,实现HA、Siri 远程开锁也就水到渠成了。

参考:

- 现在 esphome 有 ble client 功能,但只有读的能力,无法用于发出指令。也许以后会增加写的能力。

- junnikokuki大神的Meizu-BLE-Thermometer,其底层代码已经具备了完整的ble client功能,当前仅被用于魅族,也算是很大的浪费了。

- OpenMQTTGateway,已经实现了花花草草、温湿度2、MHO-C401。比esphome好的地方是通过分时实现了广播和连接(也就是本贴的3和4两种模式)的并存。

~~~~~~~~~算不上进展的进展~~~~~~~~~~
对蓝牙门锁(榉树)手机开锁进行了蓝牙抓包,初步判定开锁指令是分4次写入fe95:0016(service:characteristic)的一条64字节的数据,每次开锁当然这条数据都不一样。
现在还不知道这条指令是如何构建的,只是猜测肯定是加密的,希望加密算法和广播数据一致。





回复

使用道具 举报

0

主题

6

帖子

1250

积分

金牌会员

Rank: 6Rank: 6

积分
1250
金钱
1244
HASS币
0
发表于 2021-6-17 08:50:18 | 显示全部楼层
坐等大佬更新
回复

使用道具 举报

42

主题

522

帖子

2945

积分

金牌会员

Rank: 6Rank: 6

积分
2945
金钱
2423
HASS币
10
发表于 2021-6-17 09:47:26 | 显示全部楼层
MARK一下,期待学习
回复

使用道具 举报

43

主题

412

帖子

3806

积分

元老级技术达人

积分
3806
金钱
3389
HASS币
136
发表于 2021-6-17 09:56:40 | 显示全部楼层
占座,等待观摩学习
回复

使用道具 举报

10

主题

680

帖子

5652

积分

论坛元老

Rank: 8Rank: 8

积分
5652
金钱
4967
HASS币
50
发表于 2021-6-17 09:59:10 来自手机 | 显示全部楼层
赶上直播了?
回复

使用道具 举报

4

主题

259

帖子

2267

积分

金牌会员

Rank: 6Rank: 6

积分
2267
金钱
2008
HASS币
0
发表于 2021-6-17 10:09:26 | 显示全部楼层
楼主无私奉献的精神值得学习
回复

使用道具 举报

4

主题

342

帖子

2694

积分

金牌会员

Rank: 6Rank: 6

积分
2694
金钱
2352
HASS币
0
发表于 2021-6-17 10:13:31 | 显示全部楼层
目前我就用两个办法,一个Passive BLE monitor,另一个通过多模,不知道是否还有其它办法
回复

使用道具 举报

1

主题

45

帖子

767

积分

高级会员

Rank: 4

积分
767
金钱
722
HASS币
0
发表于 2021-6-17 10:32:51 | 显示全部楼层
自己之前折腾过OJJ X1智能锁,按照mibeacon的说明文档
正常状态的service data: "5840fc03c12d3837a7fafc3ea5b482c0336a086cb5c2"
5840Frame Control
fc03Product ID
c1Frame Counter
2d3837a7fafcMAC Address
3ea5b482c0336a086cb5c2加密数据
开门状态的service data: "4840fc03a6eac3e7a81407f0ed151451d6167be5d50828ce"
4840Frame Control
fc03Product ID
a6eac3e7a81407f0ed151451d6167be5d50828ce加密数据
目前是用esp32获取Frame Control判断开门状态,但一直解不开加密数据。想知道要解密必须要通过网关吗?我的门锁没有连到网关,门锁理论上也获取不到云端下发的beaconkey吧?求教
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 02:48 , Processed in 0.504843 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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