2013-04-25 3 views
5

В настоящее время я пытаюсь подключиться к нескольким устройствам BLE с использованием BlueZ 5.0 и Linux. У меня есть один адаптер BLE для хоста, и я модифицировал gatttool для подключения и выполнения этой функции. Если я запускаю экземпляр модифицированного gatttool, я успешно подключаю и получаю данные из устройства BLE. Если я запустил другой экземпляр модифицированного gatttool и подключился к другому устройству BLE, это приложение начнет получать данные из обоих устройств BLE, и первоначальное приложение больше не получает никаких данных. Я считаю, что это связано с настройкой сокета, где оба приложения настраивают свои сокеты на один и тот же адрес и PSM (последний экземпляр получает данные, а другой - голоден). Есть ли способ предотвратить это условие? В идеале я хочу, чтобы одно приложение подключалось к нескольким устройствам. Я предполагаю, что приложение может иметь только один сокет по той причине, что несколько сокетов будут иметь ту же проблему, что и несколько экземпляров выше. Мое устройство BLE - это брелок TI CC2540, действующий как монитор сердечного ритма.Несколько соединений BLE с использованием Linux и Bluez 5.0

+0

Разве это не то, что вы хотите? Если вы хотите, чтобы одно приложение подключалось к нескольким устройствам, вы можете сделать это через один сокет. Я считаю, что каждое сообщение приходит с адресом BT устройства, поэтому вы можете связать его с правильным устройством. –

+0

Теперь я понимаю, что я должен использовать один сокет. Для разделения данных следует использовать дескриптор соединения 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

+1

Метод ioctl (socket, HCIGETCONNINFO, cr) отлично работает для классических устройств bluetooth, но не для устройств BLE. Мне нужен метод доступа к дескриптору данных ACL для устройства BLE для целей объединения данных. Возможно ли это с BlueZ? – user2321427

ответ

2

Я начал ответ, чтобы я мог иметь больше пространства ...

Я использую сочетание 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.

+0

Я хотел бы сначала решить эту проблему, не используя DBUS. Мне нужно получить дескриптор, связанный с данными входящего сокета, чтобы я мог связать данные с правильным соединением. Вызов ioctl (socket, HCIGETCONNINFO, cr) не работает для устройств BLE. У вас есть метод доступа к информации о дескрипторе, связанной с соединением и входящими данными? – user2321427

+0

Я не уверен, что понимаю ... Вы не инициируете связь? Разве у вас уже не было бы ручки в этом случае и знаете, к чему вы подключились? –

+1

Когда я выполняю connect (socket, (struct sockaddr *) & addr, sizeof (addr)), возвращается значение 0, указывающее на соединение сокета. Если я запускаю hcidump в одно и то же время, я вижу, что дескриптор 1025 назначен соединению. Другие транзакции данных для этого соединения используют этот дескриптор. Я пытаюсь получить доступ к этому дескриптору. – user2321427

1

Мы объединили код с 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; 

Спасибо и с нетерпением ждем комментариев.

+0

Можете ли вы объяснить, почему вы делаете два подключения к одному устройству с помощью cmd_lecc и GATT_connect? – abhiarora

Смежные вопросы