2013-04-25 149 views
5

我目前正尝试使用BlueZ 5.0和Linux连接到多个BLE设备。我有一个主机BLE适配器,我已经修改了gattool来连接并执行此功能。如果我运行修改过的gatttool的实例,则我成功连接并接收来自BLE设备的通知数据。如果我运行修改后的gatttool的另一个实例并连接到另一个BLE设备,则此应用程序将开始接收来自两个BLE设备的通知数据,并且初始应用程序不再接收任何数据。我相信这是由于套接字设置,其中两个应用程序都将其套接字配置到相同的地址和PSM(最新的实例接收数据,而另一个则饿死)。有没有办法来防止这种情况?理想情况下,我想要一个应用程序连接到多个设备。我认为应用程序只能有一个套接字,因为多个套接字与上述多个实例具有相同的问题。我的BLE设备是作为心率监视器的TI CC2540遥控器。使用Linux和Bluez 5.0的多个BLE连接

+0

这不是你想要的吗?如果你想让一个应用程序连接到多个设备,那么你可以通过一个套接字来完成。我相信每条消息都会通过设备的BT地址发送,因此您可以将其与正确的设备相关联。 – 2013-04-26 14:16:08

+0

我现在明白我应该使用一个套接字。 ACL连接句柄应该用于分隔数据。我无法通过BlueZ访问此句柄。套接字(PF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM)创建套接字。 connect(sock,(struct sockaddr *)&addr,sizeof(addr))连接套接字。使用ioctl访问句柄(socket,HCIGETCONNINFO,cr)将返回一个errno 2(无文件)。目标地址是正确的。我上面创建的套接字返回值为5,而套接字= hci_open_dev(dev_id)返回值6.有没有更好的方法来获得这个句柄。 – user2321427 2013-04-26 18:40:36

+1

ioctl(socket,HCIGETCONNINFO,cr)方法适用于蓝牙传统设备,但不适用于BLE设备。我需要一种方法来访问BLE设备的ACL数据句柄以进行数据配对。 BlueZ有可能吗? – user2321427 2013-04-26 21:01:22

回答

2

我开始一个答案,所以我可以有更多的空间......

我使用Python和C的组合让我的代码工作,所以我的“代码”可能看起来很有趣,因为它可能是从任一。另外,我使用了Bluez 4,因为5不支持我正在使用的内核。让我知道是否有问题,我可以澄清。

看起来好像有几种做事的方式,但我最终打开了单独的套接字为不同的任务。你可以打开一个单一的套接字,然后设置套接字选项来取消过滤,你应该得到所有的数据包在一个地方。然而,这是我最初的做法,我发现我的联系会在几秒钟内死亡。

要扫描连接,我打开了socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI),然后在设备0上做了bind。 (有一个叫做hci_get_route的功能来获取可用的设备号)然后,您可以拨打hci_le_set_scan_parameters来设置选项setsockopt(SOL_HCI, HCI_FILTER, filter)以获得LE扫描事件,然后调用hci_le_set_scan_enable来打开扫描。

每个设备连接都由socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)组成,然后通过在具有特定设备地址的struct sockaddr_l2的套接字上调用connect来连接到特定设备。在该套接字上,您应该只能从该设备获取数据包。 (一个警告......我发现我的加密狗在主动扫描发生时不允许连接..在连接之前我必须暂时关闭它,然后再打开它。否则,我从errno获得BUSY错误)

说了这么多之后,虽然......我认为你应该在蓝色5中做所有事情的方式是使用DBUS。不幸的是,这不是我正在做的事情的一个选择。我提到的函数在共享库中,显然在5中默认没有安装(你必须明确要求它与configure一起安装)。他们默认停止安装共享库,因为他们想鼓励人们使用DBUS。

+0

我想最初解决这个问题,而不是使用DBUS。我需要检索与传入套接字数据关联的句柄,以便我可以将数据与正确的连接相关联。对于BLE设备,ioctl(套接字,HCIGETCONNINFO,cr)调用不起作用。你有没有方法可以访问与连接和传入数据相关的句柄信息? – user2321427 2013-04-29 12:53:19

+0

我不确定我是否明白...您是否启动连接?你是不是已经掌握了这个手柄,知道你连接了什么? – 2013-04-29 15:05:25

+1

当我执行连接(套接字,(struct sockaddr *)&addr,sizeof(addr))时,返回值为0,表示套接字连接已完成。如果我同时运行hcidump,我会看到句柄1025被分配给连接。该连接的其他数据事务使用该句柄。我正在尝试访问该句柄。 – user2321427 2013-04-29 16:23:45

1

我们结合了hcitool和gatttool的代码。该代码适用于2个设备(扫描,hci_le_create_conn和gatt_connect)。我相信对使用的设备数量没有限制。

1 Start cmd_lescan (from hcitool.c) 
2.For each device scanned - 
     cmd_lecc (from hcitool.c) 
     gatt_connect (from gatttool.c) 

这样一个进程就可以管理多个BLE设备。我们不必关闭扫描,只需忽略非广告信息:

 if (meta->subevent != 0x02) 
       continue; 

感谢并期待意见。

+0

你能解释为什么你使用cmd_lecc和GATT_connect建立到同一设备的两个连接? – abhiarora 2017-02-11 20:09:29

相关问题