M5stamp S3にはESP32-S3FN8が搭載されているのでBLEにも対応しています。
別件でBLEビーコンを実験してみたかったので、Google大本営謹製のEDDYstoneという実装をお借りして、色々実験してみようと思います。
実際のところ
実装のうち、Eddystone-URL……名前そのまんまの通り、URLを発行する実装です。
あまり長大なのは送れず、頭と尻尾を除いた本体17バイトほど。
#include <M5StampS3.h> #include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h> #include <BLEAdvertising.h> // Eddystone-URLの設定 #define EDDYSTONE_URL_FRAME_TYPE 0x10 #define TX_POWER 0xEE // -18dBm const char* url = "https://example.com"; void setup() { M5.begin(); // BLEデバイスの初期化 BLEDevice::init("M5StampS3-Eddystone"); // BLEサーバーの作成 BLEServer *pServer = BLEDevice::createServer(); // アドバタイジングの設定 BLEAdvertising *pAdvertising = pServer->getAdvertising(); // Eddystone-URLフレームの作成 uint8_t eddystoneData[20]; int dataLength = 0; eddystoneData[dataLength++] = EDDYSTONE_URL_FRAME_TYPE; eddystoneData[dataLength++] = TX_POWER; // URLエンコーディング eddystoneData[dataLength++] = 0x03; // https:// for (int i = 0; i < strlen(url); i++) { eddystoneData[dataLength++] = url[i]; } // アドバタイジングデータの設定 pAdvertising->setAdvertisementData(BLEAdvertisementData() .setFlags(0x06) // BR/EDR Not Supported & LE General Discoverable Mode .setManufacturerData(std::string((char*)eddystoneData, dataLength))); // アドバタイジング開始 pAdvertising->start(); Serial.println("Eddystone-URL Beacon started"); } void loop() { // メインループは空のままでOK }