本文在蓝牙技术联盟发布的Mesh Profile的基础上,做了一些协议上的定制,细化了部分协议规则,作为蓝牙mesh模组软件规范,指导模组厂家软件设计并对接生活物联网平台与天猫精灵音箱。

名词解释

名词 描述
蓝牙mesh 蓝牙网状网络连接技术。
BLE Bluetooth Low Energy 蓝牙低功耗技术。
CID Company Identifier,公司标识符。阿里巴巴的标识符为0x01A8。
Relay 中继功能:中继节点能在蓝牙mesh网络中接收和转发其他设备的消息,通过消息在节点之间的中继,实现更远距离的传输和更大规模的网络。承担这一角色的节点一般需要固定的电源和一定的计算资源。
Proxy 代理功能:代理节点能够实现GATT和蓝牙mesh节点之间的mesh消息发送与接收。通过Proxy代理使得BLE蓝牙设备能通过GATT接入mesh网络。承担这一角色的节点一般需要固定的电源和一定的计算资源。
Unprovisioned Device 未配网设备,还未加入蓝牙mesh网络的设备。
Node 节点,加入蓝牙mesh网络的设备。
Provisioning 配网过程,设备加入蓝牙mesh网络的过程。
Low Power 低功耗功能:功率受限的节点可能会利用低功耗特性来减少无线电接通时间并节省功耗。同时低功耗节点(LPN)可以与friend节点协同工作。
LPN Low Power Node,低功耗节点。
Friend 功率不受限的节点很适合作为Friend节点。Friend节点能够存储发往低功耗节点(LPN)的消息和安全更新;当低功耗节点需要时再将存储的信息传输至低功耗节点。
GLP Genie Low Power,精灵低功耗方案。
NetKey 蓝牙mesh网络中用于区分不同网络的关键密钥。
AppKey 蓝牙mesh网络中用于区分同一网络中不同应用的关键密钥。
PB-ADV 一种通过蓝牙mesh beacon给mesh设备进行配网的交互方式。
PB-GATT 一种通过蓝牙GATT给mesh设备进行配网的交互方式。

基本要求

  • 蓝牙mesh设备必须支持PB-ADV、PB-GATT。
  • 蓝牙mesh设备必须支持mesh协议里定义的Proxy功能。
  • 非低功耗蓝牙mesh设备必须支持mesh协议里定义的Relay功能,并且可以被正确打开和关闭。
  • LPN和Friend功能可选。
  • 低功耗设备采用精灵低功耗(GLP)方案。
  • 蓝牙mesh设备要求至少支持2个NetKey、5个AppKey。
  • 特殊产品如果仅需支持部分功能将在产品规范中明确说明具体需要支持的功能。

UUID格式

UUID应用于Unprovisioned Device Beacon广播和PB-GATT广播中。广播包中的Device UUID是识别设备的关键信息,UUID中各字段采用小端模式进行存储,对Device UUID的定义如下表所示。

字段 size(字节数) 描述
CID 2 Company Identifier,公司标识符。阿里巴巴的标识符为0x01A8。
PID 1
  • bit3~0 :蓝牙广播包版本号,目前是0x01;
  • bit4为1:一机一密;
  • bit5为1:支持OTA;
  • bit7~6:蓝牙协议版本;
    • 00:BLE4.0
    • 01:BLE4.2
    • 10:BLE5.0
    • 11:BLE5.0以上
ProductID 4 生活物联网平台颁发,一型一号。
MAC地址 6 生活物联网平台颁发,一机一号,蓝牙mesh设备的MAC地址与Device Name一致。
FeatureFlag 1
  • bit0 :广播状态
    • 0:处于未配网广播状态;
    • 1:处于静默广播状态。
  • bit7~1 :UUID版本号,目前版本为1
    • 0b0000000:该版本配网流程遵循蓝牙mesh标准规范;已不推荐使用该版本;
    • 0b0000001:该版本优化了配网流程并需要支持Vendor Model V2.0。
FeatureFlag1 1
  • bit0:极速配网标志位,不支持极速配网必须置0;
  • bit1:扩展AuthValue标志位;
  • bit3~2:RFU 保留位;
  • bit7~4:Genie BT Mesh Stack标志,未使用阿里巴巴开源协议栈的必须置0。
RFU 1 0x00 Reserved for future use。
说明 上表中的RFU保留字段和要求置0的字段必须全部置为0。在产品生命周期中,当产品的ProductID、MAC地址未变化时,CID、PID不允许发生变化。

蓝牙mesh广播包格式

  • 未配网广播 Unprovisioned Device Beacon

    蓝牙mesh设备上电后如处于未配网状态,需要广播Unprovisioned Device Beacon,每次广播时长不小于120ms,广播间隔500ms,广播持续时间默认10分钟,具体产品的广播启动方式和广播持续时间以产品需求为准。如果超时后仍未被配网,设备进入静默广播状态,关闭PB_GATT广播。

    注意低功耗设备不需要进入静默广播状态。

    未配网广播数据示例如下:
    0x14 0x2B 0x00 A8 01 71 81 02 00 00 55 43 CB 07 DA 78 02 00 00 0x00 0x00
    Mesh Beacon Unprovisioned Device beacon Device UUID OOB Information
    Length Type Beacon Type Beacon Data
    Advertising data header Advertising data payload
  • 静默广播

    当设备处于静默广播状态时,设备在收到Provisioner发出的配网消息时不进行响应,静默广播用于在不打扰用户的情况下让Provisioner发现对应的设备。静默广播每次广播时长不小于120ms,广播间隔60s。

    设备在进入静默广播状态时,需要首先修改自身UUID中的静默广播状态位,然后开始广播Unprovisioned Device Beacon。

    静默广播数据示例如下:
    0x14 0x2B 0x00 A8 01 71 81 02 00 00 55 43 CB 07 DA 78 03 00 00 0x00 0x00
    Mesh Beacon Unprovisioned Device beacon Device UUID (静默广播状态位为1) OOB Information
    Length Type Beacon Type Beacon Data
    Advertising data header Adversiting data payload
  • PB-GATT广播

    不支持PB-ADV的设备,如手机,需要先和节点建立GATT连接,通过Mesh Provisioning Service通信。因此建立GATT连接之前,设备需要广播PB-GATT的广播包。GATT广播包中的UUID也同样参照UUID格式。PB-GATT广播数据格式参考Mesh Profile Specification

    PB-GATT广播发送规则参照BLE广播发送规则,每次广播间隔100ms。

  • AIS广播

    AIS广播请参考蓝牙BLE基础规范

    AIS广播发送规则参照BLE广播发送规则,每次广播间隔100ms。

  • Proxy广播

    Proxy广播数据格式参考Mesh Profile Specification

    Proxy广播发送规则参照BLE广播发送规则,每次广播间隔100ms。

广播包发送规则

  • 设备状态与切换规则

    设备状态包括未配网广播状态、未配网静默广播状态、配网状态、已配网状态。

    • 当未配网设备上电后,设备需要进入未配网广播状态;广播持续时间默认10分钟,具体产品的广播启动方式和广播持续时间以产品需求为准。超时后仍未被配网则进入未配网静默广播状态。
    • 如果设备通过APP解除配网,或者设备通过硬件复位方式清除配网信息(包括mesh网络信息、心跳配置、组播配置)后,设备需要重新进入未配网广播状态。
    • 当设备响应连接建立请求(回复link ack或者通过PB-GATT建立连接)后,设备进入配网状态。
    • 当设备完成配网流程(以Provision完成配置为标志事件)则进入已配网状态;否则恢复至未配网广播状态,广播持续时间默认10分钟。
  • 未配网广播状态

    当设备处于未配网广播状态时,设备需要同时广播Unprovisioned Device Beacon、PB-GATT广播、AIS广播。

  • 未配网静默广播状态

    当设备进入静默广播状态时,仅广播Unprovisioned Device Beacon(置静默广播状态位),每隔60s进行一次广播,每次广播时间(不小于)120ms。

  • 配网状态

    设备同一时间只允许建立一个配网连接(mesh或者GATT)。当设备处于配网状态,停止广播Unprovisioned Device Beacon及其他GATT广播包。

  • 已配网状态

    当设备处于已配网状态,要求设备不再响应配网连接建立请求,并同时发送proxy广播和AIS广播。

