我感兴趣的BLE设备的型号和序列号可以在蓝牙扫描期间被其公司的iOS应用程序识别。我也希望我的 Android 应用程序能够做到这一点。该设备具有用于读取其型号字符串和序列号字符串的 GATT 特性。但我不认为应用程序可以在连接到设备之前读取 GATT 特征,因为它需要身份验证才能读取特征,而且我没有从 iOS 蓝牙 HCI 日志中观察到任何读取请求。
我认为这与广告数据有关(从iOS HCI日志中捕获并通过Wireshark查看):
Advertising Data
Device Name: $Randomly_generated_name
Length: 6
Type: Device Name (0x09)
Device Name: $Randomly_generated_name
Flags
Length: 2
Type: Flags (0x01)
000. .... = Reserved: 0x0
...0 .... = Simultaneous LE and BR/EDR to Same Device Capable (Host): false (0x0)
.... 0... = Simultaneous LE and BR/EDR to Same Device Capable (Controller): false (0x0)
.... .1.. = BR/EDR Not Supported: true (0x1)
.... ..0. = LE General Discoverable Mode: false (0x0)
.... ...1 = LE Limited Discoverable Mode: true (0x1)
16-bit Service Class UUIDs
Length: 7
Type: 16-bit Service Class UUIDs (0x03)
UUID 16: Battery Service (0x180f)
UUID 16: Device Information (0x180a)
UUID 16: Unknown ($Custom_UUID)
我无法从该广告数据中看到任何相关信息。然后我发现它还广告(?)来自其蓝牙经典模块的扩展查询响应(EIR):
Extended Inquiry Response Data
Device Name: $Model_Abbreviation $Serial
Length: 16
Type: Device Name (0x09)
Device Name: $Model_Abbreviation $Serial
Tx Power Level
Length: 2
Type: Tx Power Level (0x0a)
Power Level (dBm): 12
16-bit Service Class UUIDs
Length: 3
Type: 16-bit Service Class UUIDs (0x03)
UUID 16: Serial Port (0x1101)
Unused
巧合的是,设备名称中有我需要的信息。但唯一的问题是这两个数据不共享相同的 MAC 地址或任何公共标识符,如果有多个设备,我不知道哪个 EIR 属于哪个广告数据。
或者还有其他方法可以满足我的要求吗?
对于初学者来说,你是对的,如果不先建立连接,你就无法执行任何 GATT 操作。这与读取操作首先需要身份验证的事实无关。这更多是因为 GATT 操作(读、写、订阅等)发生在连接链路上,不能通过广告执行。
关于建立经典链路后通过 BLE 传输的连接,我唯一能想到的是是否存在通过经典链路传输的与 BLE 连接相关的信息。例如,一旦建立了经典蓝牙连接,LE MAC 地址或 LE 广告数据就有可能从远程设备发送到对等设备。这将为对等设备提供扫描 LE 设备时需要查找的内容。检查这一点的最佳方法是使用wireshark来嗅探两侧之间的通信。
然而,在所有这一切中,让我觉得奇怪的一件事是 BLE 广告数据包显示不支持 BR/EDR。这让我认为要么是制造商在蓝牙技术的实施中存在问题(应该由蓝牙资格流程标记),要么是wireshark解码数据时存在问题,或者最后可能存在人为错误。您的过程导致您查看不同的设备数据包。我建议您花一些时间首先关注为什么这个问题存在,因为它可能会导致您发现一个明显的问题,最终帮助您回答您的问题。