2015-02-03 3 views
2

подключить к Bluetooth-ле периферическая с помощью следующей команды:Как установить время ожидания соединения BLE gatttool на Raspberry Pi?

  • gatttool -t случайная -b хх: хх: хх: хх: хх: хх -I
  • и подключить

Если данный MAC-адрес существует, у меня нет проблем.

Если данный MAC-адрес не существует, gatttool пытается подключить около 40 секунд, пока ответ gatttool не будет «Ошибка: connect error: Connection reject (111)».

Мой вопрос в том, как и где я могу изменить 40-минутный тайм-аут соединения gatttool?

+0

Вы решили свою проблему? – abhiarora

ответ

0

К сожалению, я не думаю, что это все равно, если вы не хотите изменить код gatttool. Я раньше смотрел и вижу в коде, что gatttool выполняет блокирующий сокет «connect».

+0

Не стоит менять код gatttool, но я не могу найти параметр, который мне нужно изменить. Не могли бы вы рассказать мне, что я должен изменить? – Steff

2

Тайм-аут соединения определяется в модуле bluetooth ядра Linux (L2CAP_CONN_TIMEOUT), и нет способа изменить его в пользовательском пространстве. (Есть еще одна константа, HCI_LE_CONN_TIMEOUT, но я не думаю, что это используется для этой цели.) Однако я считаю, что если вы закрываете соединение или убиваете процесс, ядро ​​должно отправить правильную команду LE Create Connection Cancel, чтобы вы могли вскоре после этого подключитесь к кому-то другому.

+0

Я использую DBUS Bluez API, и похоже, что ядро ​​посылает LE Create Connection Отменить запрос, если устройство BLE не отвечает в течение нескольких секунд. Что нужно изменить, чтобы bluetoothd работал правильно – abhiarora

0

Если вы готовы изменить код gatttool, вам нужно будет добавить тайм-аут в гнездо подключения в Bluez.

Мне пришлось сделать то же обходное решение, когда я написал GattLib, чтобы избежать блокировки повтора.

Вы можете увидеть мои изменения в этой фиксации: https://github.com/labapart/gattlib/commit/ee58e4cb64af6c698dea1fabb5b6d5e0fc174883

Но основные изменения эти строки:

if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { 
     fprintf(stderr, "l2cap_connect: Failed to setsockopt for receive timeout.\n"); 
     return -1; 
    } 

    if (setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { 
     fprintf(stderr, "l2cap_connect: Failed to setsockopt for sending timeout.\n"); 
     return -1; 
    } 

Вы могли бы быть заинтересованы в примере GattLib ble_scan если вы хотите, чтобы написать свой собственный код ,

+0

, пожалуйста, проверьте этот URL-адрес (http://stackoverflow.com/tour), это поможет вам повысить качество контента –

Смежные вопросы