文档目标
本文档对阿里巴巴物联平台的蓝牙设备的接入规范进行了详细定义,包括蓝牙广播规范和蓝牙接入服务规范等,可以供阿里巴巴的合作厂商作为阿里巴巴物联平台蓝牙设备的接入标准。本文档供阿里巴巴及合作厂商与项目相关的产品经理、项目经理、软硬件技术开发人员和测试人员参阅。
术语定义
|   缩写  |  
             说明  |  
          
|   BLE  |  
             Bluetooth Low Energy 低功耗蓝牙  |  
          
|   AD  |  
             Advertisement广播  |  
          
|   GATT  |  
             Generic Attribute Profile蓝牙通用属性协议  |  
          
|   CID  |  
             Company IdentifierCode 公司识别码  |  
          
|   VID  |  
             Protocol Version Code协议版本号  |  
          
|   PID  |  
             Product ID产品类型识别码  |  
          
|   FMSK  |  
             Function Mask 功能使能掩码  |  
          
|   MAC  |  
             Media AccessControl媒介访问地址  |  
          
|   AIS  |  
             Alibaba IoT Service阿里巴巴物联网服务  |  
          
广播规范
蓝牙广播包格式遵循蓝牙4.0规范,由若干AD Structure组成(参见Bluetooth 4.2 Core Specification, Volume 3, Part C, Chapter 11),每一个ADStructure结构由Length、AD Type、AD Data组成。如下图所示:

广播数据包格式
接入阿里巴巴物联平台的蓝牙设备的广播包必须包含阿里巴巴制定的厂商自定义格式(Manufacturer Specific Data,AD Type:0xFF)。阿里巴巴自定义广播格式总共由(6+n)字节组成,不同广播类型,对应不同的n值和Content。如下图所示:
具体定义如表所示:
|   字节序  |  
             名称  |  
             值  |  
             说明  |  
          
|   0  |  
             Length  |  
             0x0F  |  
             Manufacturer Specific Data Length,本文档使用基础类型,故取值为基础类型的长度  |  
          
|   1  |  
             Type  |  
             0xFF  |  
             Manufacturer Specific Data Type  |  
          
|   2~3  |  
             CID  |  
             0x01A8  |  
             Company Identifiers,0x01A8为阿里巴巴公司编码  |  
          
|   4  |  
             VID 和Subtype  |  
             0x85  |  
             Bit3~Bit0 阿里巴巴蓝牙规范版本号,当前版本号为5,值为0b0101。Bit7~Bit4 Subtype类型,会影响广播的格式。本文档使用基础类型,值为0b1000。故最终取值为0x85  |  
          
|   5  |  
             FMSK  |  
           0x03 | SDK提供能力Function Mask,比如安全、OTA、蓝牙版本、安全广播等 | 
|   6~n  |  
             Content  |  
             xx...xx  |  
             对应Subtype的内容数据  |  
          
Subtype用于区分不同的广播类型,定义如下:
| Subtype |   类型说明  |  
             说明  |  
          
|   0b1000  |  
             蓝牙基础类型  |  
             本规范即为基础类型的规范  |  
          
|   0b1001  |  
             蓝牙Beacon类型  |  
             需要另行参照《蓝牙Beacon规范》实现相关要求  |  
          
| 0b1010 | 蓝牙语音类型 |   需要另行参照《蓝牙语音规范》实现相关要求  |  
          
|   0b1011  |  
             蓝牙GATT类型  |  
             需要另行参照《天猫精灵BLE数据传输规范》实现相关要求  |  
          
Subtype只影响广播中5~n字节的数据格式。本文档采用基础类型进行描述。其他SubType的广播格式定义请参考对应的文档实现。通常一类设备只需要实现一种广播类型。
FMSK用于表示设备具有的能力,各Bit位定义如下:
|   Bit序  |  
             功能说明  |  
          
|   0~1  |  
             蓝牙版本,00:BLE4.0, 01:BLE4.2, 10:BLE5.0, 11:BLE5.0以上  |  
          
