概要
ESP-WROOM-32のBLEを使って、iBeaconとして動かせるか試し、無事動かすことができた。
本内容は、記述から1年以上経っており、その間のarduino-esp32ライブラリ仕様変更により、もう動きません。(2018/07/25追記)。参考として、仕様変更後の2018/2/22頃にダウンロードしたarduino-esp32を使って新たに書き直したプログラムのリンクを付けます。ただし、私の手持ちのESP-WROOM-32 DevKitC開発ボードにて動作を確認したのみですので、その他の環境での動作は保証できません。
詳細
1.方法
Web上で調べても、まとまった情報が見つからなかった、自力でどうにか考えることにした。
前回セットアップしたESP32 Dev Moduleのスケッチ例には、SimpleBLEというものがある。その例では、SimpleBLE.hというヘッダをインクルードしており、SimpleBLEというクラスが定義されている。iBeaconとして動かすには、BLEのアドバタイジングデータをiBeacon規格(参考)に則った内容にしてやればよいはずなので、SimpleBLEクラスの_ble_send_adv_dataというメソッドを少し変更してやればよさそうだ。ということで、方針は決まった。
2.実装
2.1 SimpleBLEライブラリをお手本にいじる
まず、ライブラリをそのままいじるのはよくないので、{ライブラリのインストール先}\espressif\esp32\libraries\SimpleBLEフォルダをコピーしてSimpleBeaconとし、SimpleBLE.hとSimpleBLE.cppをそれぞれ、SimpleBeacon.h、SimpleBeacon.cppと変更。(SimpleBLEクラスの派生クラスというのがまともなやり方だろうが、実験なのでどうでもよい)
2.2 SimpleBeacon.hの変更
次に、SimpleBeacon.hの中で、もともとSimpleBLEクラスが定義されているので、これもSimpleBeaconと変更。以下が31行目からの定義部を抜粋したモノ。
class SimpleBeacon { public: SimpleBeacon(void); ~SimpleBeacon(void); :
2.3 SimpleBeacon.cppの変更
さらに、SimpleBeacon.cppで、SimpleBLEクラスのメソッドが実装されているので、名前を変える。(詳細は、省略。)
2.4 _ble_send_adv_dataメソッド
そして、いよいよ_ble_send_adv_dataメソッドを変更する。具体的には、以下のようにiBeacon規格に則った31バイトのデータを作成。16進を直接打ち込んでいる部分は、UUID="0000...65E3"、Major=0x7F、Minor=0x7Fという感じ。
void SimpleBeacon::_ble_send_adv_data(void) { uint8_t adv_data_len = 31; uint8_t adv_data[HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1] = { adv_data_len, BT_DATA_FLAGS, BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED, 26, 0xFF, 0x4C, 0x00, 0x02, 0x15, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xE9, 0x10, 0x01, 0xB0, 0x00, 0x00, 0x1C, 0x4D, 0x64, 0x65, 0xE3, 0x00, 0x7F, 0x00, 0x7F, 0xA0 }; adv_data[0] = adv_data_len - 1; ble_send_cmd(HCI_BLE_WRITE_ADV_DATA, (uint8_t *)adv_data, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1); }
2.5 メインのスケッチ
メインのスケッチは、SimpleBLEのサンプルほぼそのままだが、はじめにSimpleBLE.hではなく、SimpleBeacon.hをインクルードし、SimpleBeaconクラスの変数を定義。他は変更しない。(デバイス名が変更されるサンプルなのだが、デバイス名をアドバタイズする部分を削ってしまったので、実際は動作しない)
#include "SimpleBeacon.h" SimpleBeacon ble;
3.動作確認
確認は、手元のAndroidスマホでBeaconScannerというアプリを使用してスキャン。その結果、以下の通り、検出された。iBeaconとして動作しているようだ。成功。
図3 スマホで検出された様子
まとめ
ESP-WROOM-32をiBeaconとして動かすことができた。
ESP-WROOM-32のスペックからすると、iBeaconとして動かすのはもちろん勿体なさすぎるが、アプリケーションの1つとしてできて損はないだろう。