配网流程

蓝牙mesh设备配网流程遵循蓝牙mesh标准的Provisioning流程,其中几个使用自定义数据的步骤描述如下。

  • Provisioning Capabilities阶段。
    蓝牙mesh设备在Provisioning Capabilities阶段提供OOB(Out of Band)方式,要求唯一支持Static OOB方式,其中的AuthValue计算过程如下:
    扩展AuthValue标志位取值 AuthValue计算方法
    0 AuthValue = SHA256(Product ID,MAC,Secret)前16字节
    1 AuthValueProvisioner = SHA256(ProductID,MAC,Secret,RandomProvisioner)前16字节 AuthValueDevice = SHA256(ProductID,MAC,Secret,RandomDevice)前16字节
    即将设备证书的ProductID,MAC,Secret,配网过程中的随机数通过字符串用英文逗号连接,然后进行SHA256摘要计算,取前16字节。注意这里用于计算SHA256的英文字母全部为小写。

    SHA256计算示例如下:

    数据字段 数据格式与示例 计算使用的输入字符串
    Product ID 十进制数值:168930,对应十六进制数值:0x293e2 "000293e2"
    MAC地址 "AB:CD:F0:F1:F2:F3"(扫描到的蓝牙设备MAC地址) "abcdf0f1f2f3"
    Device Secret "53daed805bc534a4a93c825ed20a7063" "53daed805bc534a4a93c825ed20a7063"
    连接后字符串Device "000293e2,abcdf0f1f2f3,53daed805bc534a4a93c825ed20a7063"
    SHA256结果输出(HEX) c1 c7 67 41 55 32 36 fb 7d a0 a5 86 e6 22 98 c2 31 da c2 88 5e 73 5f eb a6 b8 b441 7c 7d 9e 72
    AuthValue(HEX) c1 c7 67 41 55 32 36 fb 7d a0 a5 86 e6 22 98 c2
  • Provisioning Confirmation阶段。

    这个阶段,天猫精灵音箱和mesh设备会使用Static OOB方式来做认证,如果天猫精灵和mesh设备两边计算得到的Confirmation值不相同,则认证失败,结束流程。 mesh协议在此阶段中有一个步骤是设备端生成一个随机数并发送给天猫精灵,天猫精灵会把这个随机数发送给云端鉴权,云端会保存设备端每次发送的随机数,如果设备端发送的随机数是之前使用过的,则云端将会拒绝该设备配网,所以务必保证每次生成的随机数都不重复。

  • Provisioning Data阶段。

    对于多Element设备,天猫精灵在该阶段只会下发Primary Element的Unicast Address。其余Element的Unicast Address则根据上一Element的地址自行增加1。

  • Provision完成配置阶段。

    天猫精灵在Provisioning Complete之后,会下发AppKey。其余配置根据UUID版本有以下区别:

    UUID版本 配置方式
    0 天猫精灵会下发一次主element的Config_Model_App_bind,设备需要返回成功的status,否则会配网失败;剩余model需要自行绑定AppKey。天猫精灵会下发一次主element的Config_Model_Subscription_Add,设备需要返回成功的status,否则会配网失败;剩余model需要自行绑定Subscription Address。
    1 天猫精灵不会下发Config_model_app_bind和Config_Model_Subscrption_Add消息。IOT设备需要自行给所有Element的所有model绑定下发的AppKey,并根据产品类型为各个model订阅相应的组播地址(具体品类组播地址请参阅各产品软件规范)。蓝牙mesh设备完成配网后需要进行消息上报,上报消息包括该设备所有支持的可上报的属性。
    说明 当前主要使用UUID版本1,版本0已不推荐使用。

