当前位置: 首页 > news >正文

【android bluetooth 案例分析 03】【PTS 测试 】【PBAP/PCE/SGSIT/SERR/BV-01-C】

1. PBAP/PCE/SGSIT/OFFS/BV-01-C

1. 测试项说明:

Please initiate a GATT connection over BR/EDR to the PTS.Description: Verify that the Implementation Under Test (IUT) can initiate GATT connect request over BR/EDR to PTS.

测试项名称
Please initiate a GATT connection over BR/EDR to the PTS.

测试项描述
验证被测设备(IUT)是否能够通过 BR/EDR(经典蓝牙)主动发起 GATT 连接请求到 PTS(Protocol Test System)

2. 基本概念

1. 什么是 GATT?

GATT(Generic Attribute Profile)是 BLE(低功耗蓝牙)中用于设备之间传输数据的通用协议,基于 ATT(Attribute Protocol)实现。

2. 什么是 BR/EDR?

BR/EDR 是“Basic Rate / Enhanced Data Rate”的缩写,也就是经典蓝牙。传统上,GATT 运行于 BLE(即 LE)上,但从 Bluetooth Core v4.1 起,GATT 也可以工作在 BR/EDR 上。

3. 为什么要测试 GATT over BR/EDR?

虽然 GATT 多用于 BLE,但有些场景或设备(比如某些老设备或兼容设备)需要在经典蓝牙上复用 GATT 协议。因此,Bluetooth SIG 定义了这个测试项来确保 IUT 能在 BR/EDR 上传输 GATT 协议。


3. 测试目的

验证被测设备(IUT)是否能够:

  1. 使用 BR/EDR(经典蓝牙)连接到 PTS
  2. 正确发起 GATT 连接请求(如发送 MTU 交换请求);
  3. 在 BR/EDR 信道上使用 ATT 协议通信
  4. 满足 GATT over BREDR 的规范要求

4. 测试流程简述

