M5STACK(ESP32)でiBeaconを受信してみる
経緯
先日、M5STACKを購入しました。
M5StackはESP32を搭載していて、WiFiとBLEが使えるので、IoT GWとして使えるなあということで、BLEの機能を使って、iBeaconを受信することをやってみました。
準備(開発環境)
Arduino IDE 1.8.5
手順は、M5Stackの公式HPにあったMac OSX向けの手順で構築した環境です。
ESP32 Arduino Coreインストール手順
mkdir -p ~/Documents/Arduino/hardware/espressif && \
cd ~/Documents/Arduino/hardware/espressif && \
git clone https://github.com/espressif/arduino-esp32.git esp32 && \
cd esp32 && \
git submodule update --init --recursive && \
cd tools && \
python get.py
コード
test.ino
// M5STACK(ESP32)でiBeaconを受信してみる
// 2018/04/22 Programed by Kazuyuki Eguchi
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
int scanTime = 10; // スキャン完了までの秒数
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
char uuid[60];
BLEAddress addr = advertisedDevice.getAddress();
int rssi = advertisedDevice.getRSSI();
std::string data = advertisedDevice.getManufacturerData();
if(data.length() == 25)
{
if((data[0] == 0x4c) && (data[1] == 0x00) && (data[2] == 0x02) && (data[3] == 0x15)) {
sprintf(uuid,"%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X"
,data[4],data[5],data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13]
,data[14],data[15],data[16],data[17],data[18],data[19]);
int major = (int)(((data[20]&0xff) << 8) + (data[21] & 0xff));
int minor = (int)(((data[22]&0xff) << 8) + (data[23] & 0xff));
signed char power = (signed char)(data[24]&0xff);
Serial.printf("addr=%s rssi=%d uuid=%s,major=%d,minor=%d,power=%d\n",addr.toString().c_str(),rssi,uuid,major,minor,power);
}
}
}
};
void setup() {
Serial.begin(115200);
}
void loop() {
BLEDevice::init("");
BLEScan* pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks(),true); // 重複を許さない場合は、falseに変更のこと。
pBLEScan->setActiveScan(true);
BLEScanResults foundDevices = pBLEScan->start(scanTime);
Serial.println("Scan done!");
}
気になること
コンパイル後のスケッチのサイズが結構大きい!
最大1310720バイトのフラッシュメモリのうち、スケッチが1227005バイト(93%)を使っています。
最大294912バイトのRAMのうち、グローバル変数が46628バイト(15%)を使っていて、ローカル変数で248284バイト使うことができます。
今後、WiFiのプログラムを追加すると、嫌な予感が!
以上、ご参考までに