Как настроить Bluez 5 для запроса пин-кода во время сопряжения

Я реализовал интерфейс org.bluez.Agent1 с помощью QDbus и хотел бы установить фиксированный пин-код (который я предоставлю пользователям), чтобы аутентифицировать все запросы на сопряжение и отклонять их, если пин-код неправильный. Возможности агента должны быть «NoInputNoOutput», потому что проект будет развернут на RaspberryPi 3 без клавиатуры и дисплея. Есть ли способ справиться с этим? Спасибо


person Cristiano    schedule 25.07.2018    source источник


Ответы (2)


Вы не должны инициализировать возможность как «NoInputOutput» для фиксированной пары ключей. NoInputOutput означает, что для этого устройства нет дисплея и клавиатуры/интерфейса. Упоминание этой возможности для вашего агента при регистрации в BlueZ означает указание BlueZ (bluetoothd) не вызывать какой-либо API агента для аутентификации.

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

Вам нужно "DisplayOnly" возможность указать BlueZ вызывать "DisplayPinCode" или "DisplayPasskey" в зависимости от поддержки SSP вашего устройства.

Вы можете реализовать DisplayPinCode/DisplayPasskey в своем агенте, чтобы всегда отвечать на постоянный PIN-код. Таким образом, устройство Bluetooth, которое пытается подключиться, может использовать тот же постоянный PIN-код для сопряжения.

Здесь Display Pin/Passkey — это просто соглашение об именах или подсказка разработчикам агентов для написания мастера/UI или любой другой формы операций отображения. Но вы можете полностью игнорировать операцию отображения и ответить статическим/постоянным 6-значным ключом для сопряжения.

Обычно этот API-интерфейс агента вызывается Bluez (в rasperry pi), когда устройство (мобильное устройство iPhone/Android/любое устройство с поддержкой Bluetooth) пытается выполнить пару вызовов «RequestPasskey" или "RequestPinCode" со стороны устройства.

person Parthiban    schedule 26.07.2018
comment
Я изменил возможность агента на DisplayOnly, как вы предложили, но при сопряжении с Android-устройством я заметил, что вызывается только RequestConfirmation. Я использую метод Android createBond - person Cristiano; 26.07.2018
comment
@Cristiano: Извините. RequestConfirmation также подпадает под отображение. Таким образом, Android может использовать это по умолчанию. Можете ли вы попробовать KeyboardOnly, это заставляет Android вводить ключ в пользовательском интерфейсе. - person Parthiban; 26.07.2018
comment
Решено, я пропустил hciconfig hci0 sspmode 0 на Raspberry. Мне удалось вернуть фиксированную строку в RequestPin и вставить ее в пару. Спасибо! Однако я не вижу Raspberry с устройств iOS, вы что-то знаете об этом? - person Cristiano; 26.07.2018
comment
@Cristiano Вы уже установили свойство Discoverable? - person Parthiban; 26.07.2018
comment
Да, это проблема только iOS. Я вижу Raspberry из Android, Linux и Windows - person Cristiano; 26.07.2018
comment
Как я вижу, с помощью sspmode 1 мы не можем установить фиксированный пин. Мы не можем ничего вернуть из Display Pin /Passkey, так как тип результата этих методов — void. RequestPasskey/RequestPinCode не предназначено для создания PIN-кода, а для того, чтобы попросить пользователя ввести PIN-код, который он видит на другом сопряженном устройстве (поэтому соединение не удастся, если вы вернете какой-либо другой PIN-код, а не тот, который был сгенерирован другим устройством) - person Shaddix; 15.10.2019
comment
Таким образом, единственный способ установить фиксированный PIN-код с помощью bluez — это использовать sspmode 0, что в настоящее время не является лучшей практикой безопасности. Пожалуйста, поправьте меня, если я ошибаюсь - person Shaddix; 15.10.2019
comment
@Shaddix Это не так. Я поделюсь рабочим образцом агента с фиксированным корпусом. - person Parthiban; 15.10.2019
comment
@Shaddix Как упоминалось ранее, вы можете найти пример простого агента здесь: Это не очень хорошо написано. Но это просто дает представление о том, как агент может реагировать фиксированным образом. Я использовал fscanf для получения PIN-кода от взаимодействия с пользователем, что не рекомендуется. Вы можете заменить, поставив фиксированный PIN-код аналогично в любом API - person Parthiban; 20.10.2019

У нас была такая же проблема в проекте, и я перешел на устройство LE к тому факту, что устройство Apple может подключаться к устройству LE только из соображений «безопасности».

У меня не так много ссылок на это, но если это может помочь вам в ваших исследованиях.

person nico SteX    schedule 28.09.2018