• 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的自定义协议,以" "结尾;从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>

  • 相关阅读:
    Asp.NetCore3.1 WebApi 获取配置json文件中的数据
    Dapper同时操作任意多张表的实现
    将视图批量新增到PowerDesigner中并以model图表的形式展示
    .NetCore3.1获取文件并重新命名以及大批量更新及写入数据
    .NetCore 简单的使用中间件
    比较复杂的SQL转Linq
    Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入
    Git与GitLab的分支合并等简单的测试操作
    Winform的控件以及DataGridView的一般使用
    在Linux系统中运行并简单的测试RabbitMq容器
  • 原文地址:https://www.cnblogs.com/hzl6255/p/9696737.html
Copyright © 2020-2023  润新知