一台“智能客房酒店主机”,刚出货(指闲鱼)的时候就购买了。关于这个盒子的一些文章请看脚注1 2。
这个机器的系统是定制的 Android 8,把 Launcher 等一堆东西改了,接入了若琪语音助手。比较吸引我的是,这个主机支持 Zigbee 协议,估计是用来控制酒店客房内的窗帘风机、灯泡等。
探索:Android 上的 Zigbee?
拆机后发现 Zigbee 芯片型号是 EFR32 MG1V132GG3 ,属于 EFR32 系列,是 Silicon Labs 推出的低功耗 MCU。
默认情况下,Android 并没有支持 Zigbee 协议栈,那么这台机器做了什么?
拿到线刷包后,解压。用 ripgrep
全局搜索 Zig
/Zigbee
等字样的程序,根据筛选,在 /system/bin
发现一个 SmartHomeZig30
的文件。用 r2
简单查看 SmartHomeZig30
,发现这个应用是中一个叫 Z3Gateway
应用修改而来。
这个程序的作用是什么?先从 Zigbee 组网说起,这里的内容主要来自 Silicon Labs 的 ZigBee® Gateway Reference Design User’s Guide (RD-0001-0201, RD-0002-0201) — UG129。
在上图,Zigbee 网关是通过树莓派以及一个 USB 设备实现(灰色区域),这个 USB 设备搭载了 ERF 系列的 Zigbee 芯片,在系统上表现为一个串口设备。整个网关的架构如下:
Z3Gateway 在倒数第二层,用于接收不同的协议(telnet、CoAP、mqtt),然后与 Zigbee 网络协处理器(NCP)使用 EZSP (EmberZNet Serial Protocol)交互。EZSP 是跑在串口通信上的协议,从其名字也能推出一二,更详细的可以看官方的文档:UG100: EZSP Reference Guide。如果你有 IoT 模块的开发经验,可以类比,EZSP 是 AT 指令。
所以,这台机器集成 Zigbee 的方式,不是把 Zigbee 协议像蓝牙一样在 Android 系统框架内实现,而是魔改 MCU 厂商提供的 Host Application。然后特定的 Android APP 只需要和 Host Application 交互即可(在这台机器上两者的交互方式似乎是通过 OpenWRT 的 ubus 实现)。
废物利用
作为 Zigbee 网关
上文有说到,NCP 在系统表现为一个串口设备。使用 ripgrep 能找到 SmartHomeZig30 的启动参数,可以确认其绑定在 /dev/ttyMT0
上(直连 MCU 的串口),以及通信的波特率(这个机器似乎有两个版本,两个版本的通信参数不一致)。
Zigbee2MQTT(简称 z2m,在 mqtt 和 zigbee 之间做转换)刚好支持 EZSP 协议,但其本身是一个运行在 NodeJS 上的程序,目前还不能直接在 Android 上运行。
有两种方式可以调用 NCP:
- z2m 支持 TCP 串口,那么你只要运行一个串口转 TCP 的软件,绑定到
/dev/ttyMT0
即可。软件可以自己用 Java 写一个,或者用一些类似 socat 的工具; - 使用 Linux Deploy 部署一个 Linux 环境用来运行 NodeJS,再就按照 z2m 官方手册进行配置即可。这也是我目前的做法,跑一个 Alpine 的容器,然后使用 pm2 来管理 z2m 进程。
注意,记得在连接串口之前,先杀死系统的 SmartHomeZig30 进程,避免其占用串口设备。
温湿度计
系统默认的 Launcher 有显示室温以及湿度,可以确定的是机器自身搭载了温湿度计。这里借值得买文章的图。
根据逆向其桌面 APP,发现是调用了一个 libhumidity.so 文件。如果是想拿来当温湿度计,那么直接调用这个接口即可。
从汇编代码来看,这个函数是去读取了 /dev/humidity
,这个设备由厂商实现的字符设备。
后续
这台机器还有一些比较有意思的硬件,例如 RGB 灯条(QQ 群已经有人逆向出来了)、麦克风阵列(目前还没进展)。
机器短板就是 SoC 性能太差(MT8167),内存 1G 小了点。如果这方面能够好一些的话,在上面跑 Node Red 或者 HA 能发挥更多余热。
这个外形很适合运行一些 Dashboard App。
这里附上主板上的一些 IC:
RGB LED 的芯片:
功放芯片 TAS5805MA1:
螃蟹的无线网卡: