全志科技
直播中

王强

7年用户 1268经验值
私信 关注
[问答]

用C代码怎么实现蓝牙设备分类的函数

在蓝牙扫描时,有的客户想对扫描到的蓝牙设备类型进行分类,并过滤出想要的设备。
蓝牙设备类型是怎么分类的?
用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。

回帖(1)

李永每

2021-12-29 10:06:31
解决办法
那么用代码应该怎么解析呢?
在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进行解析。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分