风扇

设备复位场景举例

  • 在新风扇开箱通电的场景中,用户不需要任何操作,即可进入配网状态;
  • 在手动操作的场景中,需要长按定时键3秒,听到滴的一声,即可进入配网状态;
  • 在小度app上删除风扇,音箱会向风扇发送Config Node Reset消息,风扇收到Reset消息后,需要自动进入配网状态;
  • 配网广播时间为10分钟,超过10分钟没有配网,开启静默广播;

config约定

  • 入网流程参考基础规范
  • 入网流程中的configuration阶段,音箱只会对风扇主Element中的Generic OnOff Server Model(Model Id为0x1000)进行设置,风扇需要将这些设置自动绑定到其他Model;
  • 风扇品类的默认分组「地址」为0xC091,这个地址需要记录在风扇固件中,分组用于支持按照设备类型控制多个设备,例如「打开所有风扇」,「打开客厅的风扇」;
  • 在小度app上修改风扇分组的场景中,音箱会向风扇发送Config Model Subscription Overwrite消息,风扇收到OverWrite消息后,会把Model中的分组「地址」

更新为消息中携带的分组「地址」;由于使用的是Overwrite消息,风扇会把品类默认分组「地址」0xC091覆盖掉,所以需要风扇自行将默认分组「地址」恢复回来;

必须Model及其作用

Element 属性名称 Model Id 属性type定义 属性value定义
风扇 (Primary Element) 开关 Generic OnOff Server Model 0x1000 N/A N/A
开关 Data Trans Server Model 0x011C0002 0x0100 1字节开关状态,0x00代表关闭;0x01代表打开;
风速 0x010A 1字节风速,云端将上报的十六进制转十进制存储,0x01代表1档,0x02代表2档,0x03代表3档;
左右摇头 0x0500 1字节状态,0x00代表关闭左右摇头;0x01代表打开左右摇头;
上下摇头 0x0501 1字节状态,0x00代表关闭上下摇头;0x01代表打开上下摇头;
模式 0xF004 2字节状态,0x0013代表正常风;0x0014代表自然风;0x0015代表代表睡眠风;0x00A5代表循环风;
当前温度 0x010D 2字节温度,上报温度计算方式:(摄氏度 + 273.15) * 100,小度会做逆向运算;
屏显开关 0x050D 1字节状态,0x00代表关闭;0x01代表打开;
童锁开关 0x050C 1字节状态,0x00代表关闭;0x01代表打开;
冷风功能 0x0538 1字节状态,0x00代表关闭;0x01代表打开;
热风功能 0x0539 1字节状态,0x00代表关闭;0x01代表打开;
负离子功能 0x0505 1字节状态,0x00代表关闭;0x01代表打开;
人感功能 0x0523 1字节状态,0x00代表关闭;0x01代表打开;
清洁功能 0x0537 1字节状态,0x00代表关闭;0x01代表打开;

风扇支持控制语句

  • 发现设备 | 发现智能风扇 | 发现蓝牙风扇 | 连接智能风扇
  • 打开风扇 | 关闭风扇 | 一小时后打开风扇 | 每天下午六点钟关闭风扇
  • 风扇一挡风 | 风扇风速调高 | 风扇风速调低
  • 风扇摇头 | 风扇左右摆风
  • 关闭风扇灯光 | 打开风扇屏显
  • 风扇关了吗 | 风扇几挡风

风扇控制命令

  • 开关使用蓝牙Mesh SIG Model,即Generic OnOff Model
  • 风速 | 摇头 | 屏显等其他功能使用Vendor Model,即Data Trans Model

风扇状态上报举例

  • 风扇配网之后,在状态发生改变的时候,有如下上报场景:

(1) 手动控制风扇,需要上报状态,例如手动切换风速,需要将切换后的风速上报给音箱端

(2) app控制或者语音控制风扇,需要上报状态,例如语音或者app控制摆风,需要将摆风状态上报给音箱端

(3) 风扇再次上电,需要将当前的状态全部同步给音箱端

(4) 风扇配网之后,需要按照小度配置参数上报心跳,用于app上显示风扇的在线状态,超过6分钟没有收到心跳,音箱即认为风扇已经处于离线状态

  • 状态上报格式以及开关状态上报示例数据(小端序)
Opcode tid Attribute Type Attribute Value
F8 1C 01 01 00 01 01
0xF8 0x011C 0x01 0x0100 0x01

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

  • 风扇的状态只发送给0xF000地址,云端会去重多网关上报场景
  • F8状态上报收到预期的FA之后停止发送,若一直没有收到FA消息,发送完预定次数之后停止发送

tid去重

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

TTL

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

心跳

  • 设备端需要支持Config Heartbeat Publication Set消息设置心跳参数
  • 小度下发心跳发送间隔默认为16s,风扇向外广播心跳建议发包参数adv interval/adv period = 10ms/360ms

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

其他约定

  • 风扇需要支持蓝牙Mesh规范里面定义的Relay和Proxy特性;
  • 风扇检测到proxy连接之后,主动清除本地缓存的sequence number信息,避免app卸载重装或清空数据无法控制的问题;
  • 风扇不仅需要支持蓝牙Mesh规范里面的PB-ADV配网方式,还要支持PB-GATT配网方式;
  • 风扇入网的最后一步是设置订阅地址,要求在成功设置订阅地址之后,延迟1s~2s再上报状态;
  • 涉及分包上报场景,建议走单播上报,目标单播地址建议取上一次控制命令的单播地址;
  • 需要支持最少32个分组订阅,小度这边会存在多楼层、场景、设备组等组播场景需求;
  • 需要支持开关状态的查询,以Generic OnOff Get/Generic OnOff Status方式交互;
  • 设备在不同场景的发包参数会因为音箱扫描参数不同而存在差异
    • ack回复消息,包含标准status消息和0xFF消息,建议adv interval/adv period = 10ms/270ms;
    • 状态上报消息,包含0xF8和0xF9消息,建议adv interval/adv period = 10ms/540ms