设备蓝牙协议
可以通过蓝牙扫描发现设备,并通过蓝牙连接与盒子交互。
设备提供的 GATT 服务
1)Service: Device info(0000180a-0000-1000-8000-00805f9b34fb)
本服务主要获取设备的基本信,characteristic 特征值如下表:
UUID | 说明 |
---|---|
00002a29-0000-1000-8000-00805f9b34fb | 厂商:MAGEWELL |
00002a24-0000-1000-8000-00805f9b34fb | 型号,例如:ULTRA STREAM HDMI |
00002a25-0000-1000-8000-00805f9b34fb | 设备序列号,例如:C301170101001 |
00002a26-0000-1000-8000-00805f9b34fb | 固件版本号,例如:1.3.11 |
2)Service: GATT(e20a39f4-73f5-4bc4-a12f-17d1ad07a961)
本服务主要是用来跟设备交互的。如:获取设备状态、密码认证、配置Wi-Fi、打开设备AP模式、AP信息等
UUID | 别名 |
---|---|
08590f7e-db05-467e-8757-72f6faeb13d4 | Buffer-0 |
f4be124e-4cdc-43e2-a6bb-8628e4009e6b | Buffer-1 |
1de1bf3d-1bbe-43aa-9a30-b2bb5ce9671d | Buffer-2 |
8d7bd67d-d0b3-4a5e-8d2b-2912af174a7d | Buffer-3 |
3a10340a-85e3-4190-86b4-b94dc505e4f8 | Buffer-4 |
BLE广播
BLE Name: 固定为设备序列号,为 13 位字符,以一个大写字母开头,后面是 12 个数字,例如:C301170101001,序列号校验规则为:
- 第一个为大写字母 A-Z;
- 第 5-6 位代表生产年份,限定为 17-27的数字;
- 第 7-8 位代表生产月份,限定为 01-12 的数字;
- 第 9-10 位代表生产日期,限定为 01-31 的数字。
广播数据约定
- 广播包有两种:广播包(Advertising Data) 、 响应包(Scan Response)。
- 广播包中包含若干个广播数据单元,广播数据单元也称为 AD Structure。
- 广播数据单元 = 长度值Length + AD type + AD Data。
- 长度值Length只占一个字节,并且位于广播数据单元的第一个字节。
广播包 | 广播数据单元 | ||||
Length | AD type | AD Data | 总长度 | 说明 | |
Advertising Data | 0x05 | 0x04 | 4 bytes | 6 Bytes | UUID |
0x16 | 0xFF | 21 Bytes | 23Bytes | 厂商自定义数据 | |
Scan Response | 0x0E | 0x09 | 13 Bytes | 15Bytes | Complete Local Name |
1.UUID (6 Bytes)
UUID: "ad07a961-0000-1000-8000-00805f9b34fb"
可用于指定UUID扫描设备
数据长度 | 值 | 说明 |
---|---|---|
1 byte | 0x05 | UUID length |
1 byte | 0x04 | UUID flag: Incomplete List of 32-bit Service Class UUIDs |
4 bytes | {0x61, 0xa9, 0x07, 0xad} | UUID value |
2.厂商自定义数据(23 Bytes)
AD Data(21Bytes)定义如下:
数据长度 | 值 | 说明 |
---|---|---|
1 byte | 0x14 | Custom data length:自定义数据长度 |
1 byte | 0xFF | custom data flag:自定义数据标志 |
2 bytes | 0x2935 | vender id:常量值 |
2 bytes | 0x0808 | product id:常量值 |
1 bytes | 0x01 | ble data layout:常量值 |
2 bytes | 0x0001 | net protocol version, 1.0:常量值 |
4 bytes | 0x01010101 | box status:设备状态掩码 |
4 bytes | 0x00000000 | box eth ip:以太网 IP 地址 |
4 bytes | 0x00000000 | box wifi ip:无线网 IP 地址 |
3.Complete Local Name
完整的设备名称,即上文中的BLE Name,固定为13位字符的设备序列号
设备交互
客户端通过蓝牙发现服务(GATT Service: e20a39f4-73f5-4bc4-a12f-17d1ad07a961),再通过BLE读/写特性值与设备交互
Service: GATT(e20a39f4-73f5-4bc4-a12f-17d1ad07a961):
本服务主要是用来跟设备交互的。 如:获取设备状态、密码认证、配置Wi-Fi、打开设备AP模式、AP信息等,Service Characteristic 如下表:
UUID | 别名 |
---|---|
08590f7e-db05-467e-8757-72f6faeb13d4 | Buffer-0 |
f4be124e-4cdc-43e2-a6bb-8628e4009e6b | Buffer-1 |
1de1bf3d-1bbe-43aa-9a30-b2bb5ce9671d | Buffer-2 |
8d7bd67d-d0b3-4a5e-8d2b-2912af174a7d | Buffer-3 |
3a10340a-85e3-4190-86b4-b94dc505e4f8 | Buffer-4 |
1.获取设备状态
步骤 | 操作 |
---|---|
Step 1 | APP -> Box Buffer-0: 2 Bytes = 0x5335 , 2 Bytes = Index |
Step 2 | Box -> APP Buffer-4: 2 Bytes = 0x5336 , 4 Bytes = Box Status , 2 Byte = Same index |
Step 1:通过写Buffer-0特征值请求设备状态。特征值封装:2 Bytes常量值(0x5335)+ 2 Bytes随机数
Step 2:通过读Buffer-4特征值获取设备状态。特征值解析:2 Bytes常量值(0x5336)+4 Bytes设备状态 + 2 Bytes随机数
注意:Step 2中的随机数必须与Step1中的随机数一致
2.密码认证
步骤 | 操作 |
---|---|
Step 1 | APP -> Box Buffer-4: 2 Bytes = 0x5333 , 2 Bytes = Index Buffer-0: 2 Bytes = 0x5333 , 16 Bytes = MD5(password) |
Step 2 | Box -> APP Buffer-4: 2 Bytes = 0x5334 , 4 Bytes = retSucceed (0), errPasswd(-1) , 2 Byte = Same index |
Step 1 中必须先写Buffer-4特征值,再写Buffer-0特征值
3.配置 Wi-Fi
Step 1 | APP -> Box |
Buffer-0: 2 Bytes = 0x5337 2 Bytes = secuID, 0 - none, 1 - WEP, 2 - WPAPSK, 3 - WPA2PSK | 2 Bytes = Index | 2 Bytes = 0 - only ipv4, 1 - ipv4 or ipv6, 2 - only ipv6 | |
Buffer-1: 18 Bytes = Wifi Name - 1 | |
Buffer-2: 18 Bytes = Wifi Name - 2 | |
Buffer-3: 18 Bytes = Wifi Passwd | |
Buffer-4: 2 Bytes = 0x5337 | 16 Bytes = Wifi Passwd - 2 | |
Step 2 | Box -> APP |
Buffer-0: 2 Bytes = 0x5332 | 2 Bytes = Same Index | |
Buffer-4: 2 Bytes = 0x5332 | 4 Bytes = retRunning(2), retSucceed (0), errPasswd(-1), errDevice(-4), errTimeout(-12), errNotFound(-14), errEmpty(-20)| 4 Bytes = WifiIP if retSucceed | 4 Bytes = Box Status | 2 Bytes = Version Major| 2 Bytes = Version Minor | |
Step 1:Wi-Fi名称和密码超过18个字节时,拆分成两部分写入,写入顺序:Buffer-0 Buffer-1 Buffer-2 Buffer-3 Buffer-4
Step 2:必须先读Buffer-0特征值,读完后才能读Buffer-4特征值
4.打开设备 AP 模式
Step 1 | APP -> Box |
Buffer-0: 2 Bytes = 0x5341 | 2 Bytes = Index | |
Step 2 | Box -> APP |
Buffer-4: 2 Bytes = 0x5342 | 4 Bytes = retSucceed (0), retRunning(2), errDevice(-4) | 2 Byte = Same index |
5.AP 信息
Step 1 | APP -> Box |
Buffer-0: 2 Bytes = 0x5343 | 2 Bytes = Index | |
Step 2 | Box -> APP |
Buffer-4: 2 Bytes = 0x5344 | 2 Bytes = secuID, 0 - none, 1 - WEP, 2 - WPAPSK, 3 - WPA2PSK | 2 Byte = Same index | |
Buffer-2: 2 Bytes = 0x5344 | 16 Bytes = Wi-Fi Name | |
Buffer-3: 2 Bytes = 0x5344 | 16 Bytes = Wi-Fi Passwd |
Step 2 中读特征值的顺序为: Buffer-4 Buffer-2 Buffer-3
6.Ping
Step 1 | Box -> APP |
Buffer-1: |
建立Gatt连接后,周期性读Buffer-1特征,防止Gatt连接断开。