开关

设备复位场景举例

  • 人工重置设备,例如长按按键八秒,即可让外设进入配网状态;
  • 配网状态持续时间建议为30分钟

厂商接入开关关注点

  • 设备入网需要按照《小度蓝牙Mesh软件规范》(参考基础规范)来实现
  • 开关所有的model均需要自行订阅组地址0xC06D,当用户表达的query是『打开所有的开关』时,音箱的控制消息会发往组播地址0xC06D
  • 开关需要支持Sig mesh的Relay, Proxy功能
  • 开关不仅需要支持蓝牙Mesh规范里面的PB-ADV配网方式,还要支持PB-GATT配网方式

config约定

  • 订阅『开关』品类的分组地址: 0xC06D
    • 用于支持『打开所有的开关』
  • 订阅『开关』品类默认位置地址:0xC090
    • 用于将设备加入到默认的位置,该位置用户可以在小度App中动态修改为『卧室』、『餐厅』等,每个位置会有一个对应的分组地址
  • 注册的model id为:
    • 0x1000(Generic OnOff Server Model)
    • 0x0002011C(Data Trans Server Model)
      • 用于支持私有协议的状态上报
  • 开关需要自行设置发布地址为0xF000
    • 发布地址:消息广播地址。即状态上报时,向该地址发送消息

状态同步

  • 用户手动打开或关闭触发开关状态变化,必须有状态上报
  • 执行反转指令后,必须有状态上报
  • 执行音箱的Generic OnOff Model指令,不需要状态上报
  • 外设的F8或者F9的状态消息只发送给0xF000地址
  • 状态上报收到FA之后停止发送,一直没有收到FA消息,发送完预定次数之后停止发送
  • 建议的广播参数:间隔随机10ms,持续广播540ms
  • 开关: Data Trans Client Model(Opcode = 0xF81C01, AttributeType = 0x0100)

必须Model及其作用

Element 属性名称 Model Id 属性type定义 属性value定义
开关 (Primary Element) 开关 Generic OnOff Model N/A 标准方式控制开关
反转 Data Trans Server Model 0x011C0002 0xF004 2字节,0x0166,反转,外设收到指令后,反转开关状态
开关状态上报 Data Trans Server Model 0x011C0002 0x0100 1字节
0x00:继电器打开
0x01:继电器闭合

开关状态上报举例

  • 状态上报格式以及继电器打开事件上报示例数据(小端序)
OpCode CID TID Attribute Type Attribute Value
F8 1C 01 01 01 00 00
0XF8 0x011C 0x01 0x0001 0x00

其中TID作用:用于去重。相同tid的上报,小度云端10s内不会重复处理

综上,物理按键单击广播消息数据部分完整的消息体:0xF8011C01000100

TID去重

  • 上行去重,即外设状态上报0xF8消息
    • 外设状态上报到小度云端,10秒内收到相同的tid,不会重复处理
    • tid只检查与上次上报是否一致,不区分大小
  • 下行去重,即小度网关发送的0xFD或0xFE控制消息
    • 10秒内收到重复tid,不做业务处理,需要回复ack的场景,只回复0xFF ack即可
    • 外设判断重复tid,需要tid + attribute type 一起判断,不然会出现一些bad case

心跳

  • 设备端要支持Config Heartbeat Publication Set命令设置心跳参数
    • 如果音箱没有通过Config Heartbeat Publication Set命令设置设备心跳间隔,则默认心跳发送间隔16s,每次间隔10~20ms,广播360ms

TTL

  • 控制回复消息TTL设置为10
  • 状态上报TTL设置为10

iv index更新

  • 被动更新
    • 收到网络中广播的secure network beacon消息,检查自身iv index信息,并完成update或者recovery过程;
    • 重新上电后收到的第一个secure network beacon的iv index等于当前iv index + 1,且iv update flag处于normal状态,要求直接更新,忽略规范里面的时间限制;
  • 主动更新
    • sequence number达到0xB0E500的时候开始进行iv index update流程;

其它规范

  • 需要支持最少32个分组订阅,小度这边会存在多楼层、场景、设备组等组播场景需求;
  • 需要支持开关状态的查询,以Generic OnOff Get/Generic OnOff Status方式交互;
  • 设备在不同场景的发包参数会因为音箱扫描参数不同而存在差异
    • ack回复消息,包含标准status消息和0xFF消息,建议adv interval/adv period = 10ms/270ms;
    • 状态上报消息,即0xF8消息,建议adv interval/adv period = 10ms/540ms
  • 开关检测到proxy连接之后,主动清除本地缓存的sequence number信息,避免app卸载重装或清空数据无法控制的问题;
  • 涉及分包上报场景,建议走单播上报,目标单播地址建议取上一次控制命令的单播地址;