Сопряжение BluetoothCtl с pin-кодом с использованием подпроцесса python на Raspberry Pi

#bluetooth #subprocess #raspberry-pi3 #hc-05

#bluetooth #подпроцесс #raspberry-pi3 #hc-05

Вопрос:

Я работаю над проектом для связи между Raspberry pi и серией Arduino, используя модули Bluetooth HC-05, через соединение Bluetooth. Я могу выполнить сопряжение arduino с помощью bluetoothctl и обмена данными с использованием скриптов python, но я хотел бы также включить процесс сопряжения в свои скрипты, но я не нашел решения, которое включало бы в скрипты PIN-код сопряжения Bluetooth.

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

  1. Библиотека PyBluez, но она не может выполнить сопряжение.
  2. Подпроцесс, но я не могу ответить на запрос pin-кода (код ниже), но это приводит к ошибке слишком большого количества аргументов (для bluetoothctl).
 import subprocess, shlex
addr = "00:14:03:06:12:84"
pinCode = "1234"

args = ["bluetoothctl", f"pair {addr}", pinCode]
args = shlex(args)
subprocess.Popen(args)
  
  1. Я также пытался использовать оболочку bluetoothctl, но здесь также нет опции pin-кода.

Возможно ли сопряжение через python?

Ответ №1:

Bluez ожидает, что это будет сделано с помощью API агента D-Bus, который задокументирован на https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/agent-api.txt

В исходном дереве Bluez также есть пример Python: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/simple-agent

Поскольку сопряжение обычно представляет собой одноразовый этап подготовки / обеспечения безопасности, на котором происходит обмен ключами и устройство устанавливается как доверенное, я сомневаюсь в ценности автоматизации процесса сопряжения. Вы действительно хотите выполнить сопряжение с устройствами, которые появляются случайным образом и находятся в пределах досягаемости?

Для последующих подключений между RPi и HC-05 не обязательно сначала выполнять этап сопряжения. Raspberry Pi потребуется только для вызова команды подключения, поскольку два устройства уже сопряжены и им доверяют.

Комментарии:

1. цель состоит в том, чтобы создать удаленную ферму микроконтроллеров и Raspberry Pi. По мере роста фермы со временем будут добавляться новые arduino (оснащенные hc-05), я бы предпочел, чтобы мы могли подключать новые устройства по мере их поступления. Если это невозможно, я думаю, мы будем ограничены «ручным» процессом. Большая часть взаимодействия осуществляется через веб-приложение, которое мы разработали, где пользователи, по большей части, могут просто использовать пользовательский интерфейс для управления различными устройствами.

2. API агента предоставляет вам всю гибкость, необходимую для достижения желаемого. Если бы я хотел порассуждать, я бы ожидал, что ваш RPi не будет постоянно сканировать новые близлежащие устройства. Я предполагаю, что сканирование контролируется из вашего веб-приложения, поэтому нет причин, по которым вы также не могли ввести pin-код через пользовательский интерфейс. При поиске «Примеров BlueZ agent» было найдено несколько интересных ссылок, таких как: kynetics.com/docs/2018/pairing_agents_bluez и raspberrypi.org/forums/viewtopic.php?t=170271

3. спасибо @ukBaz. Вы ведете меня по правильному пути, но в конце концов я нашел другое решение, которое не требовало такого количества переменных. Ваши ссылки предоставили правильную формулировку для поиска, и я обнаружил, что pexpect отлично подходит для этого самого сценария. Мое решение: github.com/NerdboyQ/2020_Arduino_Pi_IOT_Project/blob/master /…