Unverified Commit 2ddce3c1 authored by Tomáš Pilný's avatar Tomáš Pilný Committed by GitHub

Added methods + example to retrive local MAC for BT (#7778)

* Added methods + example to retrive local MAC for BT

* Added .skip files in the new example folder

* Fixed typos and formatting + added doxygen comments

* changed std::string to String

* another std::string -> String

* Changed std::string to String

* chaged string type in example
parent efe966d5
// This example demonstrates usage of BluetoothSerial method to retrieve MAC address of local BT device in various formats.
// By Tomas Pilny - 2023
#include "BluetoothSerial.h"
String device_name = "ESP32-example";
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin(device_name); //Bluetooth device name
uint8_t mac_arr[6]; // Byte array to hold the MAC address from getBtAddress()
BTAddress mac_obj; // Object holding instance of BTAddress with the MAC (for more details see libraries/BluetoothSerial/src/BTAddress.h)
String mac_str; // String holding the text version of MAC in format AA:BB:CC:DD:EE:FF
SerialBT.getBtAddress(mac_arr); // Fill in the array
mac_obj = SerialBT.getBtAddressObject(); // Instantiate the object
mac_str = SerialBT.getBtAddressString(); // Copy the string
Serial.print("This device is instantiated with name "); Serial.println(device_name);
Serial.print("The mac address using byte array: ");
for(int i = 0; i < ESP_BD_ADDR_LEN-1; i++){
Serial.print(mac_arr[i], HEX); Serial.print(":");
}
Serial.println(mac_arr[ESP_BD_ADDR_LEN-1], HEX);
Serial.print("The mac address using BTAddress object using default method `toString()`: "); Serial.println(mac_obj.toString().c_str());
Serial.print("The mac address using BTAddress object using method `toString(true)`\n\twhich prints the MAC with capital letters: "); Serial.println(mac_obj.toString(true).c_str()); // This actually what is used inside the getBtAddressString()
Serial.print("The mac address using string: "); Serial.println(mac_str.c_str());
}
void loop(){
}
...@@ -44,7 +44,7 @@ BTAddress::BTAddress() { ...@@ -44,7 +44,7 @@ BTAddress::BTAddress() {
* *
* @param [in] stringAddress The hex representation of the address. * @param [in] stringAddress The hex representation of the address.
*/ */
BTAddress::BTAddress(std::string stringAddress) { BTAddress::BTAddress(String stringAddress) {
if (stringAddress.length() != 17) return; if (stringAddress.length() != 17) return;
int data[6]; int data[6];
...@@ -86,20 +86,26 @@ esp_bd_addr_t *BTAddress::getNative() const { ...@@ -86,20 +86,26 @@ esp_bd_addr_t *BTAddress::getNative() const {
/** /**
* @brief Convert a BT address to a string. * @brief Convert a BT address to a string.
* * @param [in] capital changes the letter size
* A string representation of an address is in the format: * By default the parameter `capital` == false and the string representation of an address is in the format:
*
* ``` * ```
* xx:xx:xx:xx:xx:xx * xx:xx:xx:xx:xx:xx
* ``` * ```
* * When the parameter `capital` == true the format uses capital letters:
* ```
* XX:XX:XX:XX:XX:XX
* ```
* @return The string representation of the address. * @return The string representation of the address.
*/ */
std::string BTAddress::toString() const { String BTAddress::toString(bool capital) const {
auto size = 18; auto size = 18;
char *res = (char*)malloc(size); char *res = (char*)malloc(size);
if(capital){
snprintf(res, size, "%02X:%02X:%02X:%02X:%02X:%02X", m_address[0], m_address[1], m_address[2], m_address[3], m_address[4], m_address[5]);
}else{
snprintf(res, size, "%02x:%02x:%02x:%02x:%02x:%02x", m_address[0], m_address[1], m_address[2], m_address[3], m_address[4], m_address[5]); snprintf(res, size, "%02x:%02x:%02x:%02x:%02x:%02x", m_address[0], m_address[1], m_address[2], m_address[3], m_address[4], m_address[5]);
std::string ret(res); }
String ret(res);
free(res); free(res);
return ret; return ret;
} // toString } // toString
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include "sdkconfig.h" #include "sdkconfig.h"
#if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED)
#include <esp_gap_bt_api.h> // ESP32 BT #include <esp_gap_bt_api.h> // ESP32 BT
#include <string> #include <Arduino.h>
/** /**
...@@ -24,12 +24,12 @@ class BTAddress { ...@@ -24,12 +24,12 @@ class BTAddress {
public: public:
BTAddress(); BTAddress();
BTAddress(esp_bd_addr_t address); BTAddress(esp_bd_addr_t address);
BTAddress(std::string stringAddress); BTAddress(String stringAddress);
bool equals(BTAddress otherAddress); bool equals(BTAddress otherAddress);
operator bool () const; operator bool () const;
esp_bd_addr_t* getNative() const; esp_bd_addr_t* getNative() const;
std::string toString() const; String toString(bool capital = false) const;
private: private:
esp_bd_addr_t m_address; esp_bd_addr_t m_address;
......
...@@ -39,7 +39,7 @@ bool BTAdvertisedDeviceSet::haveRSSI() const { return m_haveRSSI; } ...@@ -39,7 +39,7 @@ bool BTAdvertisedDeviceSet::haveRSSI() const { return m_haveRSSI; }
* @return A string representation of this device. * @return A string representation of this device.
*/ */
std::string BTAdvertisedDeviceSet::toString() { std::string BTAdvertisedDeviceSet::toString() {
std::string res = "Name: " + getName() + ", Address: " + getAddress().toString(); std::string res = "Name: " + getName() + ", Address: " + std::string(getAddress().toString().c_str(), getAddress().toString().length());
if (haveCOD()) { if (haveCOD()) {
char val[6]; char val[6];
snprintf(val, sizeof(val), "%d", getCOD()); snprintf(val, sizeof(val), "%d", getCOD());
......
...@@ -84,7 +84,7 @@ void BTScanResultsSet::clear() { ...@@ -84,7 +84,7 @@ void BTScanResultsSet::clear() {
} }
bool BTScanResultsSet::add(BTAdvertisedDeviceSet advertisedDevice, bool unique) { bool BTScanResultsSet::add(BTAdvertisedDeviceSet advertisedDevice, bool unique) {
std::string key = advertisedDevice.getAddress().toString(); std::string key = std::string(advertisedDevice.getAddress().toString().c_str(), advertisedDevice.getAddress().toString().length());
if (!unique || m_vectorAdvertisedDevices.count(key) == 0) { if (!unique || m_vectorAdvertisedDevices.count(key) == 0) {
m_vectorAdvertisedDevices.insert(std::pair<std::string, BTAdvertisedDeviceSet>(key, advertisedDevice)); m_vectorAdvertisedDevices.insert(std::pair<std::string, BTAdvertisedDeviceSet>(key, advertisedDevice));
return true; return true;
......
...@@ -661,8 +661,6 @@ static bool _init_bt(const char *deviceName) ...@@ -661,8 +661,6 @@ static bool _init_bt(const char *deviceName)
} }
} }
// Why only master need this? Slave need this during pairing as well
// if (_isMaster && esp_bt_gap_register_callback(esp_bt_gap_cb) != ESP_OK) {
if (esp_bt_gap_register_callback(esp_bt_gap_cb) != ESP_OK) { if (esp_bt_gap_register_callback(esp_bt_gap_cb) != ESP_OK) {
log_e("gap register failed"); log_e("gap register failed");
return false; return false;
...@@ -1183,4 +1181,31 @@ std::map<int, std::string> BluetoothSerial::getChannels(const BTAddress &remoteA ...@@ -1183,4 +1181,31 @@ std::map<int, std::string> BluetoothSerial::getChannels(const BTAddress &remoteA
return sdpRecords; return sdpRecords;
} }
/**
* @brief Gets the MAC address of local BT device in byte array.
*
* @param mac [out] The mac
*/
void BluetoothSerial::getBtAddress(uint8_t *mac) {
const uint8_t *dev_mac = esp_bt_dev_get_address();
memcpy(mac, dev_mac, ESP_BD_ADDR_LEN);
}
/**
* @brief Gets the MAC address of local BT device as BTAddress object.
*
* @return The BTAddress object.
*/
BTAddress BluetoothSerial::getBtAddressObject() {
uint8_t mac_arr[ESP_BD_ADDR_LEN];
getBtAddress(mac_arr);
return BTAddress(mac_arr);
}
/**
* @brief Gets the MAC address of local BT device as string.
*
* @return The BT MAC address string.
*/
String BluetoothSerial::getBtAddressString() {
return getBtAddressObject().toString(true);
}
#endif #endif
...@@ -85,6 +85,9 @@ class BluetoothSerial: public Stream ...@@ -85,6 +85,9 @@ class BluetoothSerial: public Stream
const int MAX_INQ_TIME = (ESP_BT_GAP_MAX_INQ_LEN * INQ_TIME); const int MAX_INQ_TIME = (ESP_BT_GAP_MAX_INQ_LEN * INQ_TIME);
operator bool() const; operator bool() const;
void getBtAddress(uint8_t *mac);
BTAddress getBtAddressObject();
String getBtAddressString();
private: private:
String local_name; String local_name;
int timeoutTicks=0; int timeoutTicks=0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment