1. 介紹
Yeelight是小米生態鏈中的WiFi智能燈泡,本文介紹它的接入和控制實現;
Yeelight使用的是自定義的私有協議,該協議采用了類似SSDP的發現機制和基於JSON的控制命令
2. 接入
Yeelight並沒有配備網關(Hub),為了將其接入到平台中,需要配置所在網絡的SSID和密碼以供其使用
Yeelight設備采用的是SmartConfig/QuickConnect方式,這是不對外開放的.
SmartConfig是沒有人機交互界面WiFi設備接入網絡的安全方式,各廠商實現均不相同
其接入詳情已有網友進行了截獲,可參考<Xiaomi's MiHome Binary protocol>
3. 發現
這里的發現是指平台發現Yeelight的能力,采用的是類似SSDP的發現機制
3.1 SSDP
SSDP,Simple Service Discovery Protocol,簡單服務發現協議,用於發現網絡中的設備和服務
SSDP協議構建在HTTPU和HTTPMU之上;HTTPU是以UDP實現的HTTP協議,HTTPMU是廣播的HTTPU
SSDP協議有兩種角色: Device和Control Point
SSDP消息分為設備查詢消息(M-SEARCH)、設備通知消息(NOTIFY)兩種
3.1.1 查詢消息
SSDP查詢消息有組播(multicast)和單播(unicast)兩種,由Control Point進行發送
其中組播實例如下
M-SEARCH * HTTP/1.1 /* 消息頭 */ HOST: 239.255.255.250:1900 /* 地址和端口 */ MAN:"ssdp:discover"
/* 固定值 */ MX: seconds to delay response /* 最長等待時間 */ ST: search target /* 服務查詢目標 */ USER-AGENT: OS/version UPnP/1.1 product/version /* 可選, UPnP廠商指定 */
對於單播消息,其HOST字段為hostname:portNumber
查詢響應消息,一般如下
HTTP/1.1 200 OK CACHE-CONTROL: max-age = seconds until advertisement expires DATE: when response was generated EXT: LOCATION: URL for UPnP description for root device SERVER: OS/version UPnP/1.1 product/version ST: search target USN: composite identifier for the advertisement
3.1.2 通知消息
SSDP通知消息有兩種: 設備在線消息(Device available)和設備離線消息(Device unavailable);由Device進行發送
設備在線消息實例如下
NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 CACHE-CONTROL: max-age = seconds until advertisement expires LOCATION: URL for UPnP description for root device NT: notification type NTS: ssdp:alive SERVER: OS/version UPnP/1.1 product/version USN: composite identifier for the advertisement
設備離線消息實例如下
NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 NT: notification type NTS: ssdp:byebye USN: composite identifier for the advertisement
3.2 Yeelight發現
Yeelight服務的發現過程如下圖所示
Yeelight使用修改過的SSDP協議,使用查詢和通知消息
3.2.1 Yeelight查詢消息
查詢消息如下
M-SEARCH * HTTP/1.1 HOST:239.255.255.250:1982
MAN:
"ssdp:discover"
ST: wifi_bulb
查詢回應消息如下
HTTP/1.1 200 OK Cache-Control: max-age=3600 Date: Ext: Location: yeelight://192.168.1.239:55443 Server: POSIX UPnP/1.0 YGLC/1 id: 0x000000000015243f model: color fw_ver: 18 support: get_prop set_default set_power toggle set_bright start_cf stop_cf set_scene cron_add cron_get cron_del set_ct_abx set_rgb power: on bright: 100 color_mode: 2 ct: 4000 rgb: 16711680 hue: 100 sat: 35 name: my_bulb
其中support字段顯示了設備所有支持的控制方法
3.2.2 Yeelight通知消息
通知消息如下
NOTIFY * HTTP/1.1 Host: 239.255.255.250:1982 Cache-Control: max-age=3600 Location: yeelight://192.168.1.239:55443 NTS: ssdp:alive Server: POSIX, UPnP/1.0 YGLC/1 id: 0x000000000015243f model: color fw_ver: 18 support: get_prop set_default set_power toggle set_bright start_cf stop_cf set_scene cron_add cron_get cron_del set_ct_abx set_rgb power: on bright: 100 color_mode: 2 ct: 4000 rgb: 16711680 hue: 100 sat: 35 name: my_bulb
4. 控制
Yeelight設備的控制是基於JSON的自定義協議,以"\r\n"結尾;從Yeelight發現過程中,我們知道了Yeelight設備的IP地址和端口(192.168.1.239:55443),通過連接該地址和端口即可實現對Yeelight的控制
Yeelight控制可分為三種消息: COMMAND、RESULT、NOTIFICATION
4.1 COMMAND消息
平台可以通過COMMAND消息來實現對Yeelight設備的控制,其消息格式如下
其中各字段含義如下
- id_pair: 發送者初始化該字段 - method_pair: 控制方法, 為SUPPORT方法的一種 - params_pair: 不同控制方法有不同的參數
實例如下
目前Yeelight支持的方法如下
4.2 RESULT消息
當Yeelight設備收到COMMAND消息時,會回應一個RESULT消息,包含了COMMAND消息執行或查詢的結果
其消息格式如下
各字段含義如下
- id_pair: 與COMMAND消息中id_pair字段相同
- result_pair : 執行結果
執行成功實例如下
執行失敗實例如下
查詢結果實例如下(COMMAND為get_prop:[power, bright])
4.3 NOTIFICATION消息
當Yeelight設備屬性狀態改變時,會發送一個NOTIFICATION消息給所有連接的平台,其消息格式如下
其中params_pair格式如下
實例如下
目前Yeelight支持的屬性如下
5. Broadlink
Broadlink主打產品是基於WiFi的智能插座,下面大概介紹一下其工作原理
5.1 接入
Broadlink插座的接入並沒有使用SmartConfig,而是使用自定義方式
初次購買或者reset后的插座會處於AP模式;用戶端連接該AP后,發送包含平台網絡SSID和密碼的自定義組播報文 ;插座收到報文解析后即可獲得SSID和密碼,隨后加入平台網絡
5.2 發現
為了探測Broadlink插座,用戶端/平台需要發送自定義組播報文,網絡中的Broadlink插座收到組播報文后會回應包含Broadlink設備類型和MAC地址的報文,這樣平台就知道了插座的存在
5.3 控制
Broadlink插座在進行控制前需要進行認證,認證后會獲取ID和Key,這兩個數據被命令報文所需
控制報文比較簡單,也是自定義協議;中間還有一個learning mode的命令不知道具體是干啥的
具體的協議細節可參考<Broadlink RM2 network protocol>
可以看出Broadlink完全自己搞了一套,並不具備兼容性和拓展性。
參考:
<UPnP hacks>
<YeeLight library>
<對藍牙燈泡進行逆向工程>
<UPnP Device Architecture 1.1>
<Yeelight WiFi Light Inter-Operation Specification>