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

 找回密码
 立即注册
查看: 5000|回复: 6

【补课】魅族蓝牙温湿度遥控器 通讯协议及魅家app行为分析:

[复制链接]

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

发表于 2021-10-3 12:03:36 | 显示全部楼层 |阅读模式
本帖最后由 XCray 于 2021-10-3 17:44 编辑

赶上了站长最后一趟魅族遥控器的车,没有加过之前大佬们研究这个东西的群,论坛里也没有大佬详细描述这个东西的工作过程。
虽然从几个开源项目的代码中可以看出主要的环节,但总觉不足。于是本着学习ble_client的目的下载了官方的iOS和安卓版魅家app,并在安卓上抓包。折腾了一通,还是有些有意思的发现的。

先说对这个东西比较负面的评价:
- 存在较为严重的安全漏洞。就是app或其他蓝牙主机操纵它不需要任何授权,只要在蓝牙通讯范围内就可以。
  想想,如果你家邻居恰好有一个喜欢恶作剧又恰好也玩这些东西的家伙,他可以随随便便连上你的遥控器,乱发一通红外指令,如果他恰好又知道你家的受控电器,那么你的操控权也就旁落了。
  退一步,即便不担心电器受他人控制,这东西发红外指令可是非常耗电的,小小的纽扣电池用不了多久就被折腾光了。  好在这玩意儿信号不太好,通讯距离较短(此时竟成了安全保障)!
- 温湿度和电量传感器没有使用更简洁的广播模式(比较合理的是合理时长的周期性广播+变化超过一定幅度的及时性广播),而是要求客户端先连接、发出读取指令后才能获取数据。也算是反人类的思路了。

然后官方app设计也有槽点:
- 过度频繁且连续地发出指令读取温湿度和电量,差不多每秒1次,达到了丧心病狂的程度!
  虽然读取传感器数据比起发射红外指令来说耗电可以忽略不计,但对于温湿度电量有必要这么频繁吗?
- 安卓版提供了学习功能,ios版没有,说是以后升级提供,然后就没有然后了!

虽然这东西现在很超值(站长给力),但品质确实对不起当初的官方售价129。怪不得魅族做不下去早早的放弃了!

再说说比较正面的评价,魅族的设计人员也算是动了不少心思,总的来说这个东西也称得上小巧可爱,也算得上实用。
- 最大的亮点:有个节能模式!可惜的是各位大神的开源代码都没有涉及这个很有价值的功能。
  基本原理就是机体上设计了4个红外发射二极管(中右上左,分别编号1234),默认非节能模式会4个全发。而实际上一般控制某个电器时只需要1个发射就可以了,其他方向的发射只是白白的耗电。(App上文字说明可以使用1~2个,但实际上只能用1个)。
  官方app可以针对每个受控电器测试确定相应的一个二极管(其实根据拜访位置就可以确定),在控制该电器时其他的二极管就不再参与发射了。如此确实可以大幅度减少耗电。
  实际抓包发现节能模式下发射的指令数量和长度(只有1条13字节)确实远少于非节能模式(共8条140字节)!

功能补充说明,除了已经广为人知且使用最简单成熟的电量和温湿度传感器、以及还有待进一步完善的红外发射和学习功能之外,还有个有趣的小功能:
- 通过蓝牙指令改名。
  具体就是:写入改名指令,格式:55-LN-SN-1a-xxxxxxxx,其中LN为长度、SN为序号、xxxxxx为名称编码,最大16字节。

~~~~~~~~~~~~结论~~~~~~~~~~
分析这些的目的是为了学习开发一个最理想的esp32网关固件(可惜自己代码能力太差力不从心)。

在尝试各开源项目之后(加上自己对esphome和ha等的了解),我现在觉得这个固件的实现思路应该是这样的(全功能且尽量简单):

