ble开发-连接状态下的蓝牙遥控数据包解析
通过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 值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?