LoginSignup
12
11

More than 5 years have passed since last update.

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

Posted at

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

以上、ご参考までに

12
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11