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]);
}
В коллбэке заполняйте массив, объявленный глобально.
Так будет проще всего.
Спасибо! Заполнил, работает!