0

I am implementing a BLE peripheral in my firmware with Arduino ESP32.

When the central gets connected to it, I'd like to log the name of the central & its address.

How can I do that?

#include <BLEServer.h>
class ServerCallbacks: public BLEServerCallbacks {
 void onConnect(BLEServer* pServer) {
 ble.log("ServerCallbacks: Connected");
// ==> how can I add the connected device ID or name in the log?
 ble.deviceConnected = true;
 #if SUPPORT_LEDS_INDICATOR
 // === Show France flag colors
 // RGBW = 1,2,3, 4
 // CODE : BBWRR
 // CODE = 33411
 const String code = "BBWRR"; 
 ledIndicator.showAccessCode(code);
 #endif
 #if SUPPORT_BUZZER
 /// BLE connection jingle
 buzzer.playBleConnectedMelody();
 #endif
 };
 
 void onDisconnect(BLEServer* pServer) {
 ble.deviceConnected = false;
 ble.log("ServerCallbacks: Disconnected");
 #if SUPPORT_BUZZER
 /// BLE connection jingle
 buzzer.playBleDisconnectedMelody();
 #endif
 }
};
/// Somewhere in the setup:
server = BLEDevice::createServer();
 
// == Set up our calbacks
server->setCallbacks(new ServerCallbacks());
asked Jun 2, 2022 at 10:12

1 Answer 1

1

(Note: this is all just from reading the library source code, nothing has been tested).

You can't get the details of the just-connected-client. However you can get a list of the currently connected clients.

There is a function in the BLEServer class:

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

You can use that to get the list of connected clients. The "key" of the map is the connection id, and the "value" of the map is the "conn_status_t" struct, which includes a pointer to the peer device structure:

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

You can keep your own list of "current" connection IDs and compare that to the "live" list when a new connection is made to find which is the new connection.

So you can take that peer_device pointer, cast it to a BLEClient pointer, then you call any of the normal BLEClient functions on that, including toString() which will return a string representation of the client.

That of course isn't the "name" of the client. I am not sure (not being an expert on BLE) how you get the name, but I think you may have to actively query it from the client, which should be perfectly possible now you have the BLEClient object pointer.

answered Jun 2, 2022 at 16:29
1

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.