Начиная с Bluez 5.48, iPhone требует сопряжения при подключении к периферийному устройству BLE GAP, почему?

У меня есть приложение, работающее на встроенном устройстве с использованием Bluez 5.X и DBus.

  • Мое приложение устанавливает агент с возможностью «NoInputNoOutput» и адаптер как не подлежащий связыванию (я не хочу связываться).

  • Мое встроенное устройство не инициирует соединение (периферийное устройство GAP) и не транслирует рекламу (сервер GATT).

В BlueZ 5.48 (и 5.52), когда я пытаюсь подключиться к своему встроенному устройству с устройства Android, все работает плавно, но когда я пытаюсь использовать iOS, соединение теряется через некоторое время и в инструменте btmon есть следующие журналы:

> ACL Data RX: Handle 68 flags 0x02 dlen 9              #1050 [hci0] 398.940027
  ATT: Error Response (0x01) len 4
    Read Request (0x0a)
    Handle: 0x0016
    Error: Insufficient Authentication (0x05)
< ACL Data TX: Handle 68 flags 0x00 dlen 7              #1051 [hci0] 398.940268
      ATT: Read Request (0x0a) len 2
        Handle: 0x0016
> ACL Data RX: Handle 68 flags 0x02 dlen 9              #1052 [hci0] 398.991500
      ATT: Error Response (0x01) len 4
        Read Request (0x0a)
        Handle: 0x0016
        Error: Insufficient Authentication (0x05)

Если мое приложение устанавливает адаптер как платный (но я не хочу), у меня появляется всплывающее окно на iPhone (не на Android), чтобы разрешить сопряжение

Информация:

  • У меня нет этой проблемы с BlueZ 5.47
  • Я не вижу свое встроенное устройство в обычном списке Bluetooth «Устройства» iPhone.
  • У меня проблема, даже если мое приложение не настраивает никаких характеристик

Я не нашел (в журнале изменений и git) изменения с BlueZ 5.47, которое могло бы вызвать эту проблему. Любые идеи ?

Я думаю, что на iPhone есть сервер GATT, потому что я могу видеть много объектов, которые зарегистрированы на DBus при подключении. У меня нет этой проблемы с androïd, даже когда я настраиваю сервер GATT с характеристикой с разрешениями «Чтение зашифрованного» (nRF Connect)

Мой анализ:

  1. На Iphone запускаю соединение со своим встроенным устройством

  2. Мое встроенное устройство пытается что-то прочитать (характеристика защищена?) На iPhone (NOK !! Почему?)

  3. В iPhone отказываются "Недостаточное шифрование" (?)

  4. Мое встроенное устройство отправляет «Запрос безопасности»

  5. Iphone отправляет «запрос на сопряжение»

  6. Мой встроенный отказ "Reason Pairing Not Supported"

Изменить: появляется всплывающее окно с фиксацией «client: Rename set-filter-uuids to uuids» (e1021f7e486ebd6c0618673a758fa2c50d81109c) (между Bluez 5.47 и 5.48)


person gdv    schedule 06.12.2019    source источник
comment
Можете ли вы выяснить, какой атрибут он пытается прочитать?   -  person Emil    schedule 17.01.2020


Ответы (2)


Это немного поздно, но, надеюсь, это поможет другим, у кого есть такая же проблема.

Эта проблема начала возникать в Bluez v5.48 после того, как характеристика батареи GATT была перенесена в интерфейс DBUS org.bluez.Battery1.

Самый простой способ решить эту проблему - предотвратить загрузку плагина батареи Bluez при загрузке. Вам нужно будет изменить служебный файл bluetooth, расположенный по следующему пути: /lib/systemd/system/bluetooth.service. В этом файле перейдите к строке, которая начинается с ExecStart, и убедитесь, что в этой строке указано ExecStart = / usr / lib / bluetooth / bluetoothd -P battery (без окружающих кавычек). Эта опция -P предотвращает загрузку любых перечисленных подключаемых модулей.

Другой способ решить проблему - написать собственный агент, который автоматически принимает запросы на сопряжение. Я использовал пример простого агента Bluez и изменил его таким образом что функция RequestPinCode всегда успешно возвращала вместо запроса ввода. Обратной стороной такого подхода является то, что он по-прежнему просит пользователя iOS выполнить сопряжение. Хотя это может быть положительным результатом, если вы хотите иметь надежный и шифрованный доступ через полностью спаренное соединение Bluetooth.

person Austin    schedule 25.03.2021
comment
Это была моя проблема. Спасибо. Gatt Server отлично работал на Android, но на Iphone продолжал запрашивать сопряжение даже с агентом регистрации с NoInputNoOutput. - person Tim Truty; 11.06.2021

Моя процедура была неправильной (всплывающее окно не появляется с фиксацией «client: Rename set-filter-uuids to uuids»: «client» соответствует «bluetoothctl» и не имеет ничего общего с моим использованием).

Собственно появляется всплывающее окно с аккумуляторным модулем. Я не знаю почему, но меня устраивает этот обходной путь (работает с Bluez 5.48 и 5.52):

В файле Makefile.plugins удалите строки:

builtin_modules += battery
builtin_sources += profiles/battery/battery.c

И загрузите автопроизводитель в свой "bluez5_utils.mk":

BLUEZ5_UTILS_AUTORECONF = YES


Спасибо, Эмиль, что рассмотрел мой вопрос. Я сравнил журналы "/ var / log / message", которые я получил во время соединения со всплывающим окном и без него: единственные различия, в которых:

Эти строки появляются только при подключении к всплывающему окну:

profiles/battery/battery.c:batt_probe() BATT profile probe (6E:FA:33:75:2A:6A)
src/service.c:change_state() 0x8c17200: device 6E:FA:33:75:2A:6A profile batt-profile state changed: unavailable -> disconnected (0)
profiles/battery/battery.c:batt_accept() BATT profile accept (6E:FA:33:75:2A:6A)
src/service.c:change_state() 0x8c17200: device 6E:FA:33:75:2A:6A profile batt-profile state changed: disconnected -> connected (0)

И эти строки появляются только при подключении без всплывающего окна:

src/gatt-client.c:service_create() Exported GATT service: /org/bluez/hci0/dev_6E_FA_33_75_2A_6A/service0014
src/gatt-client.c:characteristic_create() Exported GATT characteristic: /org/bluez/hci0/dev_6E_FA_33_75_2A_6A/service0014/char0015
src/gatt-client.c:descriptor_create() Exported GATT characteristic descriptor: /org/bluez/hci0/dev_6E_FA_33_75_2A_6A/service0014/char0015/desc0017
person gdv    schedule 27.01.2020
comment
Я устанавливаю bluez из архива на их сайте. Я изменил Makefile.plugins, но не вижу bluez5_utils.mk. Дескриптор 0x0016 по-прежнему выдает повторяющиеся ошибки после того, как я сделал и установил эту модификацию. Возможно, это потому, что мне не хватает того файла .mk. - person Austin; 25.03.2021