shuzo-kino.hateblo.jp
シリーズの最後。
発行してばかりではアレなので、受信して遊ぶ方法も考えます。
実際のところ
一秒コールを行い、目的のURL(今回はhttps://example.com)が入っていたらコールバックにて回数をインクリメントするかんじ。
#include <M5Stack.h> #include <BLEDevice.h> #include <BLEScan.h> #include <BLEAdvertisedDevice.h> // Eddystone-URLフレームの定数 #define EDDYSTONE_URL_FRAME_TYPE 0x10 #define EDDYSTONE_UUID 0xFEAA #define URL_SCHEME_HTTPS 0x03 // 他のヘッダーもあるらしい #define TARGET_URL_PREFIX "example.com" int scanTime = 1; // スキャン時間(秒) BLEScan* pBLEScan; int counter = 0; class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { void onResult(BLEAdvertisedDevice advertisedDevice) { if (advertisedDevice.haveServiceData() && advertisedDevice.haveServiceUUID()) { if (advertisedDevice.getServiceUUID().getNative()->uuid.uuid16 == EDDYSTONE_UUID) { std::string serviceData = advertisedDevice.getServiceData(); if (serviceData[0] == EDDYSTONE_URL_FRAME_TYPE && serviceData[1] == URL_SCHEME_HTTPS && serviceData.substr(2, strlen(TARGET_URL_PREFIX)) == TARGET_URL_PREFIX) { counter++; updateDisplay(); } } } } }; void setup() { M5.begin(); M5.Power.begin(); M5.Lcd.setTextSize(3); M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); M5.Lcd.println("Eddystone-URL Counter"); BLEDevice::init(""); pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setActiveScan(true); pBLEScan->setInterval(100); pBLEScan->setWindow(99); updateDisplay(); } void loop() { pBLEScan->start(scanTime, false); pBLEScan->clearResults(); } void updateDisplay() { M5.Lcd.setCursor(0, 100); M5.Lcd.printf("Count: %d", counter); }
関係しそうなこと
ライブラリによらず、そもそもコールバック的挙動を実装したいとき
shuzo-kino.hateblo.jp