#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 #include #include #include #include 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