解决办法
那么用代码应该怎么解析呢?
在Tina 平台上扫描到设备时是带有class信息的。比如bt_test扫描的结果如下:
[bt]#scan 1
[bt]#63.778892: [bt_test_discovery_status_cb:80]: bt start scanning.
63.778957: [btmg_gap_bluez_callback:1204]: Discovery started
63.951689: [bt_test_dev_add_cb:104]: address:7C:2A:DB:F9:67:B7,name:Redmi 9,class:5898764,icon:phone,address type:public,rssi:-60
64.552549: [bt_test_dev_add_cb:104]: address:E0:DC:FF:E9:34:1E,name:flyBT,class:5898764,icon:phone,address type:public,rssi:-56
66.288756: [bt_test_dev_add_cb:104]: address:90:F0:52:69:2F:86,name:houxiaoni,class:5898764,icon:phone,address type:public,rssi:-76
66.303184: [bt_test_dev_add_cb:104]: address:00:19:86:00:03:C9,name:PCJIJIANJUN2,class:260,icon:computer,address type:public,rssi:-78
其实icon信息也能看出设备的主类型,这是bluez协议栈处理好的。
我们直接对class的值按照cod的规则进行解析即可,参考代码:
只解析主要设备类
const char *get_device_class_info(uint32_t device_class)
{
switch ((device_class & 0x1f00) >> 8) {
case 0x01:
return "computer";
case 0x02:
return "phone";
case 0x03:
return "network-wireless";
case 0x04:
return "audio";
case 0x05:
return "input-mouse";
case 0x06:
return "printer";
break;
}
return NULL;
}
解析到次要设备类
const char *get_device_class_info(uint32_t device_class)
{
switch ((device_class & 0x1f00) >> 8) {
case 0x01:
return "computer";
case 0x02:
switch ((device_class & 0xfc) >> 2) {
case 0x01:
case 0x02:
case 0x03:
case 0x05:
return "phone";
case 0x04:
return "modem";
}
break;
case 0x03:
return "network-wireless";
case 0x04:
switch ((device_class & 0xfc) >> 2) {
case 0x01:
case 0x02:
return "audio-Headset"; /* Headset */
case 0x06:
return "audio-Headphone"; /* Headphone */
case 0x0b: /* VCR */
case 0x0c: /* Video Camera */
case 0x0d: /* Camcorder */
return "camera-video";
default:
return "audio"; /* Other audio device */
}
break;
case 0x05:
switch ((device_class & 0xc0) >> 6) {
case 0x00:
switch ((device_class & 0x1e) >> 2) {
case 0x01:
case 0x02:
return "input-gaming";
}
break;
case 0x01:
return "input-keyboard";
case 0x02:
switch ((device_class & 0x1e) >> 2) {
case 0x05:
return "input-tablet";
default:
return "input-mouse";
}
}
break;
case 0x06:
if (device_class & 0x80)
return "printer";
if (device_class & 0x20)
return "camera-photo";
break;
}
return NULL;
}
代码中没有对所有子设备进行解析,如果以上没有涉及到,请参考蓝牙COD进行解析。
解决办法
那么用代码应该怎么解析呢?
在Tina 平台上扫描到设备时是带有class信息的。比如bt_test扫描的结果如下:
[bt]#scan 1
[bt]#63.778892: [bt_test_discovery_status_cb:80]: bt start scanning.
63.778957: [btmg_gap_bluez_callback:1204]: Discovery started
63.951689: [bt_test_dev_add_cb:104]: address:7C:2A:DB:F9:67:B7,name:Redmi 9,class:5898764,icon:phone,address type:public,rssi:-60
64.552549: [bt_test_dev_add_cb:104]: address:E0:DC:FF:E9:34:1E,name:flyBT,class:5898764,icon:phone,address type:public,rssi:-56
66.288756: [bt_test_dev_add_cb:104]: address:90:F0:52:69:2F:86,name:houxiaoni,class:5898764,icon:phone,address type:public,rssi:-76
66.303184: [bt_test_dev_add_cb:104]: address:00:19:86:00:03:C9,name:PCJIJIANJUN2,class:260,icon:computer,address type:public,rssi:-78
其实icon信息也能看出设备的主类型,这是bluez协议栈处理好的。
我们直接对class的值按照cod的规则进行解析即可,参考代码:
只解析主要设备类
const char *get_device_class_info(uint32_t device_class)
{
switch ((device_class & 0x1f00) >> 8) {
case 0x01:
return "computer";
case 0x02:
return "phone";
case 0x03:
return "network-wireless";
case 0x04:
return "audio";
case 0x05:
return "input-mouse";
case 0x06:
return "printer";
break;
}
return NULL;
}
解析到次要设备类
const char *get_device_class_info(uint32_t device_class)
{
switch ((device_class & 0x1f00) >> 8) {
case 0x01:
return "computer";
case 0x02:
switch ((device_class & 0xfc) >> 2) {
case 0x01:
case 0x02:
case 0x03:
case 0x05:
return "phone";
case 0x04:
return "modem";
}
break;
case 0x03:
return "network-wireless";
case 0x04:
switch ((device_class & 0xfc) >> 2) {
case 0x01:
case 0x02:
return "audio-Headset"; /* Headset */
case 0x06:
return "audio-Headphone"; /* Headphone */
case 0x0b: /* VCR */
case 0x0c: /* Video Camera */
case 0x0d: /* Camcorder */
return "camera-video";
default:
return "audio"; /* Other audio device */
}
break;
case 0x05:
switch ((device_class & 0xc0) >> 6) {
case 0x00:
switch ((device_class & 0x1e) >> 2) {
case 0x01:
case 0x02:
return "input-gaming";
}
break;
case 0x01:
return "input-keyboard";
case 0x02:
switch ((device_class & 0x1e) >> 2) {
case 0x05:
return "input-tablet";
default:
return "input-mouse";
}
}
break;
case 0x06:
if (device_class & 0x80)
return "printer";
if (device_class & 0x20)
return "camera-photo";
break;
}
return NULL;
}
代码中没有对所有子设备进行解析,如果以上没有涉及到,请参考蓝牙COD进行解析。
举报