窗帘

设备复位方法

  • 新设备开箱通电,默认自动进入配网状态;
  • 人工重置设备,例如长按复位键5s;
  • 从小度App删除设备,触发设备重置自动进入配网状态;
  • 配网状态持续时间建议为30分钟

    config约定

  • 注册的model id为: 0x1000(Generic OnOff Server)和0x0002011C(Data Trans Server Model)
    • id为0x1000的model用来设置设备的分组,在音箱给设备发送config model subscribe命令时设置设备的分组
    • 用于支持『打开窗帘』、『反转窗帘』、『窗帘打开百分之五十』等操作
  • 订阅『窗帘』品类默认位置地址:0xc046
    • 用于将设备加入到默认的位置,该位置用户可以在小度App中动态修改为『卧室』、『餐厅』等,每个位置会有一个对应的分组地址(参考基础规范)

控制命令

具体采用的控制model和model中的所有参数字段枚举

  • 开关: Data Trans Client Model(Opcode = 0xFD1C01, AttributeType = 0x0547)
  • 打开到某个百分比的位置: Data Trans Client Model(Opcode = 0xFD1C01, AttributeType = 0x0548)
  • 停止: Data Trans Client Model(Opcode = 0xFD1C01, AttributeType = 0x0547)
  • 调整模式: Data Trans Client Model(Opcode = 0xFD1C01, AttributeType = 0xF004)

消息约定

窗帘每次收到0xFD控制消息后,均需要回复0xFF消息进行接收确认

状态同步

窗帘上电启动或设备状态被其他设备(如有,例如手机App、墙面开关等)改变后通知音箱

  • 电量百分比: Data Trans Client Model(Opcode = 0xF81C01, AttributeType = 0x0104)
  • 开关: Data Trans Client Model(Opcode = 0xF81C01, AttributeType = 0x0547)
  • 打开百分比: Data Trans Client Model(Opcode = 0xF81C01, AttributeType = 0x0548)
  • 电量状态: Data Trans Client Model(Opcode = 0xF81C01, AttributeType = 0x0549)
  • 工作状态: Data Trans Client Model(Opcode = 0xF81C01, AttributeType = 0xF001)
  • 调整模式: Data Trans Client Model(Opcode = 0xF81C01, AttributeType = 0xF004)

Data Trans Model有关窗帘的参数说明

AttributeType AttributeValue Direction Description
0x0104 uint8 电量百分比 mesh设备发往音箱 表示设备的电量
0x0547 uint8 控制参数 音箱发往mesh设备 或 mesh设备发往音箱 0:关闭窗帘、1:打开窗帘、2:停止窗帘
0x0548 uint8 窗帘打开的位置 音箱发往mesh设备 或 mesh设备发往音箱 最大:100 最小:0 步长:1 默认值:0
0x054A uint8 电机运动方向 音箱发往mesh设备 或 mesh设备发往音箱 左转:3 右转:4
0xF001 uint8 工作状态 mesh设备发往音箱 停止:0 开始(继续): 1 错误:26 WiFi设置:27 关机:28 工作:29 上电:36
0xF004 uint16 窗帘模式 音箱发往mesh设备 或 mesh设备发往音箱 反转模式:351、校准模式:352、正常模式:353、反向模式(开或关):358

参数数据示例

  • 将窗帘设置为校准模式的指令 AttributeType为0xF004、控制参数为校准模式对应的值352,即十六进制表示为0160,假设此时TID的值为1,那么完整的Message部分为0x01F0040160。 由于音箱发给窗帘数据的大小端序为小端序,因此窗帘收到的指令Message部分为0x0104F06001。 窗帘收到的整体的Mesh消息的Opcode部分为0xFD1C01,因此窗帘收到的整体数据部分为0xFD1C010104F06001。 窗帘收到以后,需要回复Opcode为Set State Status的消息给音箱,以使得音箱确认消息发送成功(参考基础规范)。
  • 将窗帘的开关状态上报 窗帘开关上报是在窗帘的状态有发生变化时,同步给音箱。使用Opcode = 0xF81C01的消息上报,音箱不需要回复。 以窗帘开关打开的状态为例,假设此时TID的值为10,那么完整的Message部分为0x0A054701。 由于窗帘发送音箱的数据大小端序为小端序,因此音箱收到的Message数据部分为0x0A470501,整体消息为0xF81C010A470501。

窗帘的状态上报规范

  • 窗帘发生以下行为时,按照下表进行状态上报
  • 为减少消息交互次数,厂商在收到音箱控制指令后,尽量减少额外的状态上报
  • 当窗帘无法获取当前行程时,位置信息0x0548的属性值设置为FF
  • 窗帘的状态只发送给0xF000地址
  • F8状态上报收到预期的FA之后停止发送,若一直没有收到FA消息,发送完预定次数之后停止发送
操作行为 上报行为 AttributeType AttributeValue
上电/开机 位置、模式 0x0548、0xF004
配网 位置、模式 0x0548、0xF004
开始运动 开关状态 0x0547 目标方向:打开-01、关闭-00
运动中 不需要上报状态
运动结束 开关状态、位置 0x0547、0x0548 0x0547为02
反转/正常模式发生变化 位置、模式 0x0548、0xF004

状态上报格式以及暂停状态上报示例数据(小端序)

Opcode tid Attribute Type Attribute Value
F8 1C 01 01 47 05 02
0xF8 0x011C 0x01 0x0547 0x02

其中tid作用:用于小度云端去重,15秒内相同上报tid,云端不会重复处理

TTL

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

心跳

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

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流程;

模式控制约定(0xF004)

校准模式(0x0160)

窗帘收到校准模式的控制指令时,需要依次执行以下操作

  1. 清除窗帘当前行程
  2. 自动完成一次行程校准(向当前打开方向运行至尽头、向当前关闭方向运行至尽头)
  3. 将窗帘运动至全开位置

正常模式(0x0161)、反转模式(0x015F)

窗帘收到正常模式或反转模式的控制指令时,需要依次执行以下操作

  1. 将电机反转
  2. 清除窗帘当前行程
  3. 自动完成一次行程校准(向当前打开方向运行至尽头、向当前关闭方向运行至尽头)
  4. 将窗帘运动至全开位置

反向模式(0x0166)

反向模式在产品定义中为“开或关”,当窗帘收到反向模式的控制指令时,需要根据窗帘当前状态按照如下逻辑执行对应操作

收到指令时的窗帘状态 执行操作
静止,处于完全闭合状态 打开,相当于收到0x0547 01
静止,处于非完全闭合状态 关闭,相当于收到0x0547 00
运行中 暂停,相当于收到0x0547 02

其他约定

  • 窗帘需要支持蓝牙Mesh规范里面定义的Relay和Proxy特性
  • Prxoy连接时需要清除seq_number,避免app卸载重装或清空数据导致无法控制
  • 窗帘不仅需要支持蓝牙Mesh规范里面的PB-ADV配网方式,还要支持PB-GATT配网方式
  • 涉及分包上报场景,建议走单播上报,目标单播地址建议取上一次控制命令的单播地址
  • 设备在不同场景的发包参数会因为音箱扫描参数不同而存在差异
    • ack回复消息,包含标准status消息和0xFF消息,建议adv interval/adv period = 10ms/270ms
    • 状态上报消息,包含0xF8和0xF9消息,建议adv interval/adv period = 10ms/540ms