#include "sdkconfig.h"
#if defined(CONFIG_BT_ENABLED)
#include <esp_log.h>
#include <sstream>
#include "BLEAdvertisedDevice.h"
#include "BLEUtils.h"
static const char* LOG_TAG="BLEAdvertisedDevice";
BLEAdvertisedDevice::BLEAdvertisedDevice() {
m_adFlag = 0;
m_appearance = 0;
m_deviceType = 0;
m_manufacturerData = "";
m_name = "";
m_rssi = -9999;
m_txPower = 0;
m_pScan = nullptr;
m_haveAppearance = false;
m_haveManufacturerData = false;
m_haveName = false;
m_haveRSSI = false;
m_haveServiceUUID = false;
m_haveTXPower = false;
}
BLEAddress BLEAdvertisedDevice::getAddress() {
return m_address;
}
uint16_t BLEAdvertisedDevice::getApperance() {
return m_appearance;
}
std::string BLEAdvertisedDevice::getManufacturerData() {
return m_manufacturerData;
}
std::string BLEAdvertisedDevice::getName() {
return m_name;
}
int BLEAdvertisedDevice::getRSSI() {
return m_rssi;
}
BLEScan* BLEAdvertisedDevice::getScan() {
return m_pScan;
}
BLEUUID BLEAdvertisedDevice::getServiceUUID() {
return m_serviceUUID;
}
int8_t BLEAdvertisedDevice::getTXPower() {
return m_txPower;
}
bool BLEAdvertisedDevice::haveAppearance() {
return m_haveAppearance;
}
bool BLEAdvertisedDevice::haveManufacturerData() {
return m_haveManufacturerData;
}
bool BLEAdvertisedDevice::haveName() {
return m_haveName;
}
bool BLEAdvertisedDevice::haveRSSI() {
return m_haveRSSI;
}
bool BLEAdvertisedDevice::haveServiceUUID() {
return m_haveServiceUUID;
}
bool BLEAdvertisedDevice::haveTXPower() {
return m_haveTXPower;
}
void BLEAdvertisedDevice::parseAdvertisement(uint8_t* payload) {
uint8_t length;
uint8_t ad_type;
uint8_t sizeConsumed = 0;
bool finished = false;
while(!finished) {
length = *payload;
payload++;
sizeConsumed += 1 + length;
if (length != 0) {
ad_type = *payload;
payload++;
length--;
char* pHex = BLEUtils::buildHexData(nullptr, payload, length);
ESP_LOGD(LOG_TAG, "Type: 0x%.2x (%s), length: %d, data: %s",
ad_type, BLEUtils::advTypeToString(ad_type), length, pHex);
free(pHex);
switch(ad_type) {
case ESP_BLE_AD_TYPE_NAME_CMPL: {
setName(std::string(reinterpret_cast<char*>(payload), length));
break;
}
case ESP_BLE_AD_TYPE_TX_PWR: {
setTXPower(*payload);
break;
}
case ESP_BLE_AD_TYPE_APPEARANCE: {
setAppearance(*reinterpret_cast<uint16_t*>(payload));
break;
}
case ESP_BLE_AD_TYPE_FLAG: {
setAdFlag(*payload);
break;
}
case ESP_BLE_AD_TYPE_16SRV_CMPL: {
setServiceUUID(BLEUUID(*reinterpret_cast<uint16_t*>(payload)));
break;
}
case ESP_BLE_AD_TYPE_16SRV_PART: {
setServiceUUID(BLEUUID(*reinterpret_cast<uint16_t*>(payload)));
break;
}
case ESP_BLE_AD_TYPE_32SRV_CMPL: {
setServiceUUID(BLEUUID(*reinterpret_cast<uint32_t*>(payload)));
break;
}
case ESP_BLE_AD_TYPE_32SRV_PART: {
setServiceUUID(BLEUUID(*reinterpret_cast<uint32_t*>(payload)));
break;
}
case ESP_BLE_AD_TYPE_128SRV_CMPL: {
setServiceUUID(BLEUUID(payload, 16, false));
break;
}
case ESP_BLE_AD_TYPE_128SRV_PART: {
setServiceUUID(BLEUUID(payload, 16, false));
break;
}
case ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE: {
setManufacturerData(std::string(reinterpret_cast<char*>(payload), length));
break;
}
default: {
ESP_LOGD(LOG_TAG, "Unhandled type");
break;
}
}
payload += length;
}
if (sizeConsumed >=31 || length == 0) {
finished = true;
}
}
}
void BLEAdvertisedDevice::setAddress(BLEAddress address) {
m_address = address;
}
void BLEAdvertisedDevice::setAdFlag(uint8_t adFlag) {
m_adFlag = adFlag;
}
void BLEAdvertisedDevice::setAppearance(uint16_t appearance) {
m_appearance = appearance;
m_haveAppearance = true;
ESP_LOGD(LOG_TAG, "- appearance: %d", m_appearance);
}
void BLEAdvertisedDevice::setManufacturerData(std::string manufacturerData) {
m_manufacturerData = manufacturerData;
m_haveManufacturerData = true;
char* pHex = BLEUtils::buildHexData(nullptr, (uint8_t*)m_manufacturerData.data(), (uint8_t)m_manufacturerData.length());
ESP_LOGD(LOG_TAG, "- manufacturer data: %s", pHex);
free(pHex);
}
void BLEAdvertisedDevice::setName(std::string name) {
m_name = name;
m_haveName = true;
ESP_LOGD(LOG_TAG, "- name: %s", m_name.c_str());
}
void BLEAdvertisedDevice::setRSSI(int rssi) {
m_rssi = rssi;
m_haveRSSI = true;
ESP_LOGD(LOG_TAG, "- rssi: %d", m_rssi);
}
void BLEAdvertisedDevice::setScan(BLEScan* pScan) {
m_pScan = pScan;
}
void BLEAdvertisedDevice::setServiceUUID(const char* serviceUUID) {
return setServiceUUID(BLEUUID(serviceUUID));
}
void BLEAdvertisedDevice::setServiceUUID(BLEUUID serviceUUID) {
m_serviceUUID = serviceUUID;
m_haveServiceUUID = true;
ESP_LOGD(LOG_TAG, "- serviceUUID: %s", serviceUUID.toString().c_str());
}
void BLEAdvertisedDevice::setTXPower(int8_t txPower) {
m_txPower = txPower;
m_haveTXPower = true;
ESP_LOGD(LOG_TAG, "- txPower: %d", m_txPower);
}
std::string BLEAdvertisedDevice::toString() {
std::stringstream ss;
ss << "Name: " << getName() << ", Address: " << getAddress().toString();
if (haveAppearance()) {
ss << ", appearance: " << getApperance();
}
if (haveManufacturerData()) {
char *pHex = BLEUtils::buildHexData(nullptr, (uint8_t*)getManufacturerData().data(), getManufacturerData().length());
ss << ", manufacturer data: " << pHex;
free(pHex);
}
if (haveServiceUUID()) {
ss << ", serviceUUID: " << getServiceUUID().toString();
}
if (haveTXPower()) {
ss << ", txPower: " << (int)getTXPower();
}
return ss.str();
}
#endif