问题背景
系统: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;
}
原贴链接:https://bbs.aw-ol.com/topic/1076/
全志在线开发者交流企鹅群(客服机器人24小时在线解答):498263967
资源获取、问题讨论可以到全志在线开发者社区进行:https://www.aw-ol.com
全志及开发者最新动态可以关注全志在线微信公众号