【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进行解析。 
- 
				Referenced by q1215200171 q1215200171
- 
				Referenced by q1215200171 q1215200171
- 
				Referenced by q1215200171 q1215200171
- 
				Referenced by q1215200171 q1215200171
- 
				Referenced by q1215200171 q1215200171
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号