В настоящее время я пытаюсь подключиться к нескольким устройствам BLE с использованием BlueZ 5.0 и Linux. У меня есть один адаптер BLE для хоста, и я модифицировал gatttool для подключения и выполнения этой функции. Если я запускаю экземпляр модифицированного gatttool, я успешно подключаю и получаю данные из устройства BLE. Если я запустил другой экземпляр модифицированного gatttool и подключился к другому устройству BLE, это приложение начнет получать данные из обоих устройств BLE, и первоначальное приложение больше не получает никаких данных. Я считаю, что это связано с настройкой сокета, где оба приложения настраивают свои сокеты на один и тот же адрес и PSM (последний экземпляр получает данные, а другой - голоден). Есть ли способ предотвратить это условие? В идеале я хочу, чтобы одно приложение подключалось к нескольким устройствам. Я предполагаю, что приложение может иметь только один сокет по той причине, что несколько сокетов будут иметь ту же проблему, что и несколько экземпляров выше. Мое устройство BLE - это брелок TI CC2540, действующий как монитор сердечного ритма.Несколько соединений BLE с использованием Linux и Bluez 5.0
ответ
Я начал ответ, чтобы я мог иметь больше пространства ...
Я использую сочетание Python и C, чтобы получить код для работы, так что мой «код» может выглядеть смешно, потому что это может быть от или. Кроме того, я использовал Bluez 4, поскольку 5 не поддерживали ядро, которое я использовал. Дайте мне знать, если есть проблема, и я могу уточнить.
Кажется, есть несколько способов сделать что-то, но я закончил открытие отдельных сокетов для различных задач. Вы: можете открыть один сокет, а затем установить параметры сокета, чтобы отфильтровывать, и вы должны получить все пакеты в одном месте. Однако это был мой первоначальный способ сделать это, и я обнаружил, что мои соединения будут умирать в течение нескольких секунд.
Для сканирования соединений я открыл socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
, затем сделал bind
на устройстве 0
. (есть функция, которая называется hci_get_route
, чтобы получить номер доступного устройства). Затем вы можете позвонить hci_le_set_scan_parameters
, чтобы установить параметры, setsockopt(SOL_HCI, HCI_FILTER, filter)
, чтобы просто получить события сканирования LE, а затем вызвать hci_le_set_scan_enable
, чтобы включить сканирование.
Каждое подключение к устройству было выполнено с помощью socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)
, которое затем вы указываете для подключения к определенному устройству путем вызова connect
на сокете с номером struct sockaddr_l2
, в котором указан конкретный адрес устройства. В этом сокете вы должны получать пакеты только с этого устройства. (одно предостережение ... Я обнаружил, что мой ключ не разрешает соединение при активном сканировании. Мне пришлось временно отключить его перед подключением, а затем снова включить его. В противном случае у меня возникла ошибка BUSY от errno)
После всего этого сказанного ... Я думаю, что вы должны делать все в Bluez 5, чтобы использовать DBUS. К сожалению, это был не вариант того, что я делал. Функции, о которых я упоминал, находятся в общей папке, которая по-видимому не установлена по умолчанию в 5 (вы должны явно попросить, чтобы она была установлена с configure
). Они перестали устанавливать общий lib по умолчанию, потому что хотели побудить людей использовать DBUS.
Я хотел бы сначала решить эту проблему, не используя DBUS. Мне нужно получить дескриптор, связанный с данными входящего сокета, чтобы я мог связать данные с правильным соединением. Вызов ioctl (socket, HCIGETCONNINFO, cr) не работает для устройств BLE. У вас есть метод доступа к информации о дескрипторе, связанной с соединением и входящими данными? – user2321427
Я не уверен, что понимаю ... Вы не инициируете связь? Разве у вас уже не было бы ручки в этом случае и знаете, к чему вы подключились? –
Когда я выполняю connect (socket, (struct sockaddr *) & addr, sizeof (addr)), возвращается значение 0, указывающее на соединение сокета. Если я запускаю hcidump в одно и то же время, я вижу, что дескриптор 1025 назначен соединению. Другие транзакции данных для этого соединения используют этот дескриптор. Я пытаюсь получить доступ к этому дескриптору. – user2321427
Мы объединили код с hcitool и gatttool. Код хорошо работает для 2-х устройств (сканирование, hci_le_create_conn и gatt_connect). Я считаю, что нет ограничений на количество используемых устройств.
1 Start cmd_lescan (from hcitool.c)
2.For each device scanned -
cmd_lecc (from hcitool.c)
gatt_connect (from gatttool.c)
Таким образом, один процесс может управлять несколькими устройствами BLE.Нам не нужно отключать сканирование, просто проигнорируйте не рекламные сообщения:
if (meta->subevent != 0x02)
continue;
Спасибо и с нетерпением ждем комментариев.
Можете ли вы объяснить, почему вы делаете два подключения к одному устройству с помощью cmd_lecc и GATT_connect? – abhiarora
- 1. Bluez BLE Connection Linux
- 2. Максимальный номер. соединения BLE с использованием BlueZ
- 3. Установление нескольких подключений BLE одновременно с использованием BlueZ
- 4. Linux идентифицирует мою BLE?
- 5. Подсистема Bluetooth в linux и BlueZ
- 6. Преимущества опроса Несколько соединений Ble против одновременных соединений?
- 7. BLE android 5.0 Crash
- 8. Linux BlueZ dbus communication
- 9. Linux Bluez Перегрузка Bluetooth?
- 10. Несколько соединений LDAP с использованием
- 11. Несколько соединений с использованием OpenSSL
- 12. Язык программирования Dbus & Bluez
- 13. C/C++ BLE пример чтения/записи с Bluez
- 14. Каков правильный способ чтения рекламных пакетов с датчика BLE с использованием bluez 5.43 и DBus
- 15. BlueZ DBUS API - интерфейсы GATT недоступны для устройства BLE
- 16. Программирование BlueZ GATT в C
- 17. Несколько соединений и несколько потоков
- 18. Linux BlueZ dbus-коммуникация a2dp
- 19. Образец кода HID-клиента с использованием Bluez
- 20. Возможно ли установить несколько соединений BLE на один сервер GATT?
- 21. Несколько соединений сокета с использованием асинхронных сокетов
- 22. Несколько соединений с использованием Entity Framework
- 23. несколько соединений с использованием спящего режима
- 24. Есть ли способ увеличить частоту рекламы BLE в BlueZ?
- 25. Как реализовать Bluetooth LE с Bluez в Linux
- 26. Как установить режим bluez?
- 27. Пулов соединений и несколько соединений Струна
- 28. Несколько соединений с DB и структура исполнителей
- 29. Используя Bluez/Linux, могу ли я запустить демон, передавая BLE ibeacons и подключаться с помощью RFCOMM одновременно?
- 30. Соединение Bluetooth в C blueZ на Linux
Разве это не то, что вы хотите? Если вы хотите, чтобы одно приложение подключалось к нескольким устройствам, вы можете сделать это через один сокет. Я считаю, что каждое сообщение приходит с адресом BT устройства, поэтому вы можете связать его с правильным устройством. –
Теперь я понимаю, что я должен использовать один сокет. Для разделения данных следует использовать дескриптор соединения ACL. Мне трудно получить доступ к этому дескриптору через BlueZ. socket (PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) создает сокет. connect (sock, (struct sockaddr *) & addr, sizeof (addr)) подключает сокет. Доступ к дескриптору с помощью ioctl (socket, HCIGETCONNINFO, cr) возвращает errno 2 (без файла). Адрес dest правильный. Мой созданный сокет выше возвращает значение 5, тогда как socket = hci_open_dev (dev_id) возвращает значение 6. Существует ли лучший способ получить этот дескриптор. – user2321427
Метод ioctl (socket, HCIGETCONNINFO, cr) отлично работает для классических устройств bluetooth, но не для устройств BLE. Мне нужен метод доступа к дескриптору данных ACL для устройства BLE для целей объединения данных. Возможно ли это с BlueZ? – user2321427