- 基于 mqtt 协议,包括发布数据和接收指令
- 无需提前绑定、无需工作中屏蔽失联子设备,只要在连接前可以收到其广播信息就可以,收不到广播信息直接报错跳过即可
- 连接后直接注册通知,每个动作只需发出写请求即可,数据处理都由通知处理函数搞定
- 温湿度电量只能轮询,无需mqtt指令,其中电量轮询周期应该更长(每天两三次就够了)
- 摒弃耗资源的web界面,通过mqtt完成配置修改(其实只需要一个子设备清单即可)
- 红外发射指令除了代码,还应包括子设备以及红外发光管编号(节能模式,根据摆放位置就可以确定最佳发光管)
- 红外学习指令,指定具体子设备

仅仅还是思路,啥时候能实现就不知道了



回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-10-3 12:03:49 | 显示全部楼层

蓝牙通讯手册

本帖最后由 XCray 于 2021-10-6 11:47 编辑

所有的交互都针对 service16f0/char16f2 进行,该char的权限是:读、写、通知;基本过程:注册通知、写出指令、收取通知;
指令格式:0x55LNSNCC,其中:
   - LN为消息长度(总长度-1);
   - SN为序号,每次交互+1;
   - CC为命令:
     - 11为温湿度、发出后会收到通知:5507SN11TTHH(TT为温度HH为湿度)
     - 10为电量、通知:5504SN10VV,VV即电池电压
     - 1a为改名(后跟名称最长16字节)、通知:5503SN1b
     - 18不知道啥意思、通知550bSN19xxxxxx,后面8个字节不知什么意思
     - 03为发射红外(后跟key)、通知5504SN0400
     - 00为传送key以及红外代码(03之后,多条)、通知5503SN02
     - 05为红外学码、
红外发射和学习过程更复杂(待总结),其中发射又有节能和非节能两种情况。
节能模式下每次发射只需写出一条指令:55LNSN03 5000EE xxxxx,其中EE为发光管编号(00中04右08上10左),发出后会收到通知5504SN0401
回复

使用道具 举报

24

主题

884

帖子

5055

积分

论坛元老

Rank: 8Rank: 8

积分
5055
金钱
4166
HASS币
20
发表于 2021-10-3 13:20:22 来自手机 | 显示全部楼层
记得我以前也试过不用验证随便连上了邻居的小米蓝牙音箱(好像回音壁之类的),试下能控制放歌后就断开没有恶意操作了,当时想要是半夜播放点不可告人的视频,那户邻居得有多恶心。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-10-3 17:45:49 | 显示全部楼层
chenquanhao 发表于 2021-10-3 13:20
记得我以前也试过不用验证随便连上了邻居的小米蓝牙音箱(好像回音壁之类的),试下能控制放歌后就断开没有 ...

小米还出过这么不靠谱的东西?!
回复

使用道具 举报

20

主题

550

帖子

3603

积分

元老级技术达人

积分
3603
金钱
3013
HASS币
210

教程狂人突出贡献

发表于 2021-10-6 00:35:58 | 显示全部楼层
本帖最后由 involute 于 2021-10-6 00:37 编辑

我做的那个网关已开源,供你参考

https://github.com/georgezhao2010/esp32_meizu_remoter_gateway
是用ESP-IDF写的,比arduino的啰嗦一些。
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

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

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

 楼主| 发表于 2021-10-6 07:06:47 | 显示全部楼层
本帖最后由 XCray 于 2021-10-6 08:10 编辑

感谢!我试着学习了一下,发现基本看不懂esp-idf太陌生了
回复

使用道具 举报

6

主题

243

帖子

1864

积分

金牌会员

Rank: 6Rank: 6

积分
1864
金钱
1621
HASS币
0
发表于 2021-10-13 20:34:48 | 显示全部楼层
involute 发表于 2021-10-6 00:35
我做的那个网关已开源,供你参考

https://github.com/georgezhao2010/esp32_meizu_remoter_gateway

真好,我正想学着把家里蓝牙的传感器,发送到mqtt给ha,git下学习下。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-27 15:33 , Processed in 1.132782 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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