小米网关2不能焊接



哈勃!在先前的系列中,我:

  • 我从小米那里购买了用于智能家居的设备,并通过电烙铁使这些设备以令人兴奋的方式工作,而无需通过家庭助手提供本机服务器(链接发布
  • 我将家庭助理的Web界面包装在电子版中(链接到该帖子),并支持通知,菜单,点线等(此处的代码

但是随着越来越多的设备出现,奇怪的事情开始出现...

例如,Aqara无线中继2ch(LLKZMK11LM)不支持xiaomi_aqara集成,并且在GitHub上发布Issues时,代码所有者回答说,不更新设备固件就不可能支持此中继。我想:“这里出了什么问题。”然后对代码进行排序,了解代码是如何发生的。因此我不由自主地想到,我首先通过xiaomi_miio(link取消了集成工作以使用继电器,然后为该集成(link实现了对多维数据集和小米按钮的支持,现在我将告诉您原因和方式。

开发人员API


从前,小米发布的网关(lumi.gateway.v3)配备了其开发人员api甚至文档。开发人员API是在端口4321和9898上通过UDP进行通信的东西。社区真的很喜欢这一举动,它响应了很多存储库,将设备集成到了所有可能的存储库中。与该开发人员api的合作构成了家庭助理xiaomi_aqara集成(链接的基础,到目前为止,一切都很棒。

尽管小米没有重写,也没有提供对开发人员api的支持,但新设备的标识符不再出现在其中。所需的中继在通过网关连接到zigbee的设备列表中,但是该中继显示为空的模型标识符,没有该标识符,则无法执行任何操作。然后,就在最近,小米在安装后推出了网关固件更新,如果没有焊铁就无法打开开发人员api(如果在更新之前未打开),则链接

曾经在圣塔芭芭拉的心脏地带,我哭了起来,去订购亚马逊上的德国ZigBee ConBee2加密狗,以在没有网关的情况下使用zigbee设备。但是,在天启条件下的德国人准备发送我的命令的同时,我厌倦了等待,开始更深入地挖掘...

更多本地MIIO协议


Miio是更新的协议,用于与通过wi-fi连接到网络的小米设备配合使用。本地Mi Home应用程序通过此协议与wi-fi套接字,IR Remote,真空吸尘器以及其他所有人,甚至与我的小米网关v2进行通信。这也是UDP协议,但是这次不是端口4321,而是端口54321(我认为选择端口的一种好方法)。我想:“高飞,所以她也知道另一个协议,但是我应该尝试使用这个新协议连接继电器吗?”

miio协议使用令牌对所有消息进行加密,但幸运的是,用于提取令牌和加密/解密的方法已经打开,并且已在多个库中实现了与它们一起使用(链接一次,链接两个我不是第一个使用miio协议集成新设备的人,因此知道了路径,因此我遵循了它。

方法是这样的:

  • 我们通过从日志(链接)或修改后的应用程序(链接)中提取安全令牌设备来获取它们。
  • 我们删除了移动应用程序和设备之间的流量
  • 我们使用开头收到的安全令牌解密UDP数据包
  • 学习代码以创建类似的程序包

我直接从wi-fi路由器获取流量,幸运的是有一个自定义的asuswrt-merlin固件,可以使用Entware安装tcpdump。该实用程序很好,但是它不能理解tcpdump的转储,但是可以理解Wireshark生成的json-dump。为了覆盖从tcpdump到json的二进制转储,我使用了tshark实用程序。之后,我看到了mi home应用程序控制中继的命令,并添加了中继支持(link生成了PR

我取消了ConBee2的订单,因为该软件方法既更快又更有趣...

为什么我们需要铁匠?


因此,这意味着我有些破绽,发现自己处在似乎一切正常的情况下,但是现在在我的家庭助理中,我的Xiamo Gateway 2由两个实体表示,一个实体处于开发人员api协议(xiaomi_aqara集成)下,另一个实体处于miio穿孔(xiaomi_miio集成)下。 。而且我不喜欢焊接,我想简化自己和自己的生活。必须在xiaomi_miio中实现设备的缺失部分。

在大多数情况下,创建软件打包后,这是一项机械工作:

  1. 启用tcpdump
  2. 在我要跟踪的Mi Home应用程序中创建了一个自动化操作
  3. 启动了这种自动化
  4. 解密转储
  5. 从解密复制粘贴到代码
  6. 从控制台发送命令
  7. 文件整理闪耀

但是双手发痒,冒险电话...

假miio设备


验尸表明,miio协议中没有回调机制。传感器每20秒可以拉一次,但是为了正确操作按钮和立方体,每秒对设备进行10次询问是一个坏主意。在这个悖论中,我看到了一个有趣的活动,但是我真的不想处理捕获的数据包的机械编码。

对另一个使用miio协议(链接)的库的研究使我惊讶于核心。作者已经组装了一个收割机,该收割机通过miio协议与该设备进行通信,但是使用developer-api拦截来自多维数据集和按钮的事件。这种方法使我感到非常紧张,导致以下事实:部分功能立即开始起作用,但有一部分需要焊接设备...

再次装备了tcpdump,并在一次运行中用所有设备修改了具有解密功能的解码器,我开始聆听通过网络传输到UDP端口54321的所有内容。我看到了一张相当有趣的图片。当我创建“如果您打开了zigbee多维数据集,请打开wi-fi套接字”之类的自动化程序时,会使用数据字段内的miio协议将json从应用程序发送到网关,而json则以字符串编码。 “ DSL”-斯特里茨认为,出于某种原因,从远古时代开始,每个人都一直在用这种方式打包……详细信息在这里

查看此行的内容表明,对该操作的反应未传递到云端,直接在此json程序中出现了wi-fi套接字的ip地址和加密令牌(此段与第一个系列的段矛盾,我错了;(gate是的,脚本本身类似于家庭助理的自动化,有触发参数,有ip可以发送响应,也就是说,在转储中找不到pub / sub协议。

但是这个想法源于一切从按钮和多维数据集捕获所有必要的事件:

  1. 我们在应用程序中模拟miio设备,响应PING应用程序和来自网关的请求
  2. 我们为网关编写了一个脚本生成器,以便每对生成一个〜(设备,事件)
  3. 我们发送脚本,以便在事件发生时,模拟器发出miio请求

花了几天的时间才意识到这一点,并将其转化为神圣的形式。

目前,python-miio库可以与继电器,多维数据集和按钮link一起使用

仍然需要将此更新附加到家庭助理,并且可以在无需焊接和开发人员api的情况下使用小米网关2。

如果有人愿意测试他们的设备和/或添加新的支持-加入:)

仍然在销售的是光荣的小蜜1C吸尘器这里这样的缺点(链接为它融入家庭助理)。我想服用...您需要吗?

All Articles