1 contributor
#ifndef _MY_BLE_H
#define _MY_BLE_H
#include "my_constants.h"
#include "my_serial.h"
#include "my_ntp.h"
#include "my_mqtt.h"
#include <sstream>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
std::stringstream ss;
std::stringstream listBLEElts;
std::stringstream listBLESimple;
void ble_set() {
BLEDevice::init("");
}
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice)
{
uint8_t process_entry = 0;
if( true == gNoFilter ) {
process_entry = 1;
} else if( 0 == strncmp( advertisedDevice.getAddress().toString().c_str(), gFilter, strlen(gFilter) ) ) {
process_entry = 1;
}
if(0 != process_entry) {
//Serial.printf("MAC Address : %s\r\n", advertisedDevice.getAddress().toString().c_str());
/*
{
uint8_t* mdp = (uint8_t*)advertisedDevice.getPayload();
char *pHex = BLEUtils::buildHexData(nullptr, mdp, advertisedDevice.getPayloadLength());
Serial.printf("Payload : %s\r\n",pHex);
free(pHex);
}
if (advertisedDevice.haveManufacturerData()) {
std::string md = advertisedDevice.getManufacturerData();
uint8_t* mdp = (uint8_t*)advertisedDevice.getManufacturerData().data();
char *pHex = BLEUtils::buildHexData(nullptr, mdp, md.length());
Serial.printf("ManufacturerData : %s\r\n", pHex);
free(pHex);
}
if (advertisedDevice.haveServiceUUID()) {
Serial.printf("Service UUID : %s\r\n", advertisedDevice.getServiceUUID().toString().c_str());
}
Serial.printf("--------------------------------------------------\r\n");
*/
}
pollSerial();
}
};
void getBLEScan() {
BLEScan *pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
pBLEScan->setInterval(gInterval);
pBLEScan->setWindow(gWindow);
//Serial.printf("Start BLE scan for %d seconds...\r\n", gScanTime);
//Serial.printf("setInterval %d\r\n", gInterval);
//Serial.printf("setWindow %d\r\n", gWindow);
BLEScanResults foundDevices = pBLEScan->start(gScanTime);
int count = foundDevices.getCount();
if( 0 != strcmp(gFilter,"none")) {
if( 0 != strcmp(gFilter,"")) {
Serial.printf("Filter on [%s].../ Count: %d\r\n", gFilter, count);
} else {
sprintf(gFilter,"none");
Serial.println("No Filter / Count:"+String(count));
}
} else {
Serial.println("No Filter / Count:"+String(count));
}
ss.str("");
listBLEElts.str("");
ss << "{ \"timestamp\": \"" << acTimeStringTZ << "\",";
ss << "\"ble\": ";
listBLEElts << "[";
for (int i = 0; i < count; i++) {
listBLESimple.str("");
if (i > 0) {
listBLEElts << ",";
}
BLEAdvertisedDevice d = foundDevices.getDevice(i);
listBLESimple << "\"b\":\"" << d.getAddress().toString() << "\", \"l\":" << d.getRSSI();
#ifdef USE_MQTT
//Dirty packed format as library does not allow message longer than 110 bytes
mqtt_reconnect();
String MQTTMsg = "{\"MAC\": \""+WiFi.macAddress()+"\", \"t\": "+String(acTimeEpoch)+", \"c\": "+String(count)+", \"i\":"+String(i+1)+","+listBLESimple.str().c_str()+"}";
//Serial.println(MQTTMsg);
if (!client.publish(mqtt_topic, MQTTMsg.c_str())) {
Serial.println("ERROR: MQTT not sent!");
}
#endif //USE_MQTT
listBLEElts << "{\"Address\":\"" << d.getAddress().toString() << "\",\"Rssi\":" << d.getRSSI();
if (d.haveName()) listBLEElts << ",\"Name\":\"" << d.getName() << "\"";
if (d.haveAppearance()) listBLEElts << ",\"Appearance\":" << d.getAppearance();
if (d.haveManufacturerData())
{
std::string md = d.getManufacturerData();
uint8_t *mdp = (uint8_t *)d.getManufacturerData().data();
char *pHex = BLEUtils::buildHexData(nullptr, mdp, md.length());
//ss << ",\"ManufacturerData\":\"" << pHex << "\"";
listBLEElts << ",\"ManufacturerData\":\"" << pHex << "\"";
free(pHex);
}
{
uint8_t* mdp = (uint8_t*)d.getPayload();
char *pHex = BLEUtils::buildHexData(nullptr, mdp, d.getPayloadLength());
//ss << ",\"Payload\":\"" << pHex << "\"";
listBLEElts << ",\"Payload\":\"" << pHex << "\"";
free(pHex);
}
if (d.haveServiceUUID()) listBLEElts << ",\"ServiceUUID\":\"" << d.getServiceUUID().toString() << "\"";
if (d.haveTXPower()) listBLEElts << ",\"TxPower\":" << (int)d.getTXPower();
listBLEElts << "}";
}
listBLEElts << "]";
ss << listBLEElts.str().c_str();
}
#endif //_MY_BLE_H