天猫精灵蓝牙BLE基础规范
文档目标
本文档对阿里巴巴物联平台的蓝牙BLE设备的接入规范进行了详细定义,包括蓝牙广播规范和蓝牙接入服务规范等,可以供阿里巴巴的合作厂商作为阿里巴巴物联平台蓝牙设备的接入标准。本文档供阿里巴巴及合作厂商与项目相关的产品经理、项目经理、软硬件技术开发人员和测试人员参阅。
本文档中红色字体部分表示重点关注。
版权声明
本文档可能包含本公司技术机密以及其他需要保密的信息,文档所包含的所有信息均为阿里巴巴集团版权所有。未经本公司书面许可,不得向授权许可方以外的任何第三方泄露本文档内容,不得以任何形式擅自复制或传播本文档。若使用者违反本版权保护的约定,本公司有权追究使用者由此产生的法律责任。
术语、定义和缩写
缩写 | 说明 |
---|---|
GMA | 全称Genie Mobile Accessory,中文移动精灵;是天猫精灵低功耗蓝牙、经典蓝牙相关业务能力的统称。本文档是GMA的BLE基础规范 |
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组成。如下图所示:
具体定义如表所示:
字节序 | 名称 | 值 | 说明 |
---|---|---|---|
0 | Length | 0x0F | Manufacturer Specific Data Length |
1 | Type | 0xFF | Manufacturer Specific Data Type |
2~3 | CID | 0x01A8 | Company Identifiers,0x01A8为阿里巴巴公司编码 |
4 | VID 和Subtype | 0xb5 | Bit3~Bit0 阿里巴巴蓝牙规范版本号,当前版本号为5,值为0b0101。Bit7~Bit4 Subtype类型,会影响广播的格式。本文档使用蓝牙GATT类型,值为0b1011。故最终取值为0xb5 |
5 | FMSK | 0x03 | SDK提供能力Function Mask,比如安全、OTA、蓝牙版本、安全广播等 |
6~9 | PID | XX…XX | 产品Product ID,4字节,由阿里巴巴物联网平台颁发 |
10~15 | MAC | XX…XX | 蓝牙设备MAC地址,6字节,厂商唯一设备地址 |
Subtype用于区分不同的广播类型,定义如下:
Subtype | 类型说明 | 说明 |
---|---|---|
0b1001 | 蓝牙Beacon类型 | 需要另行参照《蓝牙广播规范》实现相关要求 |
0b1010 | 蓝牙语音类型 | 需要另行参照《蓝牙语音规范》实现相关要求 |
0b1011 | 蓝牙GATT类型 | 本文档描述的类型 |
Subtype只影响广播中5~n字节的数据格式。本文档采用蓝牙GATT类型进行描述。其他SubType的广播格式定义请参考对应的文档实现。通常一类设备只需要实现一种广播类型。
其中,FMSK各Bit位定义如下:
Bit序 | 功能说明 |
---|---|
0~1 | 蓝牙版本,00:BLE4.0 01:BLE4.2 10:BLE5.0 11:BLE5.0以上 |
2 | 1:支持OTA 0:不支持 |
3 | 安全模式,填0 |
4 | 0:一型一密 1:一机一密 |
5 | 广播模式,填0 |
6~7 | 保留将来使用 |
需要注意的是:上述广播中的数据必须按照小端(Little-Endian)格式存储。
服务规范
对于接入阿里巴巴平台的蓝牙设备,必须遵守阿里巴巴自定义的蓝牙服务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 |
数据格式
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 | 数据加密指示 | 填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对应。
3、异常上报:
0x0F :指令异常通知,用于蓝牙设备通知手机App,设备接收到错误的指令或流程出错。
4、其他指令:
为满足业务需求定义的其他指令,详见各个应用,如:空中升级(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 = AES128(Random)。即:以BLE Key作为密钥,加密Random生成密文Cipher。其中加密算法使用AES128 CBC,取前16字节。
5、安全认证通过后,数据传输使用密文形式, 加密算法使用AES128 CBC,密钥使用BLE Key。
6、在认证过程中,云端保证设备身份的不会变化,并且是属于有效用户的合法设备。
7、手机每次连接会请求生成新的BLE Key,每次断开连接后,设备和手机需要清除当前使用的BLE Key。
8、BLE Key计算过程参数示例如下:
数据字段 | 数据格式与示例 | 计算使用的输入字符串 |
---|---|---|
Random | 随机字符串:”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长度 | 说明 |
---|---|---|---|
0x14 | 0x00或0x01 | 1字节 | 通知设备配网/解绑结果。0x00:解绑,0x01:配网 |
6、0x15:设备回复配网成功结果
CMD | Payload | Payload长度 | 说明 |
---|---|---|---|
0x15 | 0x01 | 1字节 | 配网/解绑成功ack |