|   2  |  
             0:不支持OTA,1:支持OTA  |  
          
|   3  |  
             0:不进行安全认证 1:进行安全认证,详细流程参考安全认证章节  |  
          
|   4  |  
             0:一型一密 1:一机一密  |  
          
|   5  |  
             配网标识,0:未配网,1:已配网  |  
          
|   6~7  |  
             保留将来使用,全部填0  |  
          
基础类型广播格式
基础类型SubType对应0x00,广播长度为16字节,数据格式如下:
|   字节序  |  
             名称  |  
             值  |  
             说明  |  
          
|   6~9  |  
             PID  |  
             0x00ef1000  |  
             产品Product ID,4字节,由阿里巴巴物联网平台颁发  |  
          
|   10~15  |  
             MAC  |  
             0xb0b448d07882  |  
             蓝牙设备MAC地址,6字节,厂商唯一设备地址  |  
          
需要注意的是:上述广播中的数据必须按照小端(Little-Endian)格式存储。广播中的 Service UUID为0xFEB3。
服务规范
对于接入阿里巴巴平台的蓝牙设备,必须遵守阿里巴巴自定义的蓝牙服务AIS(Alibaba IoT Service)。
AIS服务声明
AIS服务声明为Primary Service,Service UUID为0xFEB3。
AIS Characteristics说明
AIS服务包含以下5个Characteristics:
|   Characteristics Name  |  
             Characteristics UUID  |  
             Requirement  |  
             Properties  |  
             Permission  |  
          
|   Read Characteristics  |  
             0xFED4  |  
             Mandatory  |  
             Read  |  
             Read  |  
          
|   Write Characteristics  |  
             0xFED5  |  
             Mandatory  |  
             Read /Write  |  
             Write  |  
          
|   Indicate Characteristics  |  
             0xFED6  |  
             Mandatory  |  
             Read /Indicate  |  
             None  |  
          
|   WriteWithNoRsp Characteristics  |  
             0xFED7  |  
             Mandatory  |  
             Read /Write with No Response  |  
             Write  |  
          
|   Notify Characteristics  |  
             0xFED8  |  
             Mandatory  |  
             Read /Notify  |  
             None  |  
          
数据传输规范
由于蓝牙4.0一次只能发送20字节的有效数据,当一包数据超过20字节时,蓝牙无法一次完成数据的传送,所以在发送长数据包时,需要发送时拆包,接收时组包。
最大数据长度
不同的蓝牙版本下,蓝牙在应用层可以传输长度和本规范应用数据长度如下表所示。下文用N代表规范数据长度。
|   BLE版本  |  
             应用层数据长度  |  
             规范数据长度(N)  |  
          
|   BLE4.0  |  
             20  |  
             16  |  
          
|   BLE4.2  |  
             244  |  
             240  |  
          
|   BLE5.0  |  
             244  |  
             240  |  
          
注:部分手机系统支持最长数据长度已经超过244,此规范规定应用层数据长度上限 244,超过244按照 244处理。合规应用层最长数据长度 20-244。
数据格式
|   Header  |  
             PayLoad  |  
          
|   4字节  |  
             0~N字节  |  
          
1、每一包数据由Header,Payload组成。
2、Header长度四字节,主要包含信息指示、消息长度、序号、拆包总数等。
3、Payload 长度0~N字节。
4、消息长度超过N字节时,分成多帧发送,接收到后按照Header描述重新组包。
数据格式定义

Header占用四字节,PayLoad数据长度为0~N字节,一包数据长度在4~4 + N字节。
1、Header:Byte 0:数据加密标示、消息ID指示等,说明如下:
|   Bit序  |  
             说明  |  
             备注  |  
          
|   0~3  |  
             消息ID,Msg ID  |  
             1、每发送一条消息ID加1 2、如果消息有应答时,应答的消息ID需要和请求的消息ID匹配 3、ID超过15,自动循环到1  |  
          
