Как получить событие отключения от сервера GATT в Bluez / Linux

Среда: Bluez 5.14, Linux 3.1, USB-радио BLE, брелок TI BLE (комплект разработчика CC2541) Устройство Linux ‹---hci----> USB BLE Radio

Мы включили события нажатия клавиш на брелоке TI с помощью gatttool и начали прослушивать события

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.

Задача:

Нам нужно поймать событие отключения GATT, т.е. когда мы вынимаем батарею из брелока, рано или поздно соединение GATT разрывается. Мы хотели бы получить событие отключения от стека Bluez. Bluez имеет эту возможность, поскольку Android поддерживает событие отключения GATT, которое создается на основе Bluez.

Вопрос:

Как мы получаем событие GATT Disconnect с помощью командной строки Bluez hcitool / gatttool или Bluez API.


person SC-SL    schedule 10.02.2014    source источник
comment
Проще говоря - как мы обнаруживаем, что соединение GATT или Bluetooth разорвано. Нам это нужно по многим причинам - чтобы очистить ресурсы, перезапустить lescan и т. Д.   -  person SC-SL    schedule 15.02.2014


Ответы (1)


Следите за 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);
}
person bill davis    schedule 17.02.2014
comment
Это работает как шарм, однако, поскольку обнаружение происходит на уровне GATT, обнаружение отключения из-за извлечения батареи занимает много времени. Обнаружение на уровне BLE было бы идеальным. - person SC-SL; 02.05.2014
comment
Приятно осознавать, что это вообще возможно. Но почему gatttool --listen не замечает отключения и просто зависает там навсегда? Это просто пресловутая глючность и недружелюбие к пользователю? На всякий случай bluez 4.101 (в комплекте с Ubuntu 14.04LTS). - person pfalcon; 30.11.2015