0

在处理涉及通过蓝牙发现智能手机的应用程序时,我发现许多基于 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 开发人员联系,以了解如何为未来的版本解决此问题。所以,如果你是其中之一,请告诉我。

4

1 回答 1

0

我只是在这里确认索尼 Xperia Go 的新 4.1.2 JB 固件已修复此错误。电话正确报告设备 ID 配置文件。

于 2013-04-28T09:32:17.447 回答