【FAQ】全志R329蓝牙设备类型分类与过滤方法
-
问题背景
在蓝牙扫描时,有的客户想对扫描到的蓝牙设备类型进行分类,并过滤出想要的设备。
问题描述
蓝牙设备类型是怎么分类的?
用C代码怎么实现蓝牙设备分类的函数?问题分析
蓝牙设备类型也可以称为cod(class of device)。
Cod的结构如上图,一共有3个byte,其中一共分为4个部分。
主要分为:
(1)Service class(服务类型)
描述此设备有什么功能?Networking?Audio?Telephony?(2)Major device class(设备的主类型)
这个是我们解析需要关注的重要部分,它是用来说描述蓝牙设备的一个大分类。
比如:Computer、Phone 、Audio/Video、Peripheral等等。
如果只是想了解到这个蓝牙设备的大致类型,解析到Major device class就可以了。(3)Minor device class(设备的子类型)
对应于每种Major类型下面的子类,从这里更能清楚了解到这个设备。
比如 Audio/Video这个主类型,它还可以分为Wearable Headset Device、Hands-free Device、Headphones、Loudspeaker。对于COD,蓝牙官方网站有更详细的介绍:
https://www.bluetooth.com/specifications/assigned-numbers/baseband/
解决办法
那么用代码应该怎么解析呢?
在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进行解析。
-
-
-
-
-
Copyright © 2023 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号