Невозможно поддерживать соединение BLE - BlueZ Linux <-> iOS - PullRequest
1 голос
/ 15 марта 2019

Установка:

Я использую BlueZ 5.48 на встроенной платформе Linux с Python example-gatt-server в качестве периферийного устройства. Я включаю рекламу с hciconfig hci0 leadv 0.

Я пытаюсь подключиться с помощью nRF Connect с iPhone (iOS v12.1.4).

Оба устройства находятся на моем столе и измеряют около -40 дБм RSSI, поэтому уровни сигнала должны быть хорошими.

Вопрос (ы):

Мне известно о нескольких проблемах, и я перечислю их в порядке приоритета (самый высокий вначале).

a) В nRF Connect на iPhone я могу увидеть устройство и подключиться, но через 30-60 секунд что-то вызывает отключение. Он никогда не запрашивает у меня разрешения на сопряжение или ввод PIN-кода.

б) В Linux я вижу, как Bluetooth: SMP security requested but not available печатается многократно, пока iPhone подключен.

c) На iPhone я не вижу своего периферийного устройства в обычном списке Bluetooth Devices ... никогда. (Это небольшая проблема ... хотя я хотел бы попробовать соединить таким образом, если это возможно.)

Что я пробовал:

1) Я удалил TestService с безопасными / зашифрованными характеристиками из кода example-gatt-server Python, поэтому все, что осталось, это службы Heartrate и Battery. Приложение iPhone nRF Connect по-прежнему отключается через 30-60 секунд.

2) Чтобы определить причину отключения, я посмотрел журнал для bluetooth.service в Linux:

Mar 15 18:44:57 sn0010 bluetoothd[775]: src/gatt-database.c:send_notification_to_device() GATT server sending notification
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:dev_disconnected() Device MAC_ADDR_HERE disconnected, reason 1
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:adapter_remove_connection()
Mar 15 18:44:58 sn0010 bluetoothd[775]: plugins/policy.c:disconnect_cb() reason 1
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:bonding_attempt_complete() hci0 bdaddr MAC_ADDR_HERE type 1 status 0xe
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:device_bonding_complete() bonding (nil) status 0x0e
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:device_bonding_failed() status 14
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/adapter.c:resume_discovery()
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:att_disconnected_cb()
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:att_disconnected_cb() Connection timed out (110)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d080: device MAC_ADDR_HERE profile batt-profile state changed: connected -> disconnecting (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d080: device MAC_ADDR_HERE profile batt-profile state changed: disconnecting -> disconnected (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d638: device MAC_ADDR_HERE profile deviceinfo state changed: connected -> disconnecting (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20d638: device MAC_ADDR_HERE profile deviceinfo state changed: disconnecting -> disconnected (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20ca00: device MAC_ADDR_HERE profile gap-profile state changed: connected -> disconnecting (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/service.c:change_state() 0x20ca00: device MAC_ADDR_HERE profile gap-profile state changed: disconnecting -> disconnected (0)
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/gatt-client.c:btd_gatt_client_disconnected() Device disconnected. Cleaning up.
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/device.c:att_disconnected_cb() Automatic connection disabled
Mar 15 18:44:58 sn0010 bluetoothd[775]: attrib/gattrib.c:g_attrib_unref() 0x21e968: g_attrib_unref=0
Mar 15 18:44:58 sn0010 bluetoothd[775]: src/gatt-database.c:att_disconnected()

Похоже, что произошел тайм-аут (причина 1).

3) Я изменил значения по умолчанию conn_min_interval=24, conn_max_interval=40, supervision_timeout=42 в Linux sysfs, чтобы они соответствовали рекомендациям Apple по совместимости. (Значения были изменены на 12, 24 и 200 явно.) Перезагрузка и перезапуск Bluetooth с этим не имели никакого значения.

4) Я пытался выдать btmgmt bredr off и btmgmt bondable off до hciconfig hci0 leadv 0, но без изменений.

5) Я запустил nRF Sniffer, но, похоже, он не захватывал события отключения. Я могу сказать, что мое периферийное устройство является рекламой, фильтруя его адрес BD, как показано ниже:

Sniffer

6) Я вообще отключил example-gatt-server. nRF Connect все еще может подключиться, но снова отключается через 30-60 секунд. Это, кажется, изолирует проблему в приложении для iOS, в стеке BlueZ или в более низких слоях / конфигурации драйверов Linux.

7) Подключение с помощью nRF Connect для Android работает нормально и поддерживает стабильное соединение столько, сколько я хочу.

