Ядро: Linux 4.9.84 Armv7l на борту
Блюз: 5.65
Аналог: Android 12 и iOS 16.6
Приложение:
btmgmt выключить
btmgmt можно подключить
btmgmt можно подключить
btmgmt включи
кстати, продолжай
btmgmt io-cap 0x3 (установить возможность ввода-вывода как NoInputNoOutput)
btmgmt ssp включен (использовать устаревший режим)


Процесс:
Я не создавал вручную агент с возможностью ввода-вывода через bluetoothctl, но с помощью описанных выше операций кажется, что протокол автоматически создает агент для решения проблем с сопряжением, когда я пытаюсь получить доступ к характеристике с требованием шифрования.
Мы можем видеть общение через btmon.
> ACL Data RX: Handle 24 flags 0x02 dlen 11 #240 [hci0] 74.105218
SMP: Pairing Request (0x01) len 6
IO capability: KeyboardDisplay (0x04)
OOB data: Authentication data not present (0x00)
Authentication requirement: Bonding, MITM, SC, No Keypresses, CT2 (0x2d)
Max encryption key size: 16
Initiator key distribution: EncKey IdKey Sign LinkKey (0x0f)
Responder key distribution: EncKey IdKey Sign LinkKey (0x0f)
< ACL Data TX: Handle 24 flags 0x00 dlen 11 #241 [hci0] 74.105300
SMP: Pairing Response (0x02) len 6
IO capability: NoInputNoOutput (0x03)
OOB data: Authentication data not present (0x00)
Authentication requirement: Bonding, MITM, Legacy, No Keypresses (0x05)
Max encryption key size: 16
Initiator key distribution: EncKey Sign (0x05)
Responder key distribution: EncKey Sign (0x05)
> HCI Event: Number of Completed Packets (0x13) plen 5 #242 [hci0] 74.224936
Num handles: 1
Handle: 24 Address: 67:D0:40:D9:1D:BF (Resolvable)
Count: 1
> ACL Data RX: Handle 24 flags 0x02 dlen 21 #243 [hci0] 75.304575
SMP: Pairing Confirm (0x03) len 16
Confim value: bf331d0c1af509252c7ac50a03acc66f
< ACL Data TX: Handle 24 flags 0x00 dlen 21 #244 [hci0] 75.304672
SMP: Pairing Confirm (0x03) len 16
Confim value: ac378c91768d6efd8b5b07ad5cd78ba4
> HCI Event: Number of Completed Packets (0x13) plen 5 #245 [hci0] 75.425942
Num handles: 1
Handle: 24 Address: 67:D0:40:D9:1D:BF (Resolvable)
Count: 1
> ACL Data RX: Handle 24 flags 0x02 dlen 21 #246 [hci0] 75.484575
SMP: Pairing Random (0x04) len 16
Random value: 830af66a612fb5dcb8bf8376a43b8dda
< ACL Data TX: Handle 24 flags 0x00 dlen 6 #247 [hci0] 75.486908
SMP: Pairing Failed (0x05) len 1
Reason: Confirm value failed (0x04)
> HCI Event: Number of Completed Packets (0x13) plen 5 #248 [hci0] 75.545938
Num handles: 1
Handle: 24 Address: 67:D0:40:D9:1D:BF (Resolvable)
Count: 1
> HCI Event: Disconnect Complete (0x05) plen 4 #249 [hci0] 79.624942
Status: Success (0x00)
Handle: 24 Address: 67:D0:40:D9:1D:BF (Resolvable)
Reason: Remote User Terminated Connection (0x13)

Проблема: Я столкнулся с проблемой, когда на этапе подтверждения не удалось подтвердить периферийное устройство (мою плату). Подробности смотрите в сообщении btmon на рисунке выше.
ps: Эта картинка из Core_v5.4 Vol3, Part H, патч 1618
Подозрение:
Я не совсем уверен, где находится проблема, но после прочтения формулы расчета подтверждения я подозреваю, что это может быть связано с различиями в алгоритмах между моим телефоном и моей платой или проблемой с адресом, поскольку другие параметры кажутся одинаковыми. .
Я попытался подключиться к своей виртуальной машине (Ubuntu) через Bluetooth с той же версией BlueZ и теми же операциями, и это сработало! Поэтому я подозреваю, что проблема кроется в конфигурации ядра моей платы.





В конечном итоге проблема была обнаружена в конфигурации ядра Linux.
Рекомендуемая конфигурация от Bluez показана на рисунке ниже.
(Скриншот из учебного руководства A1 Bluetooth Linux — Установка и настройка.pdf, страница 4, загруженного с официального сайта)
Однако эта конфигурация приводит к сбою вычисления значения подтверждения, поэтому необходима дополнительная конфигурация.
* User-space interface for random number generator algorithms