步骤动作
1IUT 与 PTS 建立配对(通过经典蓝牙)
2IUT 执行 SDP 查询,找到 PTS 提供的 GATT 服务(UUID: 0x1801
3IUT 通过 BR/EDR 打开 L2CAP 固定信道(通常为 0x0004)
4IUT 发送 ATT 请求(如 Exchange MTU Request)
5PTS 响应,连接建立成功
6记录测试结果(通过 / 失败)

5. 测试重点与注意事项

项目要点
✅ 连接方式必须是 BR/EDR(经典蓝牙),不能使用 BLE
✅ SDP 查询IUT 应能找到 GATT 服务的 SDP 记录(Generic Attribute Profile)
✅ L2CAP 信道使用固定信道 0x0004 建立 ATT 通道
✅ ATT 层IUT 应发送标准的 GATT 请求,如 MTU 交换、服务发现等
❌ 错误示范如果 IUT 走了 BLE 的 GATT 路径,则测试会被判为失败
⚠️ 蓝牙协议栈支持部分蓝牙协议栈(如 Android、BlueZ)默认不支持 GATT over BR/EDR,需要手动适配或扩展

6. 常见失败原因(SERR)

问题原因
GATT 请求未发出IUT 没有正确连接或协议栈不支持
使用了 LE 连接测试要求使用经典蓝牙,不能用 LE
SDP 查询失败未找到 GATT 服务 UUID
L2CAP 信道错误未使用 0x0004 或配置不当
没有发送 ATT 数据上层未触发 GATT 请求流程

7. 调试建议

  • 抓包工具:使用 Ellisys 或 Frontline 观察 HCI 层是否通过 BR/EDR 连接;

  • 确认 ACL 链路类型:应为 classic BR ACL 而非 LE;

  • 查看 SDP 记录:确认 PTS 是否发布了 GATT 服务 UUID;

  • 打印日志:开启协议栈日志,如 BlueZ 可查看 btmon,Android 可用 logcat


8. 总结

本测试项的关键是:

确保设备在 BR/EDR 上传输 GATT 协议,并能主动连接并通信。

由于很多现代蓝牙协议栈默认只支持 GATT over LE,若设备原生不支持,需要自行扩展协议栈才能通过此项测试。

2. 真实车机侧案例

我们 IUT 测试对象是车机。 android 的协议栈不支持,默认不支持 GATT over BR/EDR。 看到这里, 是不是有点担心。 如果要过这一项测试,是不是要 人为改代码, 来适配 GATT over BR/EDR。 我实际测试了一下。直接是可以通过的。

我这里 记录一下 车机侧的 btsnoop 日志。 看一下为何在协议栈不支持 GATT over BR/EDR 的情况下。还能测试通过。

在这里插入图片描述

  • 发现只有 sdp 的流程, 没有后续 连接 pbap 的流程。
  • 那我们重点看一下, 车机发起 sdp 后, pts. 回复的内容。
# 车机向 pts 查询 Phonebook Access Server 
975	2025-04-25 17:53:59.966042	22:22:96:de:b1:39 (leo 8295 chan)	Vencer_f4:b1:83 (PTS-PBAP-B183)	SDP	29	Sent Service Search Attribute Request : Phonebook Access Server: Attribute Range (0x0000 - 0xffff) # pts 回复如下:
980	2025-04-25 17:53:59.991359	Vencer_f4:b1:83 (PTS-PBAP-B183)	22:22:96:de:b1:39 (leo 8295 chan)	SDP	19	Rcvd Service Search Attribute Response Bluetooth SDP ProtocolPDU: Service Search Attribute Response (0x07)Transaction Id: 0x0000Parameter Length: 5Attribute List Byte Count: 2Attribute Lists [count =  0]Data Element: Sequence uint8 0 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 0Data Value: MISSING     # 这里看到 pts 返回的 数据内容是空的。Continuation State: no (00)

而我们 协议栈判断到, pts 的 返回的 sdp record 是空的后, 就没有继续发起 pbap 的连接。

04-25 17:53:59.140092  9393  9488 D PbapClientStateMachine: mCchPathUsed: false
04-25 17:53:59.140338  9393  9720 I PbapClientStateMachine: Enter Connecting: -2
04-25 17:53:59.140520  9393  9720 D PbapClientStateMachine: Connection state 00:1B:DC:F4:B1:83: 0->1
04-25 17:54:00.009577  9393  9393 I PbapClientStateMachine: onReceiveandroid.bluetooth.device.action.SDP_RECORD
04-25 17:54:00.009815  9393  9393 I PbapClientStateMachine: Received UUID: 0000112f-0000-1000-8000-00805f9b34fb
04-25 17:54:00.009968  9393  9393 I PbapClientStateMachine: expected UUID: 0000112f-0000-1000-8000-00805f9b34fb// 直接返回错误了
04-25 17:54:00.010025  9393  9393 E PbapClientStateMachine: SDP Record fetched status isn't ok - Ignore. status=1
// android/app/src/com/android/bluetooth/pbapclient/PbapClientStateMachine.javaprivate class SDPBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (DBG) {Log.i(TAG, "onReceive" + action);}if (action.equals(BluetoothDevice.ACTION_SDP_RECORD)) {BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);BluetoothDevice sm_device = getDevice();if (sm_device !=null) {if (!device.equals(getDevice())) {Log.w(TAG, "SDP Record fetched for different device - Ignore");return;}} else {Log.d(TAG, "SDP Record get device is null - Ignore");return;}ParcelUuid uuid = intent.getParcelableExtra(BluetoothDevice.EXTRA_UUID);if (DBG) {Log.i(TAG, "Received UUID: " + uuid.toString());Log.i(TAG, "expected UUID: " + BluetoothUuid.PBAP_PSE.toString());}int search_status= intent.getIntExtra(BluetoothDevice.EXTRA_SDP_SEARCH_STATUS,-1);if (search_status != AbstractionLayer.BT_STATUS_SUCCESS) {// 直接在这里返回退出了。Log.e(TAG, "SDP Record fetched status isn't ok - Ignore. status="+search_status);return;}if (uuid.equals(BluetoothUuid.PBAP_PSE)) {// 正常的逻辑,应该走到这里, sdp 完成后,会继续触发 后续连接操作。sendMessage(MSG_SDP_COMPLETE,intent.getParcelableExtra(BluetoothDevice.EXTRA_SDP_RECORD));}}}}}

发现这一项, 由于 pts 返回的 sdp record 状态有问题。 后续车机干脆没有发起 pbap 的连接。 直接 pts软件 pass 了。


3. 正确的 sdp

这里对比分享一个 正常,可以建立 pbap 情况下的, sdp 的内容。

# 车机主动发起 sdp 请求
846	2025-04-25 14:08:32.468449	22:22:96:de:b1:39 (leo 8295 chan)	Vencer_f4:b1:83 (PTS-PBAP-B183)	SDP	29	Sent Service Search Attribute Request : Phonebook Access Server: Attribute Range (0x0000 - 0xffff) # pts 回复正确的 sdp record
849	2025-04-25 14:08:32.507350	Vencer_f4:b1:83 (PTS-PBAP-B183)	22:22:96:de:b1:39 (leo 8295 chan)	SDP	255	Rcvd Service Search Attribute Response Bluetooth SDP ProtocolPDU: Service Search Attribute Response (0x07)Transaction Id: 0x0000Parameter Length: 241Attribute List Byte Count: 238Attribute Lists [count =  2]Data Element: Sequence uint8 236 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 236Data ValueAttribute List [count = 10] (Phonebook Access Server)Data Element: Sequence uint8 119 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 119Data ValueService Attribute: Service Record Handle (0x0), value = 0x00090021 (589857)Attribute ID: Service Record HandleData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Service Record Handle (0x0000)ValueData Element: Unsigned Integer 4 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .010 = Data Element Size: 4 bytes (2)Data ValueService Record Handle: 0x00090021Service Attribute: Service Class ID List (0x1), value = Phonebook Access ServerAttribute ID: Service Class ID ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Service Class ID List (0x0001)ValueData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: Phonebook Access Server (0x112f)Service Attribute: Protocol Descriptor List (0x4), value = L2CAP -> RFCOMM:2 -> OBEXAttribute ID: Protocol Descriptor ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Protocol Descriptor List (0x0004)ValueData Element: Sequence uint8 17 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 17Data ValueProtocol #1: L2CAPData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueProtocol Entry: L2CAPData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: L2CAP (0x0100)Protocol #2: RFCOMM, RFCOMM Channel: 2Data Element: Sequence uint8 5 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 5Data ValueProtocol Entry: RFCOMM, RFCOMM Channel: 2Data Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: RFCOMM (0x0003)Data Element: Unsigned Integer 1 byte (0 bytes if Nil)0000 1... = Data Element Type: Unsigned Integer (1).... .000 = Data Element Size: 1 byte (0 bytes if Nil) (0)Data ValueRFCOMM Channel: 2 (0x02)Protocol #3: OBEXData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueProtocol Entry: OBEXData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: OBEX (0x0008)Service Attribute: Browse Group List (0x5), value = Public Browse GroupAttribute ID: Browse Group ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Browse Group List (0x0005)ValueData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: Public Browse Group (0x1002)Service Attribute: Language Base Attribute ID List (0x6), value = (Lang: en, Encoding: UTF-8, Attribute Base: 0x0100)Attribute ID: Language Base Attribute ID ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Language Base Attribute ID List (0x0006)ValueData Element: Sequence uint8 9 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 9Data ValueLanguage #1: Lang: en, Encoding: UTF-8, Attribute Base: 0x0100Data Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueLanguage Code: enData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueLanguage Encoding: UTF-8 (106)Data Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute Base: 0x0100Service Attribute: Bluetooth Profile Descriptor List (0x9), value = Phonebook Access Profile 1.2Attribute ID: Bluetooth Profile Descriptor ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Bluetooth Profile Descriptor List (0x0009)ValueData Element: Sequence uint8 8 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 8Data ValueData Element: Sequence uint8 6 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 6Data ValueProfile Descriptor List #1: Phonebook Access Profile, Version 1.2Data Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: Phonebook Access Profile (0x1130)Data Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueProtocol Version: 0x0102Service Attribute: Service Name (0x100), value = Phonebook Acccess PSEAttribute ID: Service NameData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Service Name (0x0100)ValueData Element: Text string uint8 22 bytes0010 0... = Data Element Type: Text string (4).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 22Data ValueService Name: Phonebook Acccess PSEService Attribute: (PBAP) GOEP L2CAP PSM (0x200), value = 4101 (0x1005)Attribute ID: GOEP L2CAP PSMData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: GOEP L2CAP PSM (0x0200)ValueData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueGOEP L2CAP PSM: 4101 (0x1005)Service Attribute: (PBAP) Supported Repositories (0x314), value = LocalPhonebook SIM SpeedDial Favourites Attribute ID: Supported RepositoriesData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Supported Repositories (0x0314)ValueData Element: Unsigned Integer 1 byte (0 bytes if Nil)0000 1... = Data Element Type: Unsigned Integer (1).... .000 = Data Element Size: 1 byte (0 bytes if Nil) (0)Data ValueSupported Repositories: 0x0f0000 .... = Reserved: 0x0.... 1... = Favourites: True.... .1.. = Speed Dial: True.... ..1. = SIM Card: True.... ...1 = Local Phonebook: TrueService Attribute: (PBAP) Supported Features (0x317), value = Attribute ID: Supported FeaturesData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Supported Features (0x0317)ValueData Element: Unsigned Integer 4 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .010 = Data Element Size: 4 bytes (2)Data ValueSupported Features: 0x000000000000 0000 0000 0000 0000 00.. .... .... = Reserved: 0x000000.... .... .... .... .... ..0. .... .... = Default Contact Image Format: False.... .... .... .... .... ...0 .... .... = Contact Referencing: False.... .... .... .... .... .... 0... .... = X-BT-UID vCard Property: False.... .... .... .... .... .... .0.. .... = X-BT-UCI vCard Property: False.... .... .... .... .... .... ..0. .... = Enhanced Missed Calls: False.... .... .... .... .... .... ...0 .... = vCard Selecting: False.... .... .... .... .... .... .... 0... = Folder Version Counters: False.... .... .... .... .... .... .... .0.. = Database Identifier: False.... .... .... .... .... .... .... ..0. = Browsing: False.... .... .... .... .... .... .... ...0 = Download: FalseAttribute List [count =  9] (Phonebook Access Server)Data Element: Sequence uint8 113 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 113Data ValueService Attribute: Service Record Handle (0x0), value = 0x00090063 (589923)Attribute ID: Service Record HandleData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Service Record Handle (0x0000)ValueData Element: Unsigned Integer 4 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .010 = Data Element Size: 4 bytes (2)Data ValueService Record Handle: 0x00090063Service Attribute: Service Class ID List (0x1), value = Phonebook Access ServerAttribute ID: Service Class ID ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Service Class ID List (0x0001)ValueData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: Phonebook Access Server (0x112f)Service Attribute: Protocol Descriptor List (0x4), value = L2CAP -> RFCOMM:2 -> OBEXAttribute ID: Protocol Descriptor ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Protocol Descriptor List (0x0004)ValueData Element: Sequence uint8 17 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 17Data ValueProtocol #1: L2CAPData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueProtocol Entry: L2CAPData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: L2CAP (0x0100)Protocol #2: RFCOMM, RFCOMM Channel: 2Data Element: Sequence uint8 5 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 5Data ValueProtocol Entry: RFCOMM, RFCOMM Channel: 2Data Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: RFCOMM (0x0003)Data Element: Unsigned Integer 1 byte (0 bytes if Nil)0000 1... = Data Element Type: Unsigned Integer (1).... .000 = Data Element Size: 1 byte (0 bytes if Nil) (0)Data ValueRFCOMM Channel: 2 (0x02)Protocol #3: OBEXData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueProtocol Entry: OBEXData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: OBEX (0x0008)Service Attribute: Browse Group List (0x5), value = Public Browse GroupAttribute ID: Browse Group ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Browse Group List (0x0005)ValueData Element: Sequence uint8 3 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 3Data ValueData Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: Public Browse Group (0x1002)Service Attribute: Language Base Attribute ID List (0x6), value = (Lang: en, Encoding: UTF-8, Attribute Base: 0x0100)Attribute ID: Language Base Attribute ID ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Language Base Attribute ID List (0x0006)ValueData Element: Sequence uint8 9 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 9Data ValueLanguage #1: Lang: en, Encoding: UTF-8, Attribute Base: 0x0100Data Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueLanguage Code: enData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueLanguage Encoding: UTF-8 (106)Data Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute Base: 0x0100Service Attribute: Bluetooth Profile Descriptor List (0x9), value = Phonebook Access Profile 1.0Attribute ID: Bluetooth Profile Descriptor ListData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Bluetooth Profile Descriptor List (0x0009)ValueData Element: Sequence uint8 8 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 8Data ValueData Element: Sequence uint8 6 bytes0011 0... = Data Element Type: Sequence (6).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 6Data ValueProfile Descriptor List #1: Phonebook Access Profile, Version 1.0Data Element: UUID 2 bytes0001 1... = Data Element Type: UUID (3).... .001 = Data Element Size: 2 bytes (1)Data ValueValue: UUID: Phonebook Access Profile (0x1130)Data Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueProtocol Version: 0x0100Service Attribute: Service Name (0x100), value = Phonebook Acccess PSEAttribute ID: Service NameData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Service Name (0x0100)ValueData Element: Text string uint8 22 bytes0010 0... = Data Element Type: Text string (4).... .101 = Data Element Size: uint8 (5)Data Element Var Size: 22Data ValueService Name: Phonebook Acccess PSEService Attribute: (PBAP) Supported Repositories (0x314), value = LocalPhonebook SIM SpeedDial Favourites Attribute ID: Supported RepositoriesData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Supported Repositories (0x0314)ValueData Element: Unsigned Integer 1 byte (0 bytes if Nil)0000 1... = Data Element Type: Unsigned Integer (1).... .000 = Data Element Size: 1 byte (0 bytes if Nil) (0)Data ValueSupported Repositories: 0x0f0000 .... = Reserved: 0x0.... 1... = Favourites: True.... .1.. = Speed Dial: True.... ..1. = SIM Card: True.... ...1 = Local Phonebook: TrueService Attribute: (PBAP) Supported Features (0x317), value = Attribute ID: Supported FeaturesData Element: Unsigned Integer 2 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .001 = Data Element Size: 2 bytes (1)Data ValueAttribute ID: Supported Features (0x0317)ValueData Element: Unsigned Integer 4 bytes0000 1... = Data Element Type: Unsigned Integer (1).... .010 = Data Element Size: 4 bytes (2)Data ValueSupported Features: 0x000000000000 0000 0000 0000 0000 00.. .... .... = Reserved: 0x000000.... .... .... .... .... ..0. .... .... = Default Contact Image Format: False.... .... .... .... .... ...0 .... .... = Contact Referencing: False.... .... .... .... .... .... 0... .... = X-BT-UID vCard Property: False.... .... .... .... .... .... .0.. .... = X-BT-UCI vCard Property: False.... .... .... .... .... .... ..0. .... = Enhanced Missed Calls: False.... .... .... .... .... .... ...0 .... = vCard Selecting: False.... .... .... .... .... .... .... 0... = Folder Version Counters: False.... .... .... .... .... .... .... .0.. = Database Identifier: False.... .... .... .... .... .... .... ..0. = Browsing: False.... .... .... .... .... .... .... ...0 = Download: FalseContinuation State: no (00)
http://www.xdnf.cn/news/407359.html

相关文章:

  • 右值和移动
  • 部署Superset BI(六)Superset 的主机安装
  • 文件上传总结
  • Redis——达人探店
  • CSS3 遮罩
  • HTML5 中实现盒子水平垂直居中的方法
  • 【启动盘制作】macbook 制作windows启动盘,重装 Windows 的详细教程
  • C++:公有,保护及私有继承
  • 数据结构-树(1)
  • 硬件设备基础
  • 豆瓣电影Top250数据工程实践:从爬虫到智能存储的技术演进(含完整代码)
  • Mysql使用PXC实现高可用
  • js 字符串中的特殊字符全部替换成定义对象里面key对应的value值(进阶篇)
  • Python60日基础学习打卡D12【虫豸版】
  • 如何使用 React Hooks 替代类组件的生命周期方法?
  • Linux服务器连接SSH工具FinalShell安装使用支持Linux文件上传下载
  • (自用)Java学习-5.8(总结,springboot)
  • 【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案
  • upload-labs通关笔记-第01关 文件上传之前端绕过(3种渗透方法)
  • 浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差
  • Linux笔记---信号(上)
  • SWMM在城市排水防涝规划中的实战应用:模型校准、情景模拟与工程决策
  • Linux进程10-有名管道概述、创建、读写操作、两个管道进程间通信、读写规律(只读、只写、读写区别)、设置阻塞/非阻塞
  • WordPress 网站上的 jpg、png 和 WebP 图片插件
  • 请解释 React Native 的新架构(Fabric 和 TurboModules)与旧架构的主要区别
  • 「光域」系列激光测距传感器:以光为尺,重构空间认知边界
  • 【华为HCIP | 华为数通工程师】821—多选解析—第二十二页
  • 详解 IRC协议 及客户端工具 WeeChat 的使用
  • OpenCV进阶操作:光流估计
  • Linux基础命令之目录管理——了解各种操作文件目录的命令,万字教学,超详细!!!(1)