|   4  |  
             数据加密指示  |  
             1:加密,0:未加密  |  
          
|   5~7  |  
             版本信息  |  
             填0  |  
          
2、Header:Byte 1:指令类型,见下文“指令类型”定义。
3、Header:Byte 2:消息帧数及帧序号,说明如下:
|   Bit序  |  
             说明  |  
             备注  |  
          
|   0~3  |  
             帧序号  |  
             取值0~15,帧序号从0开始计数  |  
          
|   4~7  |  
             总拆包帧数  |  
             1、取值0~15,故实际的总拆包帧数等于(Bit4~Bit7)的值加1 2、PayLoad为空时,Header中的Byte2、Byte3全为零  |  
          
4、Header:Byte 3:帧数据长度。蓝牙4.0数据长度0~16,对于蓝牙4.2及以上版本长度是0~240。
5、PayLoad:有效数据: 蓝牙4.0数据长度0~16,对于蓝牙4.2及以上版本长度是0~240。Payload使用小端(Little-Endian)格式传输。
指令类型
指令类型:占用一个字节。蓝牙设备应用层和手机App交互的指令。
1、设备主动上报:
0x01 :蓝牙设备主动上报的设备状态。
2、Request-Response模型:
0x02 :手机App发出请求指令,需要设备回复,与0x03对应。
0x03 :蓝牙设备回复请求指令,与0x02对应。
0x04 :蓝牙设备发出请求指令,需要手机回复,与0x05对应。
0x05 :手机回复请求指令,与0x04对应。
3、下发命令
0x06:手机App发送指令,无需对方回复。
4、主动获取Manufacturer Specific Data
0x07:手机App发出请求Manufacturer Specific Data的请求指令,需要设备回复,与0x08对应。
0x08:蓝牙设备回复Manufacturer Specific Data,与0x07对应。
5、异常上报:
0x0F :指令异常通知,用于蓝牙设备通知手机App,设备接收到错误的指令或流程出错。
6、其他指令:
为满足业务需求定义的其他指令,详见各个章节,如:空中升级(OTA)定义了相关的指令集。
注:0x01,0x02,0x03为通用指令,Payload格式不做限制,由使用方自行定义。
异常处理
1、 蓝牙设备接收到错误的指令时,直接抛弃,并通过指令0x0F通知手机App指令错误。
2、 当空中升级(OTA)禁止时,蓝牙设备收到OTA指令时,直接抛弃,并通过指令0x0F通知手机App指令错误。
消息ID(MsgID)规范
MsgID用于设备端和App端请求指令和回复指令做一一对应使用。由SDK内部维护。
1、设备主动上报状态时,MsgID置0。
2、App下发指令需要设备端应答时,设备端保存MsgID,设备的回复指令填充相同的MsgID。
3、MsgID取值范围1~15。App每次下发需要设备端应答的指令时,MsgID加1,到15时,自动循环到1。
4、空中升级(OTA)场景下,MsgID均置0。
数据长度
蓝牙数据拆包后,拆包数量不超过16个,蓝牙4.0每一包最长16字节,故总数据长度不超过256Bytes。蓝牙4.2以上,总数据长度不超过3840Bytes。空中升级(OTA)固件长度不受此限制。
数据的接收发送规范
蓝牙设备的数据发送、接收按照串行的方式,在SDK中维护。一条消息(表示需要拆包的完整的数据)发送完成,才能发送下一条消息,或者接收下一条消息。
安全认证
安全认证主要用于设备和手机互相校验身份,避免仿冒情况,应用于安全性要求较高的设备或场景,安全认证需要依赖云端能力。使用安全认证的设备,需要将广播的FMSK第三个Bit位置为0b1。手机在每次连接的时候,会进行安全认证流程。安全认证通过后,手机和设备的数据传输会通过密文传输。
安全认证是可选实现,可以根据设备的安全性要求或实际业务场景选择使用。
算法和安全说明
1、PID,MAC,Secret是云端分配的数据,预先烧录在设备中。为了保证安全,Secret不进行空中传播,也不会传递到手机端。
2、定义Random是16字节随机字符串,每次生成的Random必须不同。
3、定义BLE Key = SHA256(Random,PID,MAC,Secret)的。即:将Random,PID,MAC,Secret四个值的字符串数据用英文逗号连接,然后进行SHA256摘要计算,取前16字节。
4、定义Cipher = AES128BLE Key(Random)。即:以BLE Key作为密钥,加密Random生成密文Cipher。其中加密算法使用AES128 CBC,取前16字节。
5、安全认证通过后,Payload数据传输使用密文形式, 加密算法使用AES128 CBC,密钥使用BLE Key。
6、在认证过程中,云端保证设备身份的不会变化,并且是属于有效用户的合法设备。
7、手机每次连接会请求生成新的BLE Key,每次断开连接后,设备和手机需要清除当前使用的BLE Key。
8、BLE Key计算过程参数示例如下:
|   数据字段  |  
             数据格式与示例  |  
             计算使用的输入字符串  |  
          
