通过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
:用于给客户端查找一个服务端attribute
的uint16_t
类型的唯一标识符,也就是给attribute一个“地址”
可以看到0X003c指向的service
用户在软件代码添加characteristic的时候,系统会自动按顺序地为相关attribute生成句柄。
(7) 45 00
此即为 value 值
标签:GATT,RSP,REQ,蓝牙,WRITE,READ,ble,数据包,define From: https://www.cnblogs.com/foorun/p/17471310.html