概要

ESP-WROOM-32のBLEを使って、iBeaconとして動かせるか試し、無事動かすことができた。

本内容は、記述から1年以上経っており、その間のarduino-esp32ライブラリ仕様変更により、もう動きません。(2018/07/25追記)。参考として、仕様変更後の2018/2/22頃にダウンロードしたarduino-esp32を使って新たに書き直したプログラムのリンクを付けます。ただし、私の手持ちのESP-WROOM-32 DevKitC開発ボードにて動作を確認したのみですので、その他の環境での動作は保証できません。


背景と目的

前回のESP-WROOM-32のLチカの後、ほったらかしだったので、BLEを使ってみることにした。手始めにiBeaconとして動かせるか試す。


詳細

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として動作しているようだ。成功。

Screenshot_20170502-230034

図3 スマホで検出された様子


まとめ

ESP-WROOM-32をiBeaconとして動かすことができた。

ESP-WROOM-32のスペックからすると、iBeaconとして動かすのはもちろん勿体なさすぎるが、アプリケーションの1つとしてできて損はないだろう。