Roome 室友小易 - 设备与通信协议
给(厂商已经倒闭的)Roome 室友小易添加 HTTP API、DLNA 投放等更多功能,让它比原厂更强大。本节对设备的基础信息和通信协议进行了整理。
硬件信息
此处参考了 云中漫步的拆解文章,主要硬件信息如下:
组件 | 型号 | 说明 |
---|---|---|
CPU | Mstar MSV5263 | ARMv7 with NEON,无 SDK 和数据手册 |
RAM | 128MiB | |
Flash | TC58NVG0S3HTA00 | 1Gb (128MiB), Raw NAND |
Bluetooth Audio | JL AC1819AP | 只具有音频功能,无法进行 BLE 通信,通过 AT 指令控制 |
PIR | BISS0001 | 热释电红外开关 |
WiFi | MT7601 | 仅 2.4 GHz,USB 连接,性能一般 |
数码管驱动 | FZH216 | GPIO 控制 |
触摸主控 | TP224B | |
光线传感器 |
原厂系统
配网时或配网后,均可直接 Telnet 连接,用户名 root
,无密码。
1 | ~ # export PATH="/bin:$PATH" |
软件架构
部分基于 Android 的 Linux 系统,核心主进程为 /app/bin/aiAudioMain
,加载 /app/lib
中的如下动态库:
libffmpeg.so
几个 ffmpeg 库静态链接到一起libhomi.so
几乎所有的主要逻辑libjansson.so
JSON 解析库libmi.so
设备驱动接口libplayer.so
音频播放逻辑libtinyalsa.so
底层音频驱动
配置文件
/config/config-clock-user.json
设备配置文件/data/wifi.conf
WiFi 配网信息(用户名及密码)
配网流程
连接设备发射的网络后,发送包含 SSID 和密码的 UDP 数据包即可配网,具体流程待补充。
设备连接流程
HTTPS 认证,获取 Token
配网完成后,设备访问
1 | https://io.myroome.com/authDevice?... |
以获得 Access Token 以及后续 TCP 长连接的地址,所有的 HTTPS 请求均不验证证书,可直接劫持。
1 | { |
TCP 连接
设备通过 TCP 连接 server:9898
,并使用 JSON 进行通信(无分隔符号,只能自己数花括号了)。
通信协议
基础结构
1 | {"k":[1, 2],"v":[0, {}]} |
k
命令或消息的类型,数值v
命令或消息对应的数据,任意 JSONk
和v
按顺序一一对应,可以一次传输多个
设备 - 服务器
1 | {"k": [10], "v": [0],"t":"12294ffb712edfe1489abcefbe89d82","c":200} |
t
MD5 字符串,与消息中的k
有关c
返回值,仅存在于对服务器请求的回复中,语义类似 HTTP
对服务器请求的回复均为整数(布尔类型也会转换成整数),k
与请求时的值相同。
2 - 心跳
1 | {"u": 1101,"l":2,"f":88719630,"s":57344} |
服务器 - 设备
无其他扩展字段。此处仅列出部分指令,其余请自行反编译 libhomi.so
中的 conn_process_command_request
函数查看。
k |
v |
返回值 | 说明 | 函数 |
---|---|---|---|---|
9 | Unix 时间戳(秒) | 获取系统时间 | SysTimeGet |
|
10 | Unix 时间戳(秒) | 设置系统时间 | SysTimeSet |
|
163 | bool | 获取自动屏幕对比度 | AutoScreenContrastEnableGet |
|
164 | bool | 设置自动屏幕对比度 | AutoScreenContrastEnableSet |
|
165 | int 0-100 | 获取屏幕对比度 | ScreenContrastGet |
|
166 | int 0-100 | 设置屏幕对比度 | ScreenContrastSet |
|
167 | bool | 获取自动灯光亮度 | AutoLampBrightnessEnableGet |
|
168 | bool | 设置自动灯光亮度 | AutoLampBrightnessEnableSet |
|
169 | int 0-100 | 获取灯光亮度 | LampBrightnessGet |
|
170 | int 0-100 | 设置灯光亮度 | LampBrightnessSet |
|
181 | bool | 获取灯光开关 | LampOnGet |
|
182 | bool | 设置灯光开关 | LampOnGet |
202 - 播放 URL
1 | {"url": "url", "time": "string_unused", "keep": 0} |
仅 URL 参数被实际使用(长度至少 20 字节),但是其他的也需要提供,开始播放后不提供远程控制功能,如需停止可传入 20 字节的非 URL 字符串。
Roome 室友小易 - 设备与通信协议