本文在蓝牙技术联盟发布的Mesh Profile的基础上,做了一些协议上的定制,细化了部分协议规则,作为蓝牙Mesh模组软件规范,指导芯片或者模组厂家软件设计,开发智能单品并对接生活物联网平台,包括自有品牌项目与天猫精灵生态项目均遵循本规范。

名词解释

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

基本要求

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

UUID格式

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

字段size(字节数)描述
CID2Company Identifier,公司标识符。阿里巴巴的标识符为0x01A8。
PID1
  • bit3~0 :蓝牙广播包版本号,目前是0x01
  • bit4为1:一机一密
  • bit5为1:支持OTA
  • bit7~6:蓝牙协议版本
    • 00:BLE4.0
    • 01:BLE4.2
    • 10:BLE5.0
    • 11:BLE5.0以上
ProductID4生活物联网平台颁发,一型一号。
MAC地址6生活物联网平台颁发,一机一号,蓝牙Mesh设备的MAC地址与Device Name一致。
FeatureFlag1
  • bit0 :广播状态
    • 0:处于未配网广播状态
    • 1:处于静默广播状态
  • bit7~1 :UUID版本号,目前版本为2
    • 0b0000000:该版本配网流程遵循蓝牙Mesh标准规范;已不推荐使用该版本。
    • 0b0000001:该版本优化了配网流程并需要支持Vendor Model,参考蓝牙Mesh设备扩展协议
    • 0b0000010:该版本支持版本1的所有约定,并新增了一些Mesh新特性,具体见FeatureFlag2的标志位的定义。
FeatureFlag11
  • bit0:极速配网标志位,不支持极速配网必须置0
  • bit1:扩展AuthValue标志位
  • bit2:BLE广播配网标志位,不支持该方案必须置0
  • bit3:Combo Mesh标志位,不支持Combo Mesh必须置0,仅在Genie Mesh SDK中使用
  • bit7~4:标准Mesh:Genie BT Mesh Stack标志,未使用Genie Mesh SDK的必须置0,现已用于芯片型号编码及Tiny Mesh方案区分
FeatureFlag21
  • bit0:Mesh大规模节点优化使能标志位,使能置1,关闭置0
  • bit1:支持组播地址列表overwrite指令标志位,不支持必须置0
  • bit2:Remote Provisioning标志位,不支持必须置0
  • bit3:配网时是否需要给设备发送AppKey1,1:不发送,0:要发送
  • bit4:极速配网2.0标志位,支持置1,不支持必须置0
  • bit5:新的统一定时协议(DeviceTimer)标志位,支持置1,不支持置0
  • bit6~7:Reserved for future use, 必须置0
说明
  • 上表中的RFU保留字段和要求置0的字段必须全部置为0。在产品生命周期中,当产品的ProductID、MAC地址未变化时,CID、PID不允许发生变化。
  • 对于UUID版本号为1时,FeatureFlag2是作为RFU字段使用的,由于历史原因,存在很多不规范的脏数据,因此不作为Mesh新特性标志位的使用,对于UUID版本号为2时,FeatureFlag2是作为Mesh新特性标志位来使用。
  • Genie Mesh SDK获取与对接的联系方式请参见获取SDK

蓝牙Mesh广播包格式

  • 未配网广播 Unprovisioned Device Beacon

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

    未配网广播数据示例如下:
    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
  • PB-GATT广播

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

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

  • AIS广播

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

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

  • Proxy广播

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

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

