在处理涉及通过蓝牙发现智能手机的应用程序时,我发现许多基于 Android 的设备报告返回的设备 ID 无效。
一些背景知识:有一个蓝牙配置文件/服务,称为设备 ID (UUID 0x1200),它可以识别特定设备的供应商、型号和版本。供应商 ID 可以由 USB 或蓝牙机构分配。设备发现后可以通过服务发现协议(SDP)查询该服务。相同的 ID 信息也可以包含在扩展查询响应 (EIR) 中,该响应在设备发现期间发送。
运行 2.3.7 的最新测试对象 Sony Xperia Go 报告了以下 SDP 记录:
ID=0x0000,type=0x01,value=0x00010000
ID=0x0001,type=0x06[type=0x03,value={**0x1200**};]
ID=0x0005,type=0x06[type=0x03,value={0x1002};]
ID=0x0009,type=0x06[type=0x06;]
ID=0x0200,type=0x01,value=0x0102 (Device ID Profile Specification 1.2)
ID=0x0201,type=0x01,value=**0x000a (Vendor ID)**
ID=0x0202,type=0x01,value=**0x0000 (Product ID)**
ID=0x0203,type=0x01,value=**0x0000 (Version)**
ID=0x0204,type=0x05,value=1 (Primary? = Yes)
ID=0x0205,type=0x01,value=**0x0002 (VendorIDSource = USB Implementer's Forum)**
正如您在上面看到的,Go 报告了无效的 USB 供应商 ID (0x000a) 以及无效的产品和版本。我在 Acer Cloud Mobile 上也得到了相同的结果。这让我认为无效的 ID 可能源于手机 Android OEM 未修改的默认值。
果然,在我最近查看的 Android 资源中,bluez 蓝牙堆栈在 main.conf 中有以下参数:
# Use vendor, product and version information for DID profile support.
# The values are separated by ":" and VID, PID and version.
DeviceID = android:generic:1.5
如果 OEM 未修改此参数,它将由 start_sdp_server 函数解析:
vid = (uint16_t) strtol(ptr, NULL, 16);
ptr = strchr(ptr, ':');
if (ptr) {
pid = (uint16_t) strtol(ptr + 1, NULL, 16);
ptr = strchr(ptr + 1, ':');
if (ptr)
ver = (uint16_t) strtol(ptr + 1, NULL, 16);
register_device_id(vid, pid, ver);
}
这就是 0x000a 供应商 ID 的来源。来自 Android 的“a”。多么天才...
我正在尝试与 Sony 和 Android 开发人员联系,以了解如何为未来的版本解决此问题。所以,如果你是其中之一,请告诉我。