Устройство Bluetooth отключается при пересылке пакетов - PullRequest
0 голосов
/ 05 мая 2020

У меня есть контроллер Nintendo Pro и коммутатор Nintendo. У меня есть программа, которая создает соединение l2cap с контроллером, а затем открывает сервер l2cap для подключения коммутатора, в то время как мой ноутбук рекламирует себя как Pro Controller. Как только оба подключены, программа просто пересылает все данные с каждого устройства на другое, действуя как прокси-сервер, чтобы я мог читать трафик c. В частности, он подключается к портам 17 и 19 для управления и прерывания и пересылает все. Это порты для протокола Bluetooth HID.

По прошествии нескольких минут, когда я вызываю чтение в сокете контроллера, я получаю сообщение об ошибке ENOSYS, а затем контроллер отключается.

Я пробовал запустить strace, который только что показал вызов чтения, возвращающий ENOSYS, и ничего больше.

Я пробовал открыть btmon, чтобы я мог просматривать пакеты HCI и видеть любые интересные HCI События. Вот так я увидел, что сразу отключается.

> HCI Event: Disconnect Complete (0x05) plen 4
        Status: Success (0x00)
        Handle: 2
        Reason: LMP Response Timeout / LL Response Timeout (0x22)

Не понимаю причину. Я также сделал захват трафика c с помощью wirehark и не смог сразу найти ничего очевидного, что могло бы указывать на проблему. Что действительно беспокоит меня больше всего в этом, так это то, что программа, которую я использую (ну, та, на которой она основана. Моя программа - это порт, но у обоих есть эта проблема), также может имитировать профессиональный контроллер, используя те же порты l2cap, и он работает отлично. Контроллер может подключаться к моему ноутбуку и оставаться на связи без случайного отключения. Только когда я пытаюсь проксировать соединение Bluetooth, я делаю что-то go неправильно.

Иногда это длится 30 минут до смерти. В других случаях это продлится всего несколько минут.

Ссылка на программу

Ссылка на захват wirehark

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

...