Оборудование

У меня есть две системы, которые я буду называть "ноутбук" и "встроенная система". Я могу подключиться к ноутбуку без повторного подключения. Моя проблема в том, что я не могу на встроенной системе.

Я подключаюсь / подключаюсь к безголовому устройству SPP (протокол последовательного порта), которое, как я предполагаю, является Bluetooth 2.0, но я не совсем уверен. Есть кнопка, которую я могу нажать, чтобы войти в режим сопряжения, который быстро мигает синим светодиодом, показывая, что он находится в режиме сопряжения. Устройство не входит в режим сопряжения, пока я не нажму кнопку.

Если я запускаю sudo sdptool search --bdaddr XX:XX:XX:XX:XX:XX SP (я заменил адрес устройства Bluetooth на XX), я получу:

Searching for SP on XX:XX:XX:XX:XX:XX ...
Service Name: (redacted)-SPP
Service RecHandle: 0x10000
Service Class ID List:
  "Serial Port" (0x1101)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1

портативный компьютер

На ноутбуке установлена стандартная версия Ubuntu MATE 16.04 с графическим интерфейсом MATE, bluez 5.37, blueman-applet, bluetoothd и dbus, Python и т.д.

Я могу использовать blueman-апплет «Настройка нового устройства ...», который запускает "Помощник по настройке устройства Bluetooth". Затем я нажимаю кнопку устройства, устройство распознается, я выбираю пару, я выбираю подключение к последовательному порту. Мне дали /dev /rfcomm0, который работает для связи с устройством. Я вижу "Fully" под именем устройства в blueman-applet (я не уверен, что означает "Fully" в этом контексте, но, кажется, это указывает на хорошее состояние).

Если я затем выключу ноутбук и устройство, а затем снова включу их, blueman-applet по-прежнему показывает устройство, и я могу подключить его к последовательному порту. Сопряжение не требуется.

Встроенная система

Встроенная система представляет собой устройство ARM, работающее под управлением OpenWRT, с установленным bluez 5.47. Там нет GUI или Blueman-апплет. В системе не работает ни bluetoothd, ни dbus (хотя оба доступны) и не установлен python. Мне разрешено запускать bluetoothd и / или dbus, но только если они необходимы. Мне не разрешается устанавливать python ни при каких обстоятельствах, поэтому, если мне потребуется функциональность, которую предоставляют только скрипты python, мне придется перенести ее на C. Если это окажется необходимым, любые намеки на то, какие скрипты мне понадобятся в порт будет приветствоваться.

Во встроенной системе я перевожу устройство в режим сопряжения, затем выдаю следующие команды:

echo 1234 | sudo /usr/bin/btmgmt --index hci0 pair XX:XX:XX:XX:XX:XX
sudo /usr/bin/rfcomm -i hci0 bind 0 XX:XX:XX:XX:XX:XX 1

Затем я могу подключиться к /dev /rfcomm0.

Если я выключаю устройство Bluetooth и выполняю эти команды, я могу восстановить соединение:

sudo /usr/bin/rfcomm -i hci0 release 0
sudo /usr/bin/rfcomm -i hci0 connect 0 XX:XX:XX:XX:XX:XX 1

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

Can't connect RFCOMM socket: Operation now in progress

И если я попробую еще раз:

Can't connect RFCOMM socket: Connection refused

Запуск sudo hcidump -X дает:

< HCI Command: Create Connection (0x01|0x0005) plen 13
    bdaddr XX:XX:XX:XX:XX:XX ptype 0xcc18 rswitch 0x01 clkoffset 0x0000
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 
> HCI Event: Command Status (0x0f) plen 4
    Create Connection (0x01|0x0005) status 0x00 ncmd 1
> HCI Event: Connect Complete (0x03) plen 11
    status 0x00 handle 11 bdaddr XX:XX:XX:XX:XX:XX type ACL encrypt 0x00
< HCI Command: Read Remote Supported Features (0x01|0x001b) plen 2
    handle 11
> HCI Event: Command Status (0x0f) plen 4
    Read Remote Supported Features (0x01|0x001b) status 0x00 ncmd 1
> HCI Event: Read Remote Supported Features (0x0b) plen 11
    status 0x00 handle 11
    Features: 0xff 0xee 0x8d 0xfa 0x9b 0xef 0x79 0x83
< HCI Command: Read Remote Extended Features (0x01|0x001c) plen 3
    handle 11 page 1
> HCI Event: Command Status (0x0f) plen 4
    Read Remote Extended Features (0x01|0x001c) status 0x00 ncmd 1
> HCI Event: Read Remote Extended Features (0x23) plen 13
    status 0x00 handle 11 page 1 max 1
    Features: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
< HCI Command: Remote Name Request (0x01|0x0019) plen 10
    bdaddr XX:XX:XX:XX:XX:XX mode 2 clkoffset 0x0000
< ACL data: handle 11 flags 0x00 dlen 10
    L2CAP(s): Info req: type 2
> HCI Event: Command Status (0x0f) plen 4
    Remote Name Request (0x01|0x0019) status 0x00 ncmd 1
> HCI Event: Max Slots Change (0x1b) plen 3
    handle 11 slots 5
> ACL data: handle 11 flags 0x02 dlen 12
    L2CAP(s): Info rsp: type 2 result 1
      Not supported
< ACL data: handle 11 flags 0x00 dlen 12
    L2CAP(s): Connect req: psm 3 scid 0x0040
> HCI Event: Number of Completed Packets (0x13) plen 5
    handle 11 packets 2
> HCI Event: Remote Name Req Complete (0x07) plen 255
    status 0x00 bdaddr XX:XX:XX:XX:XX:XX name '(redacted)'
> ACL data: handle 11 flags 0x02 dlen 16
    L2CAP(s): Connect rsp: dcid 0x0041 scid 0x0040 result 3 status 0
      Connection refused - security block
> HCI Event: Disconn Complete (0x05) plen 4
    status 0x00 handle 11 reason 0x05
    Reason: Authentication Failure

Конечно, если я затем нажму кнопку сопряжения и начну сначала с btmgmt и т.д., Я смогу подключиться. Однако я не могу использовать это в качестве своего решения, потому что мне нужно иметь возможность подключить устройство один раз, а затем автоматически подключиться.

Исходя из вывода hcidump, я предполагаю, что ключ, сгенерированный во время начального процесса сопряжения, был потерян (или, по крайней мере, не загружен). Я потратил несколько дней, пытаясь понять исходный код bluez, а затем даже глядя на исходный код модуля ядра, чтобы попытаться понять, что происходит, но код очень смущает меня, я думаю, потому что все проходит через dbus, а затем через HCI ... или что-то в этом роде, я действительно очень мало представляю, что происходит со стеком Bluetooth. До сих пор я не смог выяснить, где происходила генерация парного ключа или где ключи сохранялись на диске.

Вопрос

Без запуска bluetoothd/dbus (и без python), как я могу повторно подключиться через консоль к ранее сопряженному устройству после выключения и включения питания встроенной системы?

Если это невозможно, как я могу переподключиться, как описано выше, если у меня работает bluetoothd/dbus (но все еще нет python)?

Если это также невозможно, то в каком файле исходного кода находится код генерации ключа сопряжения (функция также будет полезна), в каком файле / функции исходного кода находится код сохранения ключа и где хранятся ключи сопряжения на диске? Любые другие советы о том, как взломать это делать то, что я хочу?

Большое спасибо!

0