导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    【FAQ】全志R329蓝牙设备类型分类与过滤方法

    其它全志芯片讨论区
    r329 r328 r818 faq 技术支持
    1
    1
    1452
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • q1215200171
      budbool LV 9 最后由 编辑

      问题背景

      在蓝牙扫描时,有的客户想对扫描到的蓝牙设备类型进行分类,并过滤出想要的设备。

      问题描述

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

      问题分析

      蓝牙设备类型也可以称为cod(class of device)。

      93af23f1d70848458147c044a8d803dc.jfif

      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进行解析。

      1 条回复 最后回复 回复 引用 分享 0
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • Referenced by  q1215200171 q1215200171 
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策