广播包发送规则

  • 设备状态与切换规则

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

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

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

  • 配网状态

    设备同一时间只允许建立一个配网连接(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计算方法
    0AuthValue = SHA256(Product ID,MAC,Secret)前16字节
    1AuthValueProvisioner = SHA256(ProductID,MAC,Secret,RandomProvisioner)前16字节,AuthValueDevice = SHA256(ProductID,MAC,Secret,RandomDevice)前16字节
    即将设备证书的ProductID,MAC,Secret,配网过程中的随机数通过字符串用英文逗号连接,然后进行SHA256摘要计算,取前16字节。注意这里用于计算SHA256的英文字母全部为小写。注意自有品牌项目扩展AuthValue标志位必须为1。

    扩展AuthValue标志位为0时的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)c1c76741553236fb7da0a586e62298c231dac2885e735feba6b8b4417c 7d9e72
    AuthValue(HEX)c1c76741553236fb7da0a586e62298c2

    扩展AuthValue标志位为1时的SHA256计算示例如下:

    数据字段数据格式与示例计算使用的输入字符串
    Product ID十进制数值:168930,对应十六进制数值:0x293e2"000293e2"
    Mac Address"AB:CD:F0:F1:F2:F3"(扫描到的蓝牙设备MAC地址)"abcdf0f1f2f3"
    Secret"53daed805bc534a4a93c825ed20a7063""53daed805bc534a4a93c825ed20a7063"
    RandomDevice"7889b0af417b967bdcd7b814d2bbffaf""7889b0af417b967bdcd7b814d2bbffaf"
    RandomProvisioner"aa484b099ae4c7762fcb1b71968ba7df""aa484b099ae4c7762fcb1b71968ba7df"
    连接后字符串Device"000293e2,abcdf0f1f2f3,53daed805bc534a4a93c825ed20a7063,7889b0af417b967bdcd7b814d2bbffaf"
    SHA256结果输出Device(HEX)0f66e504a5d3609c06db70162345a0375d9b9d71d4cbe346a1c55d5c25738329
    AuthValueDevice(HEX)0f66e504a5d3609c06db70162345a037
    连接后字符串Provisioner"000293e2,abcdf0f1f2f3,53daed805bc534a4a93c825ed20a7063,aa484b099ae4c7762fcb1b71968ba7df"
    SHA256结果输出Device(HEX)f45f15d1e38339b79fda5b63c3970ff01ba40285fe20b303ff332f54f8de729c
    AuthValueDevice(HEX)f45f15d1e38339b79fda5b63c3970ff0
  • Provisioning Confirmation阶段。

    这个阶段,生活物联网平台和Mesh设备会使用Static OOB方式来做认证,如果生活物联网平台和Mesh设备两边计算得到的Confirmation值不相同,则认证失败,结束流程。 Mesh协议在此阶段中有一个步骤是设备端生成一个随机数并发送给Mesh网关,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,2生活物联网平台不会下发Config_model_app_bind和Config_Model_Subscrption_Add消息。IoT设备需要自行给所有Element的所有model绑定下发的AppKey,并根据产品类型为各个model订阅相应的组播地址(具体品类组播地址请参阅各产品软件规范)。蓝牙Mesh设备完成配网后需要进行消息上报,上报消息包括该设备所有支持的可上报的属性。
    说明 当前三方接入主要使用UUID版本1,版本0已不推荐使用。版本2仅限Genie Mesh SDK使用。

Mesh数据发送和接收

  • 数据接收

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

  • 数据发送

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

    当发送长包时,每个分包数据按上述时序发送200ms,当第一个分包数据发送完后马上发送第二个分包数据,按次序发送分包数据后,根据需要可等待若干毫秒后进行重传。重传间隔不能小于400ms,建议按照重传间隔=(200ms+100ms*TTL+200ms*分包数)来计算。发送数据TTL建议不大于5。

设备发包时序

