Bluetooth 如何在Bluez/Linux上从GATT服务器获取断开连接事件

Bluetooth 如何在Bluez/Linux上从GATT服务器获取断开连接事件,bluetooth,embedded-linux,bluetooth-lowenergy,bluez,gatt,Bluetooth,Embedded Linux,Bluetooth Lowenergy,Bluez,Gatt,环境:Bluez5.14、Linux3.1、USB可插拔收音机、遥控钥匙(CC2541开发工具包) Linux设备USB可编程无线电 我们使用gatttool在TI keyfob上启用按键事件,并开始侦听事件 gatttool -b [hardware ID] --char-write-req -a [handle] -n [value] --listen (gatttool -b 90:59:AF:09:E1:5D --char-write-req -a 0x0048 -n 0100 --l

环境:Bluez5.14、Linux3.1、USB可插拔收音机、遥控钥匙(CC2541开发工具包) Linux设备USB可编程无线电

我们使用gatttool在TI keyfob上启用按键事件,并开始侦听事件

gatttool -b [hardware ID] --char-write-req -a [handle] -n [value] --listen 
(gatttool -b 90:59:AF:09:E1:5D --char-write-req -a 0x0048 -n 0100 --listen)
按下遥控钥匙上的按钮并查看这些事件

Notification handle = 0x0047 value: 02 
Notification handle = 0x0047 value: 00 
Notification handle = 0x0047 value: 02
因此,我们可以通过Bluez堆栈从Keyfob接收按键事件

目标:

我们需要捕捉GATT断开事件,即当我们从遥控钥匙上取下电池时,GATT连接迟早会断开。我们希望从Bluez堆栈接收断开连接事件。Bluez有这个功能,因为Android支持基于Bluez构建的GATT断开连接事件

问题:


我们如何使用Bluez命令行hcitool/gattool或Bluez API接收GATT断开连接事件。

注意G_IO_HUP并正常关机

chan = gatt_connect(opt_src, opt_dst, opt_dst_type, opt_sec_level,
                opt_psm, opt_mtu, connect_cb, &gerr);
if (chan == NULL) {
    log_printf(LOG_LEVEL_ERROR,"%s: chan is NULL\n",__func__);
    log_printf(LOG_LEVEL_ERROR,"%s\n", gerr->message);
    g_error_free(gerr);
    g_main_loop_quit(event_loop);
} else {
    log_printf(LOG_LEVEL_INFO,"Connected to %s\n",opt_dst);
    g_io_add_watch(chan, G_IO_HUP, channel_watcher, NULL);
}

简单地说,我们如何发现GATT或蓝牙连接中断。我们需要这样做有很多原因-清理资源,重新启动lescan等。这就像一个魅力,然而,由于检测是在GATT层,由于电池移除导致的断开需要很长时间来检测。在BLE层进行检测是理想的。很高兴知道这是可能的。但为什么“gatttool——听着”没有注意到断开连接,只是永远挂在那里?这只是臭名昭著的bluez错误和用户不友好吗?以防万一,Bluez4.101(与Ubuntu 14.04LTS一起提供)。