本帖最后由 xz633 于 2025-12-7 23:11 编辑
这两天花了二十刀用 Claude Code 分析了下提交的协议,实现了非模拟点击通过 python 代码调用,实现热水单次循环
把对应的协议分享出来,有代码能力的同学基于这个可以快速实现针对自己热水器的控制,无需额外硬件
最后一部分控制命令的ID 仅针对我自己的热水器:TLU3,别的型号自行抓包查阅
## 协议概述
### 通信架构
``` ┌─────────┐ 登录请求 ┌──────────────────────┐ │ 客户端 │ ───────────────> │ 登录服务器 │ │ │ <─────────────── │ nls.machtalk.net:6779│ └─────────┘ 返回session_key └──────────────────────┘ │ + 长连接服务器地址 │ │ 握手 + 控制命令 ▼ ┌──────────────────────┐ │ 长连接服务器 │ │ (动态分配,如 │ │ 117.50.25.132:6778) │ └──────────────────────┘ │ ▼ ┌─────────┐ │ 热水器 │ └─────────┘ ```
### 数据包格式
所有数据包采用统一格式:
``` ┌────────┬────────┬──────────┬──────────┬──────────┬───────────────┬──────────┬──────────┐ │ 0xAA │ 0xBB │ msg_type │ plain_len│ checksum │ encrypt_len │ plaintext│ encrypted│ │ 1 byte │ 1 byte │ 1 byte │ 1 byte │ 1 byte │ 2 bytes (BE) │ N bytes │ M bytes │ └────────┴────────┴──────────┴──────────┴──────────┴───────────────┴──────────┴──────────┘ ```
### 消息类型
| msg_type | 名称 | 方向 | 说明 | |----------|------|------|------| | 0x09 | Login | 客户端→服务器 | 登录请求 | | 0x0A | Connect | 客户端→服务器 | 长连接握手 | | 0x0B | Response | 服务器→客户端 | 登录/握手响应 | | 0x11 | Business | 双向 | 控制命令/查询/响应 |
### 加密方式
- 算法: AES-128-CBC + PKCS5Padding - 密钥: `MD5(password)[:16]` (前16字符) - IV: `MD5(password)[16:]` (后16字符)
## 登录流程
### 1. 登录请求 (msg_type=0x09)
**明文部分:** ``` [user_type: 1B] [platform_id: 2B BE] [username: NB] ```
**加密部分:** ``` [serial: 2B BE] [username_len: 1B] [username] [固定字节] [app_id: 1B] [1B] ```
### 2. 登录响应 (msg_type=0x0B)
**解密后数据结构:** ``` 偏移 长度 内容 [0:2] 2B 序列号 [2:4] 2B 随机前缀 [4:36] 32B session_key [36:68] 32B uid [68:100] 32B api_key [100:104] 4B 长连接服务器IP [104:106] 2B 长连接服务器端口 (BE) ```
## 长连接控制流程
### 1. 握手 (msg_type=0x0A)
**明文部分:** session_key (32字节)
**加密部分:** `[serial: 2B] [0x00 0x00] [heartbeat: 2B BE]`
### 2. 握手响应 (msg_type=0x0B)
成功时 msg_type=0x0B,解密后包含心跳间隔等信息。
### 3. 控制命令 (msg_type=0x11)
**加密部分:** `[serial: 2B] [JSON命令]`
**查询命令:** ```json {"to":"设备ID","cmd":"query","mid":"消息ID"} ```
**控制命令:** ```json {"to":"设备ID","cmd":"opt","mid":"消息ID","as":{"key":"value"}} ```
### 4. 单次热水循环控制
需要发送两条控制命令:
| 命令 | key | value | 说明 | |------|-----|-------|------| | 1 | "1" | "14" | 设置模式 | | 2 | "2" | "16973823" | 开启单次循环 | | 2 | "2" | "196607" | 关闭单次循环 |
|