设备状态上报

  • 设备在属性发生变化时,需要向Mesh网关的订阅地址(0xF000)发送含状态变化后相应属性值的Vendor Message Attribute Indication消息或者Vendor Message Attribute Status消息。
    • 当待上报的属性值很重要(如安防报警消息),需要收到Mesh网关的回复才停止发送,可以发送Vendor Message Attribute Indication消息。
    • 当设备需要周期上报属性值时,一般发送Vendor Message Attribute Status消息,而非Vendor Message Attribute Indication消息。
    • 如部分上报消息对业务逻辑影响不大(如设备固件版本号等),建议发送Vendor Message Attribute Status消息。
  • Vendor Message Attribute Indication消息发包规则

    发送Indication消息,之后打开scan,如果在重传间隔内(参考Mesh数据发送和接收中关于重传间隔的约定)收到Mesh网关回复的Vendor Message Attribute Confirmation消息,则停止发送,否则可以重发若干次直到收到Confirmation消息。

  • Vendor Message Attribute Status消息发包规则
    • 注意减少不必要的消息发送,对业务逻辑影响不大的消息,控制重发次数。
    • 如果设备需要周期上报属性值,注意周期需要在几十秒以上的量级,最好是发送周期可以动态调整。
  • 无周期属性上报的设备的属性同步

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

    属性同步1
  • 有周期属性上报的设备的属性同步

    当设备接收到下行的控制指令时,首先按照协议规定回复对应的状态消息;如果此时设备状态发生了变化,则等待下一个上报周期到时再上报设备状态。具体交互流程可参照下图。

    属性同步2
  • 设备主动上报场景

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

    属性同步3

设备seq规则

  • 蓝牙Mesh设备需要区分不同单播地址的seq,建议支持至少10个unicast address的seq存储,各地址的seq在设备上电期间要求保持连续更新。
  • 多element设备重新配网,建议保存配网前各地址的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设备收到增加组播地址订阅配置消息(Config Model Subscription Add Message)时发现该element存储的组播地址已满时,需按照Mesh Profile Specification丢弃新增加的组播地址,并在组播地址订阅配置状态消息(Config Model Subscription Status Message)中Status Code字段返回错误码0x05(Insufficient Resources)。
  • 设备默认品类组播地址参考设备组播地址中的定义,设备需要在Provision完成配置阶段将设备上所有element的所有model与相应的组播地址进行绑定。
  • 用户在配置设备位置、别名时,生活物联网平台会修改设备的组播地址订阅;在该过程中,生活物联网平台会对设备上某个element的其中一个model进行增加或删除组播地址订阅配置(Config Model Subscription Add/Config Model Subscription Delete),设备需要将接收到的组播地址的配置(增加或删除)同步至该element上所有的model。

心跳功能

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

通用开关服务模型

支持开关功能(powerstate属性)的设备都必须支持通用开关服务模型(Generic On Off Server Model)。
  • 通用开关服务模型详细的消息格式定义请参考Mesh Model Specification
  • 设备需要实现对获取开关状态指令(Generic OnOff Get,Opcode 0x8201)的处理与响应,回复开关状态消息(Generic OnOff Status,Opcode 0x8204)。在回复开关状态消息时,只填充必选字段当前开关状态,不填充可选字段目标开关状态与剩余时间(作为生活物联网平台Mesh规范预留字段)。
    字段字段长度备注
    Opcode20x82 0x04
    当前开关状态(必选)1设备当前开关状态
    目标开关状态(不填充)1设备目标开关状态
    剩余时间(不填充)1设备切换到目标状态还剩余的时间

IV Index Update

为保证生活物联网平台Mesh设备能够长时间稳定运行,对于的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 Message Attribute Indication消息或者Vendor Message Attribute Status消息,上报消息包括该设备所有支持的可上报的属性(必选)和上电事件(可选),注意需要把设备属性和上电消息分开上报,先上报设备属性,再上报上电事件。设备上电事件示例如下。
    0xD4 0xA8 0x01 0x80 0x09 0xF0 0x03
    Opcode TID Attr Name Event
    0xD401A8 0x80 事件上报 设备上电
  • 蓝牙Mesh设备重启规范参照设备上电规范,将设备重启视作设备上电。

设备复位规范

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

  • 软件复位(解除配网)

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

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

OTA升级

模组需要根据自身产品形态支持通过BLE OTA升级。具体请参看蓝牙BLE OTA规范

精灵低功耗(GLP)

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

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