Posted at

M5STACK(ESP32)でiBeaconを受信してみる

More than 1 year has passed since last update.


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のプログラムを追加すると、嫌な予感が!

以上、ご参考までに