L2CAP соединение через разъем HCI?

Обычный способ доступа к L2CAP - создать сокет L2CAP и просто вызвать connect() на нем, чтобы подключиться к устройству Bluetooth, к которому вы хотите получить доступ. Это обычно работает совершенно нормально. Тем не менее, я пытаюсь сделать это на устройстве ARM с ядром Linux 3.0, и возникает неприятная ошибка, при которой вы не можете иметь несколько соединений L2CAP без сброса всех данных, какой канал был создан последним. (т. е. если я подключу 2 датчика Bluetooth с 2 гнездами l2cap, все уведомления для обоих устройств будут поступать через последнюю открытую розетку, а в открытую сначала ничего не будет.) Однако, если я установлю фильтры прямо на розетку HCI, я смогу убедитесь, что данные ACL поступают с правильными дескрипторами подключения, чтобы я мог получить данные там.

Итак... Я хотел бы изменить свой код, чтобы использовать только сокет HCI.

Моя проблема в том, что я не уверен, как (или даже если это возможно). В HCI есть "команда создания логического соединения", которая, похоже, создаст соединение L2CAP, но аргументы для меня не имеют смысла. После того, как я установлю соединение HCI через LE, я получаю "событие завершения соединения", которое дает мне 2 октета "Connection_Handle". "Команда создания логической ссылки" принимает 1 октет "Physical_Link_Handle".

2 ответа

Решение

В BLE всякий раз, когда вы устанавливаете соединение, L2CAP готов к использованию.

Вам не нужно connect или что-нибудь еще. После получения события LE Connection Complete вы готовы к работе и можете начать общение через L2CAP.

Другие команды и данные, которые вы упоминаете, не LE, они только для BR/EDR.

"Команда создания логической связи" предназначена для контроллеров AMP и не имеет ничего общего с L2CAP. С помощью LE вы автоматически получаете "соединение" по фиксированным каналам и можете просто отправлять команды ATT в виде пакетов ACL на CID 4. Пакеты ACL используют дескриптор соединения, возвращенный для события соединения HCI LE.

(ответьте любезно кому-то на IRC-канале #bluez; я не помню, кто)

Другие вопросы по тегам