Bluetooth 経由でスマートフォンを検出するアプリケーションに取り組んでいると、多くの Android ベースのデバイスが無効なデバイス ID を報告することがわかりました。
背景: デバイス ID (UUID 0x1200) と呼ばれる Bluetooth プロファイル/サービスがあり、特定のデバイスをベンダー、モデル、およびバージョンまで識別する必要があります。ベンダー ID は、USB または Bluetooth 本体のいずれかによって割り当てることができます。このサービスは、デバイスの検出後に Service Discovery Protocol (SDP) を介して問い合わせることができます。同じ ID 情報は、デバイスの検出中に送信される Extended Inquiry Response (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) と null の製品とバージョンを報告します。Acer Cloud Mobile でも同じ結果が得られました。これにより、無効な ID は、電話の Android OEM によって変更されていないデフォルト値に起因する可能性があると考えました。
案の定、私が最近チェックした Android ソースでは、bluez Bluetooth スタックの 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 の開発者と連絡を取り、将来のバージョンでこれを修正する方法を確認しようとしています。それで、もしあなたがその一人なら、私に知らせてください。