ESP32 BLE scan
- Войдите на сайт для отправки комментариев
Сб, 07/08/2021 - 12:46
Мучаю код санирования BLE iBeacon.
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
//#include <BLEBeacon.h>
#define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00) >> 8) + (((x)&0xFF) << 8))
class IBeaconAdvertised: public BLEAdvertisedDeviceCallbacks {
public:
// Обратный вызов при обнаружении BLE
void onResult(BLEAdvertisedDevice device) {
if (!isIBeacon(device)) {
return;
}
printIBeacon(device);
}
private:
// Определение пакетов iBeacon
bool isIBeacon(BLEAdvertisedDevice device) {
if (device.getManufacturerData().length() < 25) {
return false;
}
if (getCompanyId(device) != 0x0100) { // для Apple 0x4C00 MSB
return false;
}
if (getIBeaconHeader(device) != 0x1502) {
return false;
}
return true;
}
// Получить идентификатор компании
unsigned short getCompanyId(BLEAdvertisedDevice device) {
const unsigned short* pCompanyId = (const unsigned short*)&device
.getManufacturerData()
.c_str()[0];
return *pCompanyId;
}
// Получить заголовок iBeacon
unsigned short getIBeaconHeader(BLEAdvertisedDevice device) {
const unsigned short* pHeader = (const unsigned short*)&device
.getManufacturerData()
.c_str()[2];
return *pHeader;
}
// Получить UUID
String getUuid(BLEAdvertisedDevice device) {
const char* pUuid = &device.getManufacturerData().c_str()[4];
char uuid[64] = {0};
sprintf(
uuid,
"%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X",
pUuid[0], pUuid[1], pUuid[2], pUuid[3], pUuid[4], pUuid[5], pUuid[6], pUuid[7],
pUuid[8], pUuid[9], pUuid[10], pUuid[11], pUuid[12], pUuid[13], pUuid[14], pUuid[15]
);
return String(uuid);
}
// Получить txPower
signed char getTxPower(BLEAdvertisedDevice device) {
const signed char* pTxPower = (const signed char*)&device
.getManufacturerData()
.c_str()[24];
return *pTxPower;
}
// Последовательный вывод информации iBeacon
void printIBeacon(BLEAdvertisedDevice device) {
Serial.printf("addr:%s rssi:%d uuid:%s power:%d\r\n",
device.getAddress().toString().c_str(),
device.getRSSI(),
getUuid(device).c_str(),
*(signed char*)&device.getManufacturerData().c_str()[24]);
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("");
}
void loop() {
//Serial.println("start.");
BLEScan* scan = BLEDevice::getScan();
scan->setAdvertisedDeviceCallbacks(new IBeaconAdvertised(), true);
scan->setActiveScan(true);
scan->start(60);
//Serial.println("complete.");
}
Здесь выводятся данные
void printIBeacon(BLEAdvertisedDevice device) {
Serial.printf("addr:%s rssi:%d uuid:%s power:%d\r\n",
device.getAddress().toString().c_str(),
device.getRSSI(),
getUuid(device).c_str(),
*(signed char*)&device.getManufacturerData().c_str()[24]);
}
Не могу их вывести в переменную в секции loop() скетча для дальнейшего использования в программе.
void loop() {
BLEScan* scan = BLEDevice::getScan();
scan->setAdvertisedDeviceCallbacks(new IBeaconAdvertised(), true);
scan->setActiveScan(true);
scan->start(60);
BLEAdvertisedDevice device = чему приравнять?
adress = device.getAddress().toString().c_str();
rssi = device.getRSSI();
uuid = getUuid(device).c_str();
power = *(signed char*)&device.getManufacturerData().c_str()[24]);
}
В коллбэке заполняйте массив, объявленный глобально.
Так будет проще всего.
Спасибо! Заполнил, работает!
#include <BLEDevice.h> #include <BLEUtils.h> #include <BLEScan.h> #include <BLEAdvertisedDevice.h> //#include <BLEBeacon.h> #define ENDIAN_CHANGE_U16(x) ((((x)&0xFF00) >> 8) + (((x)&0xFF) << 8)) String device_data[4] ; String address; String rssi; String uuid; String power; class IBeaconAdvertised: public BLEAdvertisedDeviceCallbacks { public: // Обратный вызов при обнаружении BLE void onResult(BLEAdvertisedDevice device) { if (!isIBeacon(device)) { return; } printIBeacon(device); } private: // Определение пакетов iBeacon bool isIBeacon(BLEAdvertisedDevice device) { if (device.getManufacturerData().length() < 25) { return false; } if (getCompanyId(device) != 0x0100) { // для Apple 0x4C00 MSB return false; } if (getIBeaconHeader(device) != 0x1502) { return false; } return true; } // Получить идентификатор компании unsigned short getCompanyId(BLEAdvertisedDevice device) { const unsigned short* pCompanyId = (const unsigned short*)&device .getManufacturerData() .c_str()[0]; return *pCompanyId; } // Получить заголовок iBeacon unsigned short getIBeaconHeader(BLEAdvertisedDevice device) { const unsigned short* pHeader = (const unsigned short*)&device .getManufacturerData() .c_str()[2]; return *pHeader; } // Получить UUID String getUuid(BLEAdvertisedDevice device) { const char* pUuid = &device.getManufacturerData().c_str()[4]; char uuid[64] = {0}; sprintf( uuid, "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", pUuid[0], pUuid[1], pUuid[2], pUuid[3], pUuid[4], pUuid[5], pUuid[6], pUuid[7], pUuid[8], pUuid[9], pUuid[10], pUuid[11], pUuid[12], pUuid[13], pUuid[14], pUuid[15] ); return String(uuid); } // Получить txPower signed char getTxPower(BLEAdvertisedDevice device) { const signed char* pTxPower = (const signed char*)&device .getManufacturerData() .c_str()[24]; return *pTxPower; } // Последовательный вывод информации iBeacon void printIBeacon(BLEAdvertisedDevice device) { /* Serial.printf("addr:%s rssi:%d uuid:%s power:%d\r\n", device.getAddress().toString().c_str(), device.getRSSI(), getUuid(device).c_str(), *(signed char*)&device.getManufacturerData().c_str()[24]);*/ device_data[0] = device.getAddress().toString().c_str(); device_data[1] = device.getRSSI(); device_data[2] = getUuid(device).c_str(); device_data[3] = *(signed char*)&device.getManufacturerData().c_str()[24]; } }; void setup() { Serial.begin(115200); BLEDevice::init(""); } void loop() { //Serial.println("start."); BLEScan* scan = BLEDevice::getScan(); scan->setAdvertisedDeviceCallbacks(new IBeaconAdvertised(), true); scan->setActiveScan(true); scan->start(60); address = device_data[0]; rssi = device_data[1]; uuid = device_data[2]; power = device_data[3]; Serial.print("address: "); Serial.println(address); Serial.print("rssi: "); Serial.println(rssi); Serial.print("uuid: "); Serial.println(uuid); Serial.print("power: "); Serial.println(power); }