mesh数据发送和接收

  • 数据接收

    通常情况下,我们建议设备端的scan window/interval/period分别为10ms/10ms/100ms。

  • 数据发送

    mesh数据发包每次持续时间200ms左右,每次发包间隔20ms,每次打包向37/38/39三个广播频段同时发送数据。当发送长包时,每个分包数据按上述时序发送完毕后,即发送下一个分包数据。

    当发送长包时,每个分包数据按上述时序发送200ms,当第一个分包数据发送完后马上发送第二个分包数据,按次时序发送分包数据后,等待min(400,200+100*TTL+120*segNum)ms后进行重传,建议重传次数不多于3次。发送数据TTL建议不大于3。

设备发包时序

设备状态上报

  • 设备在属性发生变化时,需要向天猫精灵订阅地址(0xF000)发送状态改变的Vendor Model Indication消息。
  • Indication发包规则

    发送Indication数据包,之后scan400ms,如果收到天猫精灵回复的Confirmation数据包,则停止发送,否则需要重发直到收到Confirmation数据包,重发时间不短于30秒。

  • 设备控制/查询场景

    当设备接收到下行的控制或查询指令时,首先按照协议规定回复对应的状态消息;如果此时设备状态发生了变化,则需要通过Indication再次上报设备状态。具体交互流程可参照下图。

    indication_s1
  • 设备主动上报场景

    当设备状态因为其他原因(用户直接操作设备、设备达到一定条件等其他因素后)发生改变时,设备需要使用Indication主动上报设备当前的状态(仅上报改变的具体某一状态,不需要上报设备所有属性)。当某些设备需要持续上报状态时(比如温湿度传感器,缺水状态上报,材料短缺上报等),此类消息上报的时间间隔不小于30秒(上报内容根据业务场景由各设备自行决定,原则上上报的数据越少越好);如上报频率过高,可能会导致该产品上行链路被限制。

    indication_s2

设备seq规则

蓝牙mesh设备需要区分不同地址的seq,要求至少支持10个unicast address的seq存储,该seq列表在设备上电期间要求保持连续更新。

TID规范

当mesh消息中包含TID字段(如Generic OnOff Set指令、Vendor Message Attr Set指令等)时,需要遵守以下规则。

  • 所有有关联的业务使用相同的TID,比如设备接收到设置或查询指令时,设备回复到状态消息的TID(如果有)必须与下行到设置或查询指令中包含到TID一致。
  • 设备主动上行使用的TID范围为128~191(0x80~0xBF)。
  • 当mesh设备收到一条发送给本设备(或本设备属于目标组)时,记录该TID;如果设备在在6秒内收到相同TID的消息,忽略后收到的消息(需要回复对应的状态消息,但业务层面不处理该消息);被记录的TID在6秒后丢弃。
  • 当消息当目标设备不是本设备(或本设备不属于目标组)时,忽略该消息,并且不记录TID。

组播地址

  • 蓝牙mesh设备每个element要求至少支持8个组播地址,蓝牙mesh设备丢弃超过8个的组播地址设置。
  • 设备默认品类组播地址参考各产品软件规范中详细说明,设备需要在Provision完成配置阶段将设备上所有element的所有model与相应的组播地址进行绑定。
  • 用户在配置设备位置、别名时,天猫精灵会修改设备的组播地址;在该过程中,天猫精灵会对设备上某个element的其中一个model进行组播地址的配置(增加/删除),设备需要将接收到的组播地址的配置(增加/删除)同步至该element上所有的model。

