|
本帖最后由 zxytddd 于 2020-2-16 20:31 编辑
被封在家里,刚好可以折腾一下智能。本着拓展HASS使用场景,丰富论坛技术储备(水一贴)的精神,仔细钻研了家里买的老板厨电的智能设备。
0. 先说一下结果
没能完全解决遇到的所有问题,自然也没能做出hass里使用的custom_component。
但是途中遇到了很多坑,以至于目前还没能全部完美解决。但是明天就开始上班了,没时间继续折腾研究了,所以先将目前得到的结论发帖总结。
一方面是给自己做个记录,另一方面也让论坛里的感兴趣的大神提供思路和方法。
1. 家里的老板厨电
目前家里有2个老板的智能厨电,分别是油烟机 SE638与蒸箱HS906。
本帖讨论的方法理论上适用于所有老板牌的电器。
2. 老板厨电的原生控制原理:
经过对老板厨具的app(ROKI智能烹饪)与油烟机的抓包分析,发现所有的控制都使用MQTT协议。
非常简单的MQTT协议,而且没有使用TLS加密。这也就意味着通过抓包可以获取所有所需的数据包。
每个设备(包括手机与电器)都有一个自己的ClientID,ClientID长度为17字节,前5位为型号,后12位为一个独一无二的字符串。
手机和每个设备之间的通信,都是直接通过MQTT协议进行的。
比如说油烟机的ClientID为:SE638p4E715R4Mo00;手机客户端的ClientID为:RKDRD9zMQZ1I1oym2
那么他们2个之间的通信使用如下方式:
手机->油烟机:
topic: /u/SE638/p4E715R4Mo00
message: RKDRD9zMQZ1I1oym2+消息类型(1字节)+消息内容
油烟机->手机:
topic: /u/RKDRD/9zMQZ1I1oym2
message: SE638p4E715R4Mo00+消息类型(1字节)+消息内容
因此只要知道了消息类型和消息内容的定义,就可以在整个MQTT协议里向电器发送指令了。
经过对手机app的反编译,得到了所有类型的电器的所有的消息类型。
3. 接入HASS
知道了原理,接下来接入HASS就很简单了。一共有以下2个思路:
3.1 模拟手机APP,hass component连接老板mqtt服务器,模拟手机发送mqtt信息
这个方案已经测试成功,但是因为依赖外网,并且需要随时与服务器保持同步,如果以后有固件升级,还要随时追踪老板官方的方案进行更新,因此我没有仔细的写,只是做了个简单的demo。有兴趣的伙伴可以留言,我会把半成品发上来。
3.2 内网DNS劫持MQTT服务器的域名,使厨电连接到局域网内的mqtt服务器上
这样实现真正的局域网控制,彻底断绝未来老板官方更新可能带来的不稳定性与维护成本
本来这个方案在3.1的基础上很好改,但是因为我家里的这个油烟机的MQTT客户端有个bug,导致自己局域网里的mqtt服务器拒绝其连接。所以整个工作暂且搁置。
3.3 暂未解决的bug
油烟机在进行mqtt连接的时候,需要发送2个字段protocol_name 和 protocol_version, 这2个值是需要对应的。
如果是MQTT3.1 则 protocol_name 为 "MQIsdp", protocol_version 为 0x03,
如果是MQTT3.1.1 则 protocol_name 为 "MQTT", protocol_version 为 0x04,
但是油烟机的MQTT Client却偏偏发送的是"MQIsdp"与0x04。因此不匹配,被服务器拒绝。
3.4 bug解决思路
我使用MQTT服务器为docker里搭建的mostuitto-1.6.8。其源码文件handle_connect.c中有一段里写了这个判断的逻辑,只要修改这段代码重新编译即可解决问题。但是对于docker不是很熟悉,不知道如何重新编译docker容器里的程序的源码,所以暂时不知道如何解决。当然更简单的办法是换个不校验这个字段的MQTT服务器,如果哪位大神如果见多识广,还请留言,不胜感激。
4. 总结
虽然问题没能解决,但是本着分享的精神(折腾了一定要水一贴),将目前的结论先发上来。
顺便吐槽一下老板智能的物联网工程师。。。
|
-
评分
-
查看全部评分
|