BLEBeaconScan / my_ble.h /
352ff3a 5 years ago
1 contributor
133 lines | 4.917kb
#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