心跳功能

  • 蓝牙mesh设备要求支持heartbeat功能,具体配置消息参考Mesh Profile Specification
  • 对于支持心跳功能的设备,将会通过给设备主elemet配置心跳设置参数进行设置。要求设备能严格按照所配置的参数发出对应的心跳包,发包规则参考mesh数据发送和接收
  • 当心跳参数中对应的心跳包发送次数为无限次时,设备需要保存该心跳参数,在设备断电或重启后,重新加载该心跳参数。

IV Index Update

为保证天猫精灵智能家居设备能够长时间稳定运行,对于的IV index update过程中做了如下要求:
  • 模组在seq number达到0xB0E500的时候开始进行IV Index Update流程。
  • 由于很多低功耗设备会一直处于睡眠或断电状态,无法进行计时,所以我们要求忽略协议里规定的入网96小时之后才能进行IV index update和Recovery的时间限制。
  • 要求如果设备在返回网络后收到第一个secure network beacon的IV index等于当前设备的IV index+1且IV Update Flag为0,应选择直接进行IV Index update,而不应忽略Secure Network Beacon。
  • 对于需要长时间休眠的低功耗设备,为了防止无法接收到IV更新信息,要求设备至少每48小时唤醒一次,且进行至少15秒及以上的连续扫描。

设备上电与重启规范

  • 蓝牙mesh设备上电后需要延迟随机0~10秒后使用Vendor Model Indication进行消息上报,上报消息包括该设备所有支持的可上报的属性和上电消息,注意需要把设备属性和上电消息分开上报,先上报设备属性,再上报上电消息。设备上电消息示例如下。
    0xD4 0xA8 0x01 0x80 0x09 0xF0 0x03
    Opcode TID Attr Name Event
    0xD401A8 0x80 事件上报 设备上电
  • 蓝牙mesh设备重启规范参照设备上电规范,将设备重启视作设备上电。

设备复位规范

在设备复位后,再次进行配网时,要求设备在Provision完成配置阶段按照各产品规范中定义的默认配置重新配置组播。当设备进行复位时,设备根据根据各产品规范决定是否删除设备应用配置信息(比如风扇的开关状态,冰箱设置的各区域温度等应用层面的配置)。当设备进行复位时,如果存在GATT链接,要求断开所有GATT连接。

  • 软件复位(解除配网)

    蓝牙mesh设备需要支持通过Config Node Reset的软复位的方法来移除节点,当设备进行软件复位的时候,移除设备上保存的配网信息,设备进入未配网广播状态。同时根据各产品特性决定是否删除设备配置信息。如果在软件复位过程中需要重启设备,则要求此时尽可能不影响设备正常工作。

  • 硬件复位(恢复出厂设置)
    蓝牙mesh设备通过硬复位恢复模块出厂设置时,需要移除设备上保存的配网信息,设备进入未配网广播状态。蓝牙mesh设备进行硬件复位时,首先需要上报解除配网消息,当完成解除配网消息上报后(如上报消息未收到对应的回复,要求上报时间至少持续3秒)再进行硬件复位动作(删除配网信息、进入未配网广播状态等动作)。
    0xD4 0xA8 0x01 0x80 0x09 0xF0 0x23
    Opcode TID Attr Name Event
    0xD401A8 0x80 事件上报 硬件复位

OTA升级

模组需要根据自身产品形态支持通过天猫精灵音箱 OTA和通过天猫精灵APP OTA两种升级方式。具体请参看t1911582.html#task_2542338

精灵低功耗(GLP)

如果模组要应用于下行数据接收的低延时低功耗设备(例如单火开关,电池供电的窗帘电机)时,可以采用精灵低功耗(Genie Low Power)方案,在开放平台上创建产品时在属性里选择精灵低功耗,这样精灵在给这个设备发送数据的时候,会在1.2s的时间内持续不断地发送数据。所以设备只需要每1.2s醒来60ms,可以在低功耗的情况下能及时接收到精灵下发的数据。

相比LPN方案需要低功耗节点与Friend节点需要建立连接,精灵低功耗的方案无需建立连接,并且休眠和激活的占空比是固定的,可以精确的计算出设备的待机功耗。