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; я не помню, кто)