Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    【FAQ】全志R329在Tina如何在蓝牙已连接情况下拒绝其他耳机回连

    其它全志芯片讨论区
    r329 r328 faq 技术支持
    1
    1
    1281
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 9 last edited by

      问题背景
      系统:Tina
      平台:R818、V833 扫描笔产品
      蓝牙功能:a2dp source

      问题概述
      (1)客户有一个蓝牙音箱和一个蓝牙耳机,并且这两个设备之前都已经跟扫描笔连接配对过了。
      (2)客户主动让扫描笔连接上蓝牙音箱。
      (3)打开蓝牙耳机,此时蓝牙耳机回连上扫描笔。
      但是客户不想要这个场景存在,希望只有一个连接存在。

      问题分析
      蓝牙耳机打开后回连这个动作,我们无法阻止它,只能想办法拒绝他。
      如果在应用层处理,连上了再把它断开,这个会影响状态的管理,也不是最好的解决方法。
      所以我们考虑再收到连接请求事件时,就拒绝了它。linux的蓝牙驱动层会处理HCI上报的
      事件,因此我们可以在驱动完成这个逻辑。

      解决方法
      代码路径:
      lichee/linux-4.9/net/bluetooth/hci_event.c
      连接请求处理函数:hci_conn_request_evt 中增加如下代码:
      首先判断连接类型是否是ACL_LINK,然后获取当前连接数,如果当前已经有连接了,就拒绝本次的连接请求。

      if (ev->link_type == ACL_LINK) {
              if ((hci_conn_num(hdev, ACL_LINK) != 0) && (hdev->dev_type == HCI_PRIMARY)) {
                  BT_INFO("already exist acl link, reject new! %s, %d", __func__, __LINE__);
                  hci_reject_conn(hdev, &ev->bdaddr);
                  return;
              }
          }
      

      修改过之后的代码如下:

      static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
      {
          struct hci_ev_conn_request *ev = (void *) skb->data;
          int mask = hdev->link_mode;
          struct inquiry_entry *ie;
          struct hci_conn *conn;
          __u8 flags = 0;
      
          BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr,
                 ev->link_type);
      
          mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type,
                            &flags);
      
          if (!(mask & HCI_LM_ACCEPT)) {
              hci_reject_conn(hdev, &ev->bdaddr);
              return;
          }
      
          if (ev->link_type == ACL_LINK) {
              if ((hci_conn_num(hdev, ACL_LINK) != 0) && (hdev->dev_type == HCI_PRIMARY)) {
                  BT_INFO("already exist acl link, reject new! %s, %d", __func__, __LINE__);
                  hci_reject_conn(hdev, &ev->bdaddr);
                  return;
              }
          }
      
          if (hci_bdaddr_list_lookup(&hdev->blacklist, &ev->bdaddr,
                         BDADDR_BREDR)) {
              hci_reject_conn(hdev, &ev->bdaddr);
              return;
          }
      
      1 Reply Last reply Reply Quote Share 1
      • 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号

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