<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[【FAQ】全志R329蓝牙设备类型分类与过滤方法]]></title><description><![CDATA[<p dir="auto"><strong>问题背景</strong></p>
<p dir="auto">在蓝牙扫描时，有的客户想对扫描到的蓝牙设备类型进行分类，并过滤出想要的设备。</p>
<p dir="auto"><strong>问题描述</strong></p>
<p dir="auto">蓝牙设备类型是怎么分类的？<br />
用C代码怎么实现蓝牙设备分类的函数？</p>
<p dir="auto"><strong>问题分析</strong></p>
<p dir="auto">蓝牙设备类型也可以称为cod（class of device）。</p>
<p dir="auto"><img src="/assets/uploads/files/1637895022851-93af23f1d70848458147c044a8d803dc.jfif" alt="93af23f1d70848458147c044a8d803dc.jfif" class=" img-responsive img-markdown" width="undefined" height="undefined" /></p>
<p dir="auto">Cod的结构如上图，一共有3个byte，其中一共分为4个部分。</p>
<p dir="auto">主要分为：</p>
<p dir="auto">（1）Service class（服务类型）<br />
描述此设备有什么功能？Networking？Audio？Telephony？</p>
<p dir="auto">（2）Major device class（设备的主类型）<br />
这个是我们解析需要关注的重要部分，它是用来说描述蓝牙设备的一个大分类。<br />
比如：Computer、Phone 、Audio/Video、Peripheral等等。<br />
如果只是想了解到这个蓝牙设备的大致类型，解析到Major device class就可以了。</p>
<p dir="auto">（3）Minor device class（设备的子类型）<br />
对应于每种Major类型下面的子类，从这里更能清楚了解到这个设备。<br />
比如 Audio/Video这个主类型，它还可以分为Wearable Headset Device、Hands-free Device、Headphones、Loudspeaker。</p>
<p dir="auto">对于COD，蓝牙官方网站有更详细的介绍：</p>
<p dir="auto"><a href="https://www.bluetooth.com/specifications/assigned-numbers/baseband/" target="_blank" rel="noopener noreferrer nofollow ugc">https://www.bluetooth.com/specifications/assigned-numbers/baseband/</a></p>
<p dir="auto"><strong>解决办法</strong></p>
<p dir="auto">那么用代码应该怎么解析呢？</p>
<p dir="auto">在Tina 平台上扫描到设备时是带有class信息的。比如bt_test扫描的结果如下：</p>
<pre><code>[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
</code></pre>
<p dir="auto">其实icon信息也能看出设备的主类型，这是bluez协议栈处理好的。<br />
我们直接对class的值按照cod的规则进行解析即可，参考代码：</p>
<p dir="auto"><strong>只解析主要设备类</strong></p>
<pre><code>const char *get_device_class_info(uint32_t device_class)
{
    switch ((device_class &amp; 0x1f00) &gt;&gt; 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;
}
</code></pre>
<p dir="auto"><strong>解析到次要设备类</strong></p>
<pre><code>const char *get_device_class_info(uint32_t device_class)
{
    switch ((device_class &amp; 0x1f00) &gt;&gt; 8) {
    case 0x01:
        return "computer";
    case 0x02:
        switch ((device_class &amp; 0xfc) &gt;&gt; 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 &amp; 0xfc) &gt;&gt; 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 &amp; 0xc0) &gt;&gt; 6) {
        case 0x00:
            switch ((device_class &amp; 0x1e) &gt;&gt; 2) {
            case 0x01:
            case 0x02:
                return "input-gaming";
            }
            break;
        case 0x01:
            return "input-keyboard";
        case 0x02:
            switch ((device_class &amp; 0x1e) &gt;&gt; 2) {
            case 0x05:
                return "input-tablet";
            default:
                return "input-mouse";
            }
        }
        break;
    case 0x06:
        if (device_class &amp; 0x80)
            return "printer";
        if (device_class &amp; 0x20)
            return "camera-photo";
        break;
    }

    return NULL;
}
</code></pre>
<p dir="auto">代码中没有对所有子设备进行解析，如果以上没有涉及到，请参考蓝牙COD进行解析。</p>
]]></description><link>https://bbs.aw-ol.com/topic/651/faq-全志r329蓝牙设备类型分类与过滤方法</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 11:09:00 GMT</lastBuildDate><atom:link href="https://bbs.aw-ol.com/topic/651.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Nov 2021 02:51:31 GMT</pubDate><ttl>60</ttl></channel></rss>