|   Random  |  
             随机utf-8字符串:"drfiHgbsvomOieog"  |  
             "drfiHgbsvomOieog"  |  
          
|   英文逗号  |  
             英文逗号:","  |  
             ","  |  
          
|   PID  |  
             十进制数值:168930,对应十六进制数值:0x293e2  |  
             "000293e2"  |  
          
|   英文逗号  |  
             英文逗号:","  |  
             ","  |  
          
|   Mac Address  |  
             "AB:CD:F0:F1:F2:F3"(扫描到的蓝牙设备MAC地址)  |  
             "abcdf0f1f2f3"  |  
          
|   英文逗号  |  
             英文逗号:","  |  
             ","  |  
          
|   Secret  |  
             字符串:"atFY1tGDCo4MQSVCGVDqtti3PvBI5WXb"  |  
             "atFY1tGDCo4MQSVCGVDqtti3PvBI5WXb"  |  
          
|   连接后字符串形式  |  
             "drfiHgbsvomOieog,000293e2,abcdf0f1f2f3,atFY1tGDCo4MQSVCGVDqtti3PvBI5WXb"  |  
          |
交互流程
指令集
1、0x10:手机发起开始认证流程,下发Random
|   CMD  |  
             Payload  |  
             Payload长度  |  
           说明 | 
|   0x10  |  
             0x...  |  
             16字节  |  
             Random数据  |  
          
2、0x11:设备认证流程,生成密文Cipher
|   CMD  |  
             Payload  |  
             Payload长度  |  
           说明 | 
|   0x11  |  
             0x...  |  
             16字节  |  
             Cipher数据  |  
          
3、0x12:下发校验结果到设备
|   CMD  |  
             Payload  |  
             Payload长度  |  
           说明 | 
|   0x12  |  
             0x00或0x01  |  
             1字节  |  
             0x00:成功,0x01:失败  |  
          
4、0x13:设备返回BLE Key处理结果
|   CMD  |  
             Payload  |  
             Payload长度  |  
           说明 | 
|   0x13  |  
             0x00或0x01  |  
             1字节  |  
             0x00:成功,0x01:失败  |  
          
5、0x14:通知设备配网成功
|   CMD  |  
             Payload  |  
             Payload长度  |  
           说明 | 
|   0x13  |  
             0x00或0x01  |  
             1字节  |  
             通知设备配网/解绑结果。0x00:解绑,0x01:配网  |  
          
6、0x15:设备回复配网成功结果
|   CMD  |  
             Payload  |  
             Payload长度  |  
           说明 | 
|   0x15  |  
             0x01  |  
             1字节  |  
             配网/解绑成功ack  |  
          
参考资料
- Bluetooth4.2 Core Specification
 - Bluetooth CoreSpecification Supplement v5
 
                
            
