HOGP_GATT btsnoop 日志分析:从搜索到报告解析

5星 · 超过95%的资源 需积分: 32 30 下载量 90 浏览量 更新于2024-07-20 收藏 1.15MB PDF 举报
"本文详细分析了HOGP (Human Input Device Profile) 上的GATT (Generic Attribute Profile) 层的btsnoop日志,重点关注在蓝牙设备连接过程中如何搜索HOGP服务及其特性,特别是report、reportmap和reportid之间的关系。通过对蓝牙事件的逐帧解析,揭示了GATT搜索服务和特性的一般流程,包括设备所有服务的发现、包含的特性及配置信息的获取。" 在蓝牙低功耗(BLE)通信中,GATT是核心协议之一,它定义了客户端和服务端之间数据交互的框架。HOGP是BLE中用于实现人机输入设备(如鼠标、键盘等)与主机通信的配置文件。在这个过程中,GATT服务的搜索是关键步骤,它包括了两个阶段:初步搜索和详细搜索。 初步搜索阶段,客户端通过读取设备的所有Primary Services来获取设备的支持功能。这一步骤在btsnoop日志中表现为一系列的Read by Group Type Request命令,例如Frame 526,其中包含了Opcode(操作码)0x10,表示请求从Start Handle 1到End Handle 0xFFFF范围内的所有Primary Services。响应通常包含设备支持的Primary Service UUIDs。 详细搜索阶段,客户端根据感兴趣的服务UUID(如HID服务的0x1812)进行更深入的搜索,以获取该服务下的所有Characteristics。这一阶段涉及Read by Type Request、Read By Type Request以及Find Information Request等命令,用于获取Characteristic值、Descriptor信息以及Characteristic Configuration。 在HOGP服务中,report、reportmap和reportid是关键元素。Report是实际的输入数据,如键盘按键或鼠标移动;reportmap定义了report的结构和含义;reportid则用于区分不同类型的report。客户端需要正确解析这些元素才能正确处理来自HID设备的数据。 在蓝牙协议栈的实现中,bluedroid是Android系统广泛采用的实现,其GATT搜索过程遵循上述步骤。通过对btsnoop日志的分析,我们可以深入了解设备连接、服务发现和数据交换的细节,这对于调试和优化BLE应用至关重要。 总结来说,HOGP_GATT btsnoop分析涉及了BLE连接过程中GATT服务的搜索、HOGP服务的识别以及关键特性(report、reportmap和reportid)的解析。这个过程不仅有助于理解BLE通信机制,也为开发和调试HID设备的BLE应用提供了实践指导。

对以下代码进行注释并给出可复制代码static void ble_tp_notify_task(void *pvParameters) { int err = -1; char data[244] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; while(1) { err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), data, (tx_mtu_size - 3)); BT_WARN("ble tp send notify : %d", err); } } static void ble_tp_not_ccc_changed(const struct bt_gatt_attr attr, u16_t value) { int err; BT_WARN("ccc:value=[%d]",value); if(tp_start) { if(value == BT_GATT_CCC_NOTIFY) { if(xTaskCreate(ble_tp_notify_task, (char)"bletp", 256, NULL, TP_PRIO, &ble_tp_task_h) == pdPASS) { created_tp_task = 1; BT_WARN("Create throughput tx task success."); } else { created_tp_task = 0; BT_WARN("Create throughput tx task fail."); } } else { if(created_tp_task) { BT_WARN("Delete throughput tx task."); vTaskDelete(ble_tp_task_h); created_tp_task = 0; } } } else { if(created_tp_task) { BT_WARN("Delete throughput tx task."); vTaskDelete(ble_tp_task_h); created_tp_task = 0; } if(value == BT_GATT_CCC_NOTIFY) { err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), "notify", strlen("notify")); BT_WARN("ble tp send indatcate: %d", err); } } } static struct bt_gatt_attr attrs[]= { BT_GATT_PRIMARY_SERVICE(BT_UUID_SVC_BLE_TP), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_RD, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_tp_recv_rd, NULL, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_WR, BT_GATT_CHRC_WRITE |BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE|BT_GATT_PERM_PREPARE_WRITE, NULL, ble_tp_recv_wr, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_IND, BT_GATT_CHRC_INDICATE, 0, NULL, NULL, NULL), BT_GATT_CCC(ble_tp_ind_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_NOT, BT_GATT_CHRC_NOTIFY, 0, NULL, NULL, NULL), BT_GATT_CCC(ble_tp_not_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE) };

211 浏览量