Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

M5stamp S3で BLEビーコンで遊んでみる その3:M5stackで受信してカウントする

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