本文对低端蓝牙设备(只能广播数据,不能交互)的BLE广播接入规范进行了详细定义。
广播规范
蓝牙广播包格式遵循蓝牙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。广播中的数据必须按照小端(Little-Endian)格式存储。
类别 | 字段 | 字节数 | 取值 | 说明 |
---|---|---|---|---|
Flags | length | 1 | 0x2 | Flags length |
AD Type | 1 | 0x1 | Flags Type | |
Flags | 1 | 0x2 | Flags Value | |
Manufacturer Specific Data | Length | 1 | 根据实际长度 | Manufacturer Specific Data Length |
AD Type | 1 | 固定 0xFF | Manufacturer Specific Data Type | |
Company ID | 2 | 固定 0x01A8 | Company Identifiers,0x01A8为阿里巴巴公司编码 | |
VID和Subtype | 1 | 0x95 | 取值为0x95
|
|
Payload | 可变 | 实际报文内容 | 无 |
数据传输规范
- 非交互式广播规范采用标准BLE广播的方式,数据传输采用单包形式,不支持分包。
- 数据包的Payload由以下字段组成。
字段 字节数 说明 FMSK 1 FMSK用于表示设备具有的能力 ProductID 2 平台颁发,一型一号 MAC地址 6 平台颁发,一机一号 Random 3 Random数据 Data 0~N 实体数据 CRC 1 CRC签名校验 - FMSK用于表示设备具有的能力,各比特位定义如下。
比特序 说明 0 是否是交互式广播,0:非交互式,1:交互式。非交互式广播填0 2~1 蓝牙广播规范版本,目前为 0b00 7~3 保留将来使用,全部填0 - Random 和 Digest 用于表示设备的身份。
- 定义Random是3字节的随机字节,必须采用真随机算法,可以使用adc采样值来作为随机种子。
- 三元组(又称设备证书,ProductKey、DeviceName、DeviceSecret)预先烧录在设备中。为了保证安全,Secret不进行空中传播,也不会传递到手机端。
- 定义
Data = ali_encrypt(Secret, Random)
,厂商自定义数据。ali_encrypt是我们针对低端蓝牙设备设计的一种加密算法,由平台提供。说明 ali_encrypt由平台提供,如有需要请联系商务获取。 - 定义
CRC=CRC16(Secret, Data)
,取低位字节。
数据Payload说明
- 如果需要厂商使用自定义的数据格式,需到云端配置脚本实现数据转换。
- 根据使用场景,厂商自定义数据为空时候,需要用常量来填充。
- 常量(ASCII字符串)"BIND":用于设备绑定的标识,设备上电后一般不会产生数据,用该常量进行填充。
广播收发规范
- 设备手动上电后,需要连续广播包2分钟,由于自定义数据这个时候为空,需要用常量BIND来填充。
- 绑定设备成功后,App在进入面板后需要实时的扫描目标设备的广播包(天猫精灵音箱则是一直实时扫描)。
- 对设备广播的频率,需要进行如下约定:上报频率较低的设备,体脂秤等,一次有效数据需要持续5秒的时间。对于一次有效数据,5秒之内发送同一个数据包,其Random保持不变。