Вопрос

У кого-нибудь есть совет, что попробовать дальше?

РЕДАКТИРОВАТЬ 1:

За комментарий, я запускаю btmon на хосте Linux, пока iPhone подключен. Я включил notify для Heartrate характеристики на iPhone. Журнал показывает отключение из-за тайм-аута.

< ACL Data TX: Handle 128 flags 0x00 dlen 7             #4792 [hci0] 105.414362 
      ATT: Read Request (0x0a) len 2                                            
        Handle: 0x0016                                                          
> ACL Data RX: Handle 128 flags 0x02 dlen 9             #4793 [hci0] 105.466957 
      ATT: Error Response (0x01) len 4                                          
        Read Request (0x0a)                                                     
        Handle: 0x0016                                                          
        Error: Insufficient Authentication (0x05)                               
> HCI Event: Number of Completed Packets (0x13) plen 5  #4794 [hci0] 105.467019 
        Num handles: 1                                                          
        Handle: 128                                                             
        Count: 1                                                                
< ACL Data TX: Handle 128 flags 0x00 dlen 7             #4795 [hci0] 105.474721 
      ATT: Read Request (0x0a) len 2                                            
        Handle: 0x0016                                                          
< ACL Data TX: Handle 128 flags 0x00 dlen 11            #4796 [hci0] 105.564168 
      ATT: Handle Value Notification (0x1b) len 6                               
        Handle: 0x000c                                                          
          Data: 0e7d6400                                                        
< ACL Data TX: Handle 128 flags 0x00 dlen 9             #4797 [hci0] 106.558967 
      ATT: Handle Value Notification (0x1b) len 4                               
        Handle: 0x000c                                                          
          Data: 0665                                                            
> HCI Event: Number of Completed Packets (0x13) plen 5  #4798 [hci0] 106.877481 
        Num handles: 1                                                          
        Handle: 128                                                             
        Count: 3                                                                
> HCI Event: Disconnect Complete (0x05) plen 4          #4799 [hci0] 106.877698 
        Status: Success (0x00)                                                  
        Handle: 128                                                             
        Reason: Connection Timeout (0x08)                                       
@ MGMT Event: Device Disconnected (0x000c) plen 8    {0x0001} [hci0] 106.877764 
        LE Address: 71:68:0B:72:0F:E9 (Resolvable)                              
        Reason: Connection timeout (0x01)                                       
@ MGMT Event: Device Disconnected (0x000c) plen 8    {0x0002} [hci0] 106.877764 
        LE Address: 71:68:0B:72:0F:E9 (Resolvable)                              
        Reason: Connection timeout (0x01)                           

1 Ответ

1 голос
/ 18 марта 2019

Я считаю, что моя проблема решена с использованием значений в соответствии с рекомендациями Apple по проектированию. Я отредактировал и перестроил ядро, поэтому параметры Bluetooth по умолчанию выглядят следующим образом:

$ cat /sys/kernel/debug/bluetooth/hci0/conn_min_interval 
12
$ cat /sys/kernel/debug/bluetooth/hci0/conn_max_interval 
12
$ cat /sys/kernel/debug/bluetooth/hci0/supervision_timeout 
500

Похоже, что поддерживается связь BLE между Linux и iPhone столько, сколько я хочу.

Примечание: пытаясь редактировать эти параметры через sysfs ранее, я считаю, что настройки были потеряны при перезагрузке ... или не были применены, как я думал. Я также использовал немного другие значения (conn_max_interval = 24 против 12 сейчас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...