天猫精灵 模拟 模拟尝试 : 协议篇 天猫精灵开发 September 8, 2017 1
加密.......................................... 3 校验 (Checksum)................................. 3 新设备设置...................................... 4 络发现....................................... 4 命令包格式...................................... 7 授权.......................................... 9 进 学习模式..................................... 10 从学习模式读回数据................................. 10 发送数据....................................... 11 2
加密 原 链接 :https://www.wandianshenme.com/play/aligenie-tmall-x1-broadlink-spmini-emulator-ana 因为天猫精灵 x1 前只能 持 Broadlink 设备, 便想着是不是能 做 个设备来模拟 这样 来, 我们就可以绕过服务端, 从 便可以直接通过天猫精灵来控制本地的设备 为此便开始了 系列的计划, 即两步曲 : 分析 broadlink 的通信协议 模拟 broadlink 设备本 则是 python-broadlink 项 中, 对于协议解析的翻译, 原 地址是 :Broadlink RM2 network protocol 加密 Broaalink 数据包中, 包括了基于 CBC 模式的 AES 加密 初始的键 (key) 是 : 1 其中的 IV 值是 : 1 其 Python 代码如下所 : 1 2 校验 ( ) 构造数据包, 并将校验字节设置为零 并将每个字节添起始值 0xbeaf, 同时再 0xffff 包装 例代码, 如下所 : 1 2 3
络发现 3 新设备设置 要在 AP 模式下, 设置新的 Broadlink 设备 则需要将 136 字节的数据包发送到设 备, 格式如下所 : -0x19 00 0x20-0x21 校验作为 个 端 16 位整数 (little-endian 16 bit integer) 0x26 14 ( 总是 14) 0x44-0x63 SSID 名字 ( 剩余的部分使 0 填充 ) 0x64-0x83 密码 ( 剩余的部分使 0 填充 ) 0x84 SSID 的字符长度 0x85 密码的字符长度 0x86 线 络的安全模式 (00 - none, 01 = WEP, 02 = WPA1, 03 = WPA2, 04 = WPA1/2) 0x87-88 00 将此数据包作为 UDP 播, 发送到 255.255.255.255 上的 80 端 络发现 要发现本地 络上的 Broadlink 设备, 请发送 个包含以下的 48 字节数据包 : -0x07 00 0x08-0x0b 0x0c-0x0d 0x0e 以当前 GMT 的偏移值作为 个 端 (little-endian)32 位整数以当前的年 个 端 16 位整数当前的 时数分钟 4
络发现 0x0f 0x10 0x11 0x12 0x13 0x19-0x1b 0x1c-0x1d 0x1e-0x1f 00 0x20-0x21 当前午夜的 时数 本世纪现在的 年 今天在本周是第 天 (Monday = 0, Tuesday = 1, etc) 今天在本 是第 天 本 是第 本地 IP 地址 源端 作为 个 端 16 位整数 校验作为 个 端 16 位整数 0x22-0x25 00 0x26 06 0x27-0x2f 00 将此数据包作为 UDP 播, 发送到 255.255.255.255 上的 80 端 对应 播代码如下所 : 1 2 3 玩点什么 : 4 5
络发现 5 响应 ( 任何单播响应 ): 0x34-0x35 设备类型为 端 16 位整数 ( 请参见设备类型映射 ) 0x3a-0x40 标设备的 MAC 地址 以下是 个处理响应的 例代码 : 1 2 3 4 5 6 设备类型映射 : 在响应包中的设备类型 设备精英 视为 0 SP1 SP1 0x2711 SP2 SP2 0x2719 or 0x7919 or 0x271a or 0x791a Honeywell SP2 SP2 0x2720 SPMini SP2 0x753e SP3 SP2 0x2728 SPMini2 SP2 0x2733 or 0x273e OEM branded SPMini SP2 >= 0x7530 and <= 0x7918 OEM branded SPMini2 SP2 0x2736 SPMiniPlus SP2 0x2712 RM2 RM 0x2737 RM Mini / RM3 Mini Blackbean RM 0x273d RM Pro Phicomm RM 0x2783 RM2 Home Plus RM 0x277c RM2 Home Plus GDT RM 0x272a RM2 Pro Plus RM 0x2787 RM2 Pro Plus2 RM 0x278b RM2 Pro Plus BL RM 6
命令包格式 在响应包中的设备类型设备精英视为 0x278f RM Mini Shate RM 0x2714 A1 A1 0x4EB5 MP1 MP1 命令包格式 命令包 header 长为 56 字节, 格式如下 : 0x01 0x02 0x03 0x04 0x05 0x06 0x07 Contents 0x5a 0xa5 0xaa 0x55 0x5a 0xa5 0xaa 0x55 7
命令包格式 Contents 0x08-0x1f 00 0x20-0x21 全分组校验作为 个 端 16 位整数 0x22-0x23 00 0x24 0x25 0x26-0x27 0x28-0x29 0x2a-0x2f 0x2a 0x27 命令码作为 个 端 16 位整数 数据包计数为 个 端 16 位整数 本地 MAC 地址 0x30-0x33 本地设备 ID( 认证期间获取, 认证前为 00) 0x34-0x35 数据包头的校验和, 作为 个 端 16 位整数 0x36-0x37 00 负载 (payload) 是在这之后 即添加进 的 在附加有效载荷之前, 校验和的计算在 0x34; 并且只覆盖 header 在负载(payload) 添加之后, 在 0x20 的校验将会计算 并覆盖整个数据包 ( 包括 0x34 处的校验 ) 因此 : 1. 成校验和值设置为 0 的数据包头 8
授权 2. 将校验的初始化值设置为 0xbeaf, 并计算数据包头的校验和 将 0x34-0x35 设置为此值 3. 附加有效载荷 4. 设置校验授权您必须从设备获取授权密钥才能进 通信 为此, 成 个包含以下的 80 字节数据包 : -0x03 00 0x04-0x12 表 此设备的 15 位数值 Broadlink 在实现中使 的是 IMEI 0x13 01 0x14-0x2c 00 0x2d 0x30-0x7f 0x01 包含设备名称的 NULL 终 ASCII 字符串 使 带有命令值 65 的包发送此有效载荷 响应数据包将包含从 0x38 开始的加密过的有效载荷 使 默认密钥和 IV 解密 解密的有效载荷的格式是 : -0x03 0x04-0x13 Device ID Device 密钥 所有其他命令数据包, 必须使 此加密密钥和设备 ID 1 2 3 4 5 9
从学习模式读回数据 进 学习模式 发送以下 16 字节有效负载, 包含命令值为 6a: 0x01-0x0f 代码表 如下 : 1 2 3 4 0x03 从学习模式读回数据发送以下 16 字节有效负载, 包含命令值为 6a: 0x01-0x0f 0x04 响应的字节 0x22 包含 个 端 16 位错误代码 如果它是 0, 则获得代码 字节 0x38 和之前的响应是被加密的 需要解密他们 字节 0x04 和解密的有效载荷之后, 则是所捕获的有效数据 1 2 3 4 5 6 7 8 10
发送数据 发送数据 发送以下 16 字节有效负载, 包含命令值为 6a: 0x01-0x03 0x04 0x05 0x06-0x07 0x02 0x26 = IR, 0xb2 于 RF 433Mhz, 0xd7 于 RF 315Mhz 重复次数, (0 = 不重复, 1 重复两次,..) 以下数据的长度为 端格式 0x08. 脉冲长度为 32,84 ms(ms * 269/8192). 0x0d 0x05 结尾则表 IR 每个值由 个字节表 如果长度超过 个字节, 那么它将以 0 开始来存储 端 以下是 SP2 设置电源状态的代码 : 1 2 3 4 5 6 例 : 我的 Optoma 投影机的头是 8920 4450 8920 * 269 / 8192 = 0x124 4450 * 269 / 8192 = 0x92 所以数据以 0x1 0x24 0x92. 开始原 链接 :https://www.wandianshenme.com/play/aligenie-tmall-x1-broadlink-spmini-emulator-ana 11