Как получить имя подключенного устройства через BLE?

Я внедряю периферийное устройство BLE в свою прошивку с Arduino ESP32.

Когда центр подключится к нему, я хотел бы зарегистрировать имя центра и его адрес.

Как я могу это сделать?

#include <BLEServer.h>



class ServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
        ble.log("ServerCallbacks: Connected");

// ==> как добавить идентификатор или имя подключенного устройства в журнал?

        ble.deviceConnected = true;

        #if SUPPORT_LEDS_INDICATOR

        // === Показать цвета флага Франции
        // RGBW = 1,2,3, 4
        // КОД : BBWRR
        // КОД = 33411
        const String code = "BBWRR";        
        ledIndicator.showAccessCode(code);
        #endif


        #if SUPPORT_BUZZER
        /// Звон соединения BLE
        buzzer.playBleConnectedMelody();
        #endif
    };
 
    void onDisconnect(BLEServer* pServer) {
        ble.deviceConnected = false;
        ble.log("ServerCallbacks: Disconnected");

        #if SUPPORT_BUZZER
        /// Звон соединения BLE
        buzzer.playBleDisconnectedMelody();
        #endif
    }
};


/// Где-то в настройках:
server = BLEDevice::createServer();
    
// == Настройте наш
server->setCallbacks(new ServerCallbacks());


, 👍0


1 ответ


1

(Примечание: это все просто из чтения исходного кода библиотеки, ничего не было протестировано).

Вы не можете получить подробную информацию о только что подключенном клиенте. Однако вы можете получить список подключенных в данный момент клиентов.

В классе BLEServer есть функция:

std::map<uint16_t, conn_status_t> getPeerDevices(bool client);

Вы можете использовать это, чтобы получить список подключенных клиентов. "Ключ" карты - это идентификатор соединения, а "значение" карты - это структура "conn_status_t", которая включает в себя указатель на структуру однорангового устройства:

typedef struct {
    void *peer_device;
    bool connected;
    uint16_t mtu;
} conn_status_t;

Вы можете сохранить свой собственный список "текущих" идентификаторов соединений и сравнить его с "текущим" списком при создании нового соединения, чтобы определить, какое из них является новым соединением.

Таким образом, вы можете взять этот указатель peer_device, преобразовать его в указатель BLEClient, затем вызвать для него любую из обычных функций BLEClient, включая toString(), которая вернет строковое представление клиента.

Это, конечно, не "имя" клиента. Я не уверен (не будучи экспертом по BLE), как вы получаете имя, но я думаю, вам, возможно, придется активно запрашивать его у клиента, что должно быть вполне возможно, теперь у вас есть указатель на объект BLEClient.

,