透彻理解蓝牙5.0 BLE ATT分析

透彻理解蓝牙5.0 BLE ATT分析

 

BLE是传统蓝牙的简化版本,其特点就是低功耗。

在BLE中使用了ATT协议。ATT运行在GATT上,在接触GATT之前,先简单了解一下ATT的相关内容


ATT的主要作用是发现,并且在对端设备上读取属性, ATT主要是作为服务器去暴露一组属性和相关的数值。这些属性和数值可以被客户端发现,读取和写入

ATT中有2个角色,一个是服务器,一个是客户端。服务器暴露属性,客户端访问属性。

客户端可以发送ATT协议请求给服务端,服务器端会响应这个请求。一个设备既可以是服务器端,也可以是客户端。

属性由3部分组成,属性类型(UUID),句柄和一组权限。

属性协议数据单元 Attribute PDU 有6种类型

Commands, Requests, Responses, Notifications, Indications, Confirmations

服务器可以接受并且响应阆中请求, Find Information Request, Read Request.

ATT 使用了序列化的协议,也就是说客户端给服务器端发送一个请求之后,如果没有收到响应的消息,就不会发送下一条请求。


抓取到BLE的btsnoop文件以后,可以使用Frontline Viewer打开查看,如下图

透彻理解蓝牙5.0 BLE ATT分析_第1张图片

选择ATT选项卡,就可以看到ATT协议的交互内容。结合BLE的规格和源码来分析一下BLE ATT 的内容

透彻理解蓝牙5.0 BLE ATT分析_第2张图片

首先服务器端发送一个request请求,然后客户端会发出response的响应数据


具体查看一下包的内容

透彻理解蓝牙5.0 BLE ATT分析_第3张图片

服务器端发送了一个ATT的包给客户端,类型是Read by Group Type Request,属性组的类型是Primary Service,也就是查看客户端的主要服务。接到这个request之后,客户端在查看了自己的主要服务以后,给客户端发回了响应。

透彻理解蓝牙5.0 BLE ATT分析_第4张图片

响应的数据包中包含了客户端包含的主要服务,使用UUID来标识,客户端支持GAP和GATT还有Device Information. 服务器端获取到这些数据以后,就可以根据客户端支持的服务类型进行后续的继续request。


查看时序图可以发现,request包先由客户端发送HCI给客户端,然后解析HCI的包之后,发送到客户端的ATT,之后,客户端发送HCI给服务器端,服务器端HCI解析后,可以看到是一个response包发给了服务器端。这就是一个完整的ATT协议的交互过程。

结合btsnoop的内容,查看相关的logcat日志

 

因为要查看的是BLE的内容,所以从logcat的日志中提取GATT相关的日志,如下图。

 

然后分析BLE的相关日志,找到ATT对应的部分

通过查看日志,可以找到对应的att日志部分               

        Line 39737: 03-25 20:37:43.948 18572 18590 D BluetoothGatt: onClientRegistered() - status=0 clientIf=10
	Line 39740: 03-25 20:37:43.949 19626 19649 D bt_btif : btif_gattc_open_impl Transport=2, device type=2, phy=1
	Line 39746: 03-25 20:37:43.950 19626 19678 I bt_stack: [INFO:gatt_api.cc(1122)] GATT_Connectgatt_if=10 d2:04:17:39:1c:00
	Line 39746: 03-25 20:37:43.950 19626 19678 I bt_stack: [INFO:gatt_api.cc(1122)] GATT_Connectgatt_if=10 d2:04:17:39:1c:00
	Line 39746: 03-25 20:37:43.950 19626 19678 I bt_stack: [INFO:gatt_api.cc(1122)] GATT_Connectgatt_if=10 d2:04:17:39:1c:00
	Line 39750: 03-25 20:37:43.950 19626 19678 D bt_btif : bta_gattc_conn: server cache state=4
	Line 39751: 03-25 20:37:43.950 19626 19678 D bt_btif : bta_gattc_conn: conn_id=10
	Line 39755: 03-25 20:37:43.950 19626 19649 I bt_btif : HAL bt_gatt_callbacks->client->open_cb
	Line 39765: 03-25 20:37:43.953 18572 18590 D BluetoothGatt: onClientConnectionState() - status=0 clientIf=10 device=D2:04:17:39:1C:00
	Line 39766: 03-25 20:37:43.953 18572 18590 I [BLE] [Binder:18572_3] BLEGattClient#onConnectionStateChange: bdaddr:D2:04:17:39:1C:00, status:0, newState:2
	Line 39776: 03-25 20:37:43.956 18572 20046 I [BLE] [BLE:D2:04:17:39:1C:00(3)] BLEDevice#issueEventSyncWithLog: change : state=[CONNECTING[GATT_CONNECTED[WAIT_TRANSFER_CONNECTED][WAIT_BEFORE_DISCOVER_SERVICES]]] / EVT_GATT_CONNECTED
	Line 39776: 03-25 20:37:43.956 18572 20046 I [BLE] [BLE:D2:04:17:39:1C:00(3)] BLEDevice#issueEventSyncWithLog: change : state=[CONNECTING[GATT_CONNECTED[WAIT_TRANSFER_CONNECTED][WAIT_BEFORE_DISCOVER_SERVICES]]] / EVT_GATT_CONNECTED
	Line 39801: 03-25 20:37:43.967 19626 19678 D bt_btif : bta_gattc_add_srvc_to_list handle=768, service type=ecbe3980-c9a2-11e1-b1bd-0002a5d5c51b
首先通过UUID可以找到对应的代码,即函数bta_gattc_add_srvc_to_list

表示服务器端添加了一个找到的服务,并且把这个服务添加到列表中

 

透彻理解蓝牙5.0 BLE ATT分析_第5张图片

查看一下这个函数,发现是被下面这个函数调用执行了。

透彻理解蓝牙5.0 BLE ATT分析_第6张图片

而且is_primary的参数上设置为true,可以印证btsnoop中查询主要服务的内容。

 


 

你可能感兴趣的:(蓝牙源码分析)