更多详情请参阅 TP-Link HS110 逆向工程
用于 TP-Link Smart Home 专有协议的 Python 客户端,可控制 TP-Link HS100、HS110 和 KP115 WiFi 智能插头。SmartHome 协议运行在 TCP 端口 9999 上,使用一种不提供任何安全性的简单 XOR 自动密钥加密。
该协议没有认证机制,无论设备处于何种状态(已配置/未配置),命令都会被接受。
命令使用 JSON 格式,例如:
{"system":{"get_sysinfo":null}}
除了 null,我们也可以使用 {}。命令可以嵌套,例如:
{"system":{"get_sysinfo":null},"time":{"get_time":null}}
完整的命令列表见 tplink-smarthome-commands.txt。
./tplink_smartplug.py -t <ip> [-c <cmd> || -j <json>]
使用 -t 指定目标 IP,并使用 -c 或 -j 指定要发送的命令。-c 标志可用的命令:
更高级的命令(例如创建或编辑规则)可通过 -j 标志提供完整的 JSON 命令字符串来发出。请参阅 tplink-smarthome-commands.txt 获取完整的命令列表。
[!TIP] 若要美化打印响应,请使用静默参数 (-q) 并将输出通过
jq管道传递。例如:./tplink_smartplug.py -t 192.168.178.49 -c info -q | jq
用于解密 TP-Link Smart Home 协议数据包(TCP 端口 9999)的 Wireshark 解析器。

[!NOTE]
如果你使用的是 Wireshark > 3.5.0,则可以使用内置解析器。
将 tplink-smarthome.lua 复制到:
| OS | 安装路径 |
|---|---|
| Windows | %APPDATA%\Wireshark\plugins |
| Linux/MacOS | $HOME/.local/lib/wireshark/plugins |
一个概念验证 Python 客户端,使用 TP-Link 设备调试协议 (TDDP) 与 TP-Link 设备通信。
TDDP 在众多 TP-Link 设备上均有实现,包括路由器、接入点、摄像头和智能插头。TDDP 可以读写设备配置并发出特殊命令。UDP 端口 1040 用于发送命令,回复通过 UDP 端口 61000 返回。该客户端已在 TP-Link Archer C9 无线路由器和 TP-Link HS-110 WiFi 智能插头上进行了测试。
TDDP 是一种二进制协议,记载于专利 CN102096654A 中。
命令通过设置 Type 和 SubType 头字段中的相应值来发出。返回的数据经 DES 加密,需要使用设备的用户名和密码才能解密。同样,要写入设备的配置数据也需要加密发送。DES 密钥的构造方式为:先计算用户名和密码拼接后的 MD5 哈希,然后取该 MD5 哈希的前 8 个字节。
./tddp-client.py -t <ip> -u username -p password -c 0A
使用 -t 指定目标 IP。你也可以提供用户名和密码,否则默认使用 admin/admin。它们是解密返回数据所必需的。
以两位十六进制字符串的形式提供命令,例如 -c 0A。命令可能读出的数据类型因不同 TP-Link 设备而异。
在默认配置的 Archer C9 上读取 WAN 链路状态,显示链路为断开 (0):
./tddp-client.py -t 192.168.0.1 -c 0E
Request Data: Version 02 Type 03 Status 00 Length 00000000 ID 0001 Subtype 0e
Reply Data: Version 02 Type 03 Status 00 Length 00000018 ID 0001 Subtype 0e
Decrypted: wan_ph_link 1 0
| Command | Description |
|---|
| antitheft | 列出已配置的防盗规则 |
| cloudinfo | 返回云连接信息 |
| countdown | 列出已配置的倒计时规则 |
| energy | 返回实时电压/电流/功率 |
| energy_reset | 重置电能表 |
| info | 返回设备信息 |
| ledoff | 关闭 LED 指示灯 |
| ledon | 开启 LED 指示灯 |
| off | 关闭插头 |
| on | 开启插头 |
| reboot | 重启设备 |
| reset | 将设备重置为出厂设置 |
| runtime_reset | 清除运行统计数据 |
| schedule | 列出已配置的定时规则 |
| time | 返回系统时间 |
| wlanscan | 扫描附近的接入点 |