ble开发-连接状态下的蓝牙遥控数据包解析

发布时间 2023-06-13 10:51:12作者: foorun

通过Wireshark抓包获取蓝牙遥控器的HID数据包如下,现对其进行分析

 (1)  02

 代表了HCI的数据格式

HCI ACL Data packet: Controller上报给Host的事件,只能由Controller发出

(2) 01 2e

 

host层想用更少的位来表示访Access Address,Controller用12位即3字节的连接句柄Handle用来表示Access address,PB Flag(Packet Boundary,数据包边界标记) 表示这个包是起始包(00b)还是延续包(01b),PB Flag = 10表示开始包,01表示连续包,在此这个包为开始包,BC Flag(Boardcast Flag,广播标记) 对于BLE该值永远为0

(3)09 00

 数据长度

共9字节

(4)05 00 04 00

这里就到了L2CAP协议层了,数据包格式如下下其

 

 0x0005即为数据长度

 0x0004为Channel ID(CID)通道标示符。信道具体信息留到之后再讲,此处0X0004信道为未使用信道

(5) 1b

Attribute protocol PDU的操作码Opcode

#define  GATT_RSP_ERROR                      0x01
#define  GATT_REQ_MTU                        0x02
#define  GATT_RSP_MTU                        0x03
#define  GATT_REQ_FIND_INFO                  0x04
#define  GATT_RSP_FIND_INFO                  0x05
#define  GATT_REQ_FIND_TYPE_VALUE            0x06
#define  GATT_RSP_FIND_TYPE_VALUE            0x07
#define  GATT_REQ_READ_BY_TYPE               0x08
#define  GATT_RSP_READ_BY_TYPE               0x09
#define  GATT_REQ_READ                       0x0A
#define  GATT_RSP_READ                       0x0B
#define  GATT_REQ_READ_BLOB                  0x0C
#define  GATT_RSP_READ_BLOB                  0x0D
#define  GATT_REQ_READ_MULTI                 0x0E
#define  GATT_RSP_READ_MULTI                 0x0F
#define  GATT_REQ_READ_BY_GRP_TYPE           0x10
#define  GATT_RSP_READ_BY_GRP_TYPE           0x11
#define  GATT_REQ_WRITE                      0x12
#define  GATT_RSP_WRITE                      0x13
#define  GATT_CMD_WRITE                      0x52
#define  GATT_REQ_PREPARE_WRITE              0x16
#define  GATT_RSP_PREPARE_WRITE              0x17
#define  GATT_REQ_EXEC_WRITE                 0x18
#define  GATT_RSP_EXEC_WRITE                 0x19
#define  GATT_HANDLE_VALUE_NOTIF             0x1B
#define  GATT_HANDLE_VALUE_IND               0x1D
#define  GATT_HANDLE_VALUE_CONF              0x1E
#define  GATT_SIGN_CMD_WRITE                 0xD2 
#define  GATT_OP_CODE_MAX                    GATT_HANDLE_VALUE_CONF + 1 /* 0x1E = 30 + 1 = 31*/

 (6) 3C 00

Attribute Handle :用于给客户端查找一个服务端attributeuint16_t类型的唯一标识符,也就是给attribute一个“地址”

 可以看到0X003c指向的service

用户在软件代码添加characteristic的时候,系统会自动按顺序地为相关attribute生成句柄。

(7) 45 00

此即为 value 值