Создание потокобезопасной библиотеки BlueZ C ++ - PullRequest
0 голосов
/ 05 мая 2020

Я изучаю требования для создания потокобезопасной библиотеки C ++ BLE: https://github.com/edrosten/libblepp

Мне нужна помощь в том, как я могу подключиться к нескольким устройствам BLE или как Мне нужно сериализовать мои задачи (несколько записей).

С помощью gatttool можно одновременно открывать (и подключаться) несколько устройств BLE.

Если я использую эту библиотеку, я должен Я создаю несколько экземпляров BLEGATTStateMachine?

В их неблокирующем примере (https://github.com/edrosten/libblepp/blob/master/examples/bluetooth.cc):

//Writes are usually available, so only check for them when the 
//state machine wants to write.
if(gatt.wait_on_write())
    FD_SET(gatt.socket(), &write_set);

int result = select(gatt.socket() + 1, &read_set, &write_set, NULL, & tv);

if(FD_ISSET(gatt.socket(), &write_set))
    gatt.write_and_process_next();

Хорошо, если мне есть что запись, и запись становится доступной, он вызывает write_and_process_next().

Однако в https://github.com/edrosten/libblepp/blob/master/src/blestatemachine.cc#L476:

Кажется, он обрабатывает только if(state == Connecting). Итак, если я уже подключен, этот вызов, похоже, ничего не делает.

Однако есть также send_write_request, который вызывает dev.send_write_request, который в конечном итоге заканчивается записью сокета (https://github.com/edrosten/libblepp/blob/master/src/bledevice.cc#L119):

int ret = write(sock, buf.data(), len);

Теперь мои вопросы:

  1. как подключиться к нескольким устройствам?
  2. Достаточно ли синхронизировать эти write вызывает сокет, чтобы сделать его потокобезопасным?
...