2017-02-09 12 views
19

Я хочу использовать любой мобильный телефон для подключения к устройству IoT через Bluetooth Classic с протоколом последовательного порта (SPP). Устройство IoT не имеет экрана и не имеет клавиатуры, и предполагается, что он автоматически подключается к подключению, если соединительный телефон знает секретный PIN-код (т. Е. Я не хочу, чтобы меня заставляли ssh в устройстве IoT настраивать сопряжение каждый раз новый мобильный телефон пытается подключиться).Настройка автоматического спаривания Bluetooth на Linux

Это команды, которые я до сих пор работают на устройстве IoT:

# Make the device discoverable: 
hciconfig hci0 piscan 

# Register SPP: 
sdptool add --channel=22 SP 

# Start rfcomm: 
rfcomm -r watch /dev/rfcomm0 22 

К сожалению, я не мог найти способ, чтобы создать ПИН-код, и спаривание происходит сбой при попытке подключения с мобильным телефоном. Кроме того, устройство можно обнаружить только на короткий промежуток времени.

Как настроить Bluetooth-стек устройства IoT (запуск последнего Bluez) для автоматической пары с любым телефоном, который знает данный PIN-код, и как сделать период обнаружения вечным?

+0

Вы можете использовать утилиту «bluetoothctl», который поставляется с Bluez библиотеки , Необходимо активировать агент для аутентификации. Поскольку ваша система безголовая, использование может использовать «NoInputNoOutput». Это позволяет избежать взаимодействия ключа доступа для аутентификации (bluetoothctl agen NoInputNoOutput). Но если вы хотите принять все соединение, используйте интерфейс Dbus «org.bluez.AgentManager1», чтобы зарегистрировать собственный агент с минимальным методом «RequestAuthorization», реализованный в «org.bluez.Agent1» –

+0

Но если я запустил bluetoothctl и установил " агент NoInputNoOutput ", он все равно спросит меня, следует ли принимать соединение. Вы говорите мне, что у него другое поведение, если оно установлено в пакетном режиме? Что касается создания моей собственной реализации AgentManager1, это похоже на переосмысление колеса. Разве Bluez не поставлялся с менеджером агента? –

+0

Да, он по-прежнему просит подтверждения (да/нет). Но вы можете ответить на него «Да», написав собственный простой агент, используя интерфейс Agent1. Да, BlueZ предоставляет менеджеру агента «DisplayOnly», «DisplayYesNo», «KeyboardOnly», «NoInputNoOutput» и «KeyboardDisplay» эти возможности. Поскольку вам нужен специальный случай для принятия без какого-либо вмешательства, вы можете добиться этого с помощью своего собственного агента1, отправляющего «Да», –

ответ

0

Вы можете запустить приложение, которое реализует BlueZ DBus API. Я рекомендую BlueZ> = 5.42. Используйте интерфейс агента и реализуйте собственный PIN-код. После регистрации вашего агента bluez автоматически вызовет вызов и использует ваш собственный агент при запросе сопряжения.

Кроме того, вы можете установить DiscoverableTimeout на 0 через DBus с интерфейсом org.bluez.Adapter1.

«Значение означает, что таймаут отключен, и он останется в режиме для обнаружения/ограничения навсегда».

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt (DBus объект адаптер док) https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/agent-api.txt (DBus объект агент док) https://kernel.googlesource.com/pub/scm/bluetooth/bluez/+/5.44/test/simple-agent (образец) http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/ (чтение в нижней части)