Yeelight介紹


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服務的發現過程如下圖所示

image

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設備的控制,其消息格式如下

image

其中各字段含義如下

- id_pair:       發送者初始化該字段
- method_pair:   控制方法, 為SUPPORT方法的一種
- params_pair:   不同控制方法有不同的參數

實例如下

image

目前Yeelight支持的方法如下

support_method

4.2 RESULT消息

當Yeelight設備收到COMMAND消息時,會回應一個RESULT消息,包含了COMMAND消息執行或查詢的結果
其消息格式如下

image

各字段含義如下

- id_pair:       與COMMAND消息中id_pair字段相同
- result_pair :  執行結果

執行成功實例如下

image

執行失敗實例如下

image

查詢結果實例如下(COMMAND為get_prop:[power, bright])

image

4.3 NOTIFICATION消息

當Yeelight設備屬性狀態改變時,會發送一個NOTIFICATION消息給所有連接的平台,其消息格式如下

image

其中params_pair格式如下

image

實例如下

sample

目前Yeelight支持的屬性如下

image

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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM