Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 7 commits into from
Feb 13, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
Empty file.
Empty file.
46 changes: 46 additions & 0 deletions libraries/BluetoothSerial/examples/GetLocalMAC/GetLocalMAC.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// 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)
std::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(){

}
18 changes: 12 additions & 6 deletions libraries/BluetoothSerial/src/BTAddress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,19 +86,25 @@ esp_bd_addr_t *BTAddress::getNative() const {

/**
* @brief Convert a BT address to a string.
*
* A string representation of an address is in the format:
*
* @param [in] capital changes the letter size
* By default the parameter `capital` == false and the string representation of an address is in the format:
* ```
* xx:xx:xx:xx:xx:xx
* ```
*
* When the parameter `caputal` == true the format uses capital letters:
P-R-O-C-H-Y marked this conversation as resolved.
Show resolved Hide resolved
* ```
* XX:XX:XX:XX:XX:XX
* ```
* @return The string representation of the address.
*/
std::string BTAddress::toString() const {
std::string BTAddress::toString(bool capital) const {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see that originally the method returns std::string, but please change it to Arduino String instead.

auto size = 18;
char *res = (char*)malloc(size);
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]);
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]);
}
P-R-O-C-H-Y marked this conversation as resolved.
Show resolved Hide resolved
std::string ret(res);
free(res);
return ret;
Expand Down
2 changes: 1 addition & 1 deletion libraries/BluetoothSerial/src/BTAddress.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class BTAddress {
operator bool () const;

esp_bd_addr_t* getNative() const;
std::string toString() const;
std::string toString(bool capital = false) const;

private:
esp_bd_addr_t m_address;
Expand Down
16 changes: 14 additions & 2 deletions libraries/BluetoothSerial/src/BluetoothSerial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
log_e("gap register failed");
return false;
Expand Down Expand Up @@ -1183,4 +1181,18 @@ std::map<int, std::string> BluetoothSerial::getChannels(const BTAddress &remoteA
return sdpRecords;
}

void BluetoothSerial::getBtAddress(uint8_t *mac){
const uint8_t *dev_mac = esp_bt_dev_get_address();
memcpy(mac, dev_mac, ESP_BD_ADDR_LEN);
}

BTAddress BluetoothSerial::getBtAddressObject(){
uint8_t mac_arr[ESP_BD_ADDR_LEN];
getBtAddress(mac_arr);
return BTAddress(mac_arr);
}

std::string BluetoothSerial::getBtAddressString(){
return getBtAddressObject().toString(true);
}
P-R-O-C-H-Y marked this conversation as resolved.
Show resolved Hide resolved
#endif
3 changes: 3 additions & 0 deletions libraries/BluetoothSerial/src/BluetoothSerial.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ class BluetoothSerial: public Stream
const int MAX_INQ_TIME = (ESP_BT_GAP_MAX_INQ_LEN * INQ_TIME);

operator bool() const;
void getBtAddress(uint8_t *mac);
BTAddress getBtAddressObject();
std::string getBtAddressString();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you forgot to change the type here

private:
String local_name;
int timeoutTicks=0;
Expand Down