M5Stack Core2 for AWSでiBeconを検出します。「PlatformIOでM5Stack Core2 for AWSの開発環境の構築」で環境構築したPlatformIOを用いて、プログラムはESP-IDFで作成します。

iBeconアプリの作成

VS Code上のPlatformIOでiBeconアプリ「ble_scan」を作成します。

新規プロジェクトを作成するために、latformIOのアイコンから、Open -> New Projectをクリックします。

次のように入力しFinishをクリックします。

・Name: プロジェクト名(ここでは、ble_scanとしました)
・Board: M5Stack Core2
・Framework: Espressif IoT Development Framework
・Location: チェック

espressif/esp-idf」の「esp-idf/examples/bluetooth/bluedroid/ble/ble_ibeacon/」を参考にして、VS Code上のPlatformIOで次のようにコードを作成します。「ble_adv_scan.c」で、36行目では、esp_ble_is_ibeacon_packet関数でiBeconパケットかを判断しています。

ble_adv_scan.c

   ・・・
static void gap_cb_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
{
    switch (event)
    {
    case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT:
    {
        restartScanning();
        break;
    }
    case ESP_GAP_BLE_SCAN_START_COMPLETE_EVT:
        //scan start complete event to indicate scan start successfully or failed
        if (param->scan_start_cmpl.status != ESP_BT_STATUS_SUCCESS)
        {
            ESP_LOGE(GAP_TAG, "scan start failed, error status = %x", param->scan_start_cmpl.status);
            break;
        }
        ESP_LOGI(GAP_TAG, "scan start success");

        break;
    case ESP_GAP_BLE_SCAN_RESULT_EVT:
    {
        esp_ble_gap_cb_param_t *scan_result = (esp_ble_gap_cb_param_t *)param;
        switch (scan_result->scan_rst.search_evt)
        {
        case ESP_GAP_SEARCH_INQ_RES_EVT:
            // output
            {
                uint8_t *p = scan_result->scan_rst.bda;
                char macAddress[2 + (2 * 6) + 1];
                sprintf(macAddress, "0x%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]);
                ESP_LOGI(GAP_TAG, "MAC: %s, RSSI: %d", macAddress, scan_result->scan_rst.rssi); // add
            }
            ESP_LOGI(GAP_TAG, "ble_adv: %s, len: %x", scan_result->scan_rst.ble_adv, scan_result->scan_rst.adv_data_len);
            esp_log_buffer_hex("IBEACON:", scan_result->scan_rst.ble_adv, scan_result->scan_rst.adv_data_len);
            if (esp_ble_is_ibeacon_packet(scan_result->scan_rst.ble_adv, scan_result->scan_rst.adv_data_len))
            {
                esp_ble_ibeacon_t *ibeacon_data;
                if (scan_result->scan_rst.adv_data_len == 0x1E)
                {
                    ibeacon_data = (esp_ble_ibeacon_t *)(scan_result->scan_rst.ble_adv); // iphone
                }
                else
                {
                    ibeacon_data = (esp_ble_ibeacon_t *)(scan_result->scan_rst.ble_adv - 3); // android
                }
                ESP_LOGI(DEMO_TAG, "----------iBeacon Found----------");
                esp_log_buffer_hex("IBEACON_DEMO: Device address:", scan_result->scan_rst.bda, ESP_BD_ADDR_LEN);
                esp_log_buffer_hex("IBEACON_DEMO: Proximity UUID:", ibeacon_data->ibeacon_vendor.proximity_uuid, ESP_UUID_LEN_128);

                uint16_t major = ENDIAN_CHANGE_U16(ibeacon_data->ibeacon_vendor.major);
                uint16_t minor = ENDIAN_CHANGE_U16(ibeacon_data->ibeacon_vendor.minor);
                ESP_LOGI(DEMO_TAG, "Major: 0x%04x (%d)", major, major);
                ESP_LOGI(DEMO_TAG, "Minor: 0x%04x (%d)", minor, minor);
                ESP_LOGI(DEMO_TAG, "Measured power (RSSI at a 1m distance):%d dbm", ibeacon_data->ibeacon_vendor.measured_power);
                ESP_LOGI(DEMO_TAG, "RSSI of packet:%d dbm", scan_result->scan_rst.rssi);
            }

            break;
        case ESP_GAP_SEARCH_INQ_CMPL_EVT:
   ・・・

「esp_ibeacon_api.c」で、7行目では、esp_ble_is_ibeacon_packet関数でパケット長でiBeconパケットかを判断しています。

esp_ibeacon_api.c

   ・・・
bool esp_ble_is_ibeacon_packet(uint8_t *adv_data, uint8_t adv_data_len)
{
    bool result = false;

    // if ((adv_data_len != 0))
    if ((adv_data != NULL) && ((adv_data_len == 0x1E) || (adv_data_len == 0x1B)))
    {
        result = true;
        if (!memcmp(adv_data, (uint8_t *)&ibeacon_common_head, sizeof(ibeacon_common_head)))
        {
            result = true;
        }
    }

    return result;
}
   ・・・

iBeconアプリの実行

VS Code上のPlatformIOでiBeconアプリ「ble_scan」を実行します。iBeaconは、Android アプリ「 Beacon Simulator」やiPhoneアプリ「Beacon入門」を使って発生します。Android アプリ「 Beacon Simulator」については「Raspberry piでiBeacon受信」を参照してください。

   ・・・
?[0;32mI (826042) IBEACON:: 23 88 e0 69 ab 9c 4e 5e 40 ee 3f 49 24 10 a7 ?[0m
?[0;32mI (826072) BLE-scan: MAC: 0x5b050efed913, RSSI: -62?[0m
?[0;32mI (826072) BLE-scan: ble_adv: ??L, len: 1b?[0m
?[0;32mI (826072) IBEACON:: 1a ff 4c 00 02 15 86 81 5c 38 ae 83 42 44 96 a3 ?[0m
?[0;32mI (826082) IBEACON:: 16 1e f2 ac 9e 08 00 00 00 37 bf ?[0m
?[0;32mI (826082) BLE-scan: ----------iBeacon Found----------?[0m
?[0;32mI (826092) IBEACON_DEMO: Device address:: 5b 05 0e fe d9 13 ?[0m
?[0;32mI (826102) IBEACON_DEMO: Proximity UUID:: 86 81 5c 38 ae 83 42 44 96 a3 16 1e f2 ac 9e 08 ?[0m
?[0;32mI (826102) BLE-scan: Major: 0x0000 (0)?[0m
?[0;32mI (826112) BLE-scan: Minor: 0x0037 (55)?[0m
?[0;32mI (826112) BLE-scan: Measured power (RSSI at a 1m distance):-65 dbm?[0m
?[0;32mI (826122) BLE-scan: RSSI of packet:-62 dbm?[0m
?[0;32mI (826132) BLE-scan: MAC: 0x5f7a5150d766, RSSI: -40?[0m
?[0;32mI (826132) BLE-scan: ble_adv: ?????L, len: 1e?[0m
?[0;32mI (826142) IBEACON:: 02 01 1a 1a ff 4c 00 02 15 48 53 44 42 4c 45 41 ?[0m
?[0;32mI (826142) IBEACON:: 44 80 c0 18 00 ff ff ff ff 00 64 00 01 c8 ?[0m
?[0;32mI (826152) BLE-scan: ----------iBeacon Found----------?[0m
?[0;32mI (826162) IBEACON_DEMO: Device address:: 5f 7a 51 50 d7 66 ?[0m
?[0;32mI (826162) IBEACON_DEMO: Proximity UUID:: 48 53 44 42 4c 45 41 44 80 c0 18 00 ff ff ff ff ?[0m
?[0;32mI (826172) BLE-scan: Major: 0x0064 (100)?[0m
?[0;32mI (826182) BLE-scan: Minor: 0x0001 (1)?[0m
?[0;32mI (826182) BLE-scan: Measured power (RSSI at a 1m distance):-56 dbm?[0m
?[0;32mI (826192) BLE-scan: RSSI of packet:-40 dbm?[0m
?[0;32mI (826192) BLE-scan: MAC: 0x5f7a5150d766, RSSI: -40?[0m
?[0;32mI (826202) BLE-scan: ble_adv: , len: 0?[0m
   ・・・

次のように、iBecon発生アプリによってiBeconのフォーマットが異なります。

  • Android アプリ「 Beacon Simulator」
  • BLE-scan: ble_adv: ??L, len: 1b
    IBEACON:: 1a ff 4c 00 02 15 86 81 5c 38 ae 83 42 44 96 a3 ?[0m
    IBEACON:: 16 1e f2 ac 9e 08 00 00 00 37 bf ?[0m
    IBEACON_DEMO: Device address:: 5b 05 0e fe d9 13 ?[0m
    IBEACON_DEMO: Proximity UUID:: 86 81 5c 38 ae 83 42 44 96 a3 16 1e f2 ac 9e 08 ?[0m
    BLE-scan: Major: 0x0000 (0)?[0m
    BLE-scan: Minor: 0x0037 (55)?[0m
    BLE-scan: Measured power (RSSI at a 1m distance):-65 dbm?[0m
    BLE-scan: RSSI of packet:-62 dbm?[0m
  • iPhoneアプリ「Beacon入門」
  • BLE-scan: ble_adv: ?????L, len: 1e
    IBEACON:: 02 01 1a 1a ff 4c 00 02 15 48 53 44 42 4c 45 41 ?[0m
    IBEACON:: 44 80 c0 18 00 ff ff ff ff 00 64 00 01 c8 ?[0m
    IBEACON_DEMO: Device address:: 5f 7a 51 50 d7 66 ?[0m
    IBEACON_DEMO: Proximity UUID:: 48 53 44 42 4c 45 41 44 80 c0 18 00 ff ff ff ff ?[0m
    BLE-scan: Major: 0x0064 (100)?[0m
    BLE-scan: Minor: 0x0001 (1)?[0m
    BLE-scan: Measured power (RSSI at a 1m distance):-56 dbm?[0m
    BLE-scan: RSSI of packet:-40 dbm?[0m

「m5stack/Core2-for-AWS-IoT-EduKit」の「Smart-Thermostat」をベースにして、iBeconアプリの作成

m5stack/Core2-for-AWS-IoT-EduKit」の「Smart-Thermostat」をベース(BlutoothはNimBLEとなっています)にして、iBeconアプリを作成する場合、直接エディタで構成ファイル「sdkconfig」を編集しても、コンパイル時に元の設定に戻ってしまいます(原因は不明)。次のコマンドを使用してメニューを表示し、設定を変更します。

> pio run --environment core2foraws --target menuconfig

次のように、「Component config ?> Bluetooth > Blutooth Host >Bluedroid – Dual-mode」を設定します。

なお、この状態で動作させると次のようにウォッチドッグエラーとなります。Wi-FiとBlutoothが同じ使用帯域2.4GHz帯を使っていることが原因と考えています(???)

   ・・・
?[0;31mE (41407) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:?[0m?[0;31mE (41407) task_wdt:  - IDLE1 (CPU 1)?[0m
?[0;31mE (41407) task_wdt: Tasks currently running:?[0m
?[0;31mE (41407) task_wdt: CPU 0: IDLE0?[0m
?[0;31mE (41407) task_wdt: CPU 1: gui?[0m
?[0;31mE (41407) task_wdt: Print CPU 0 (current core) backtrace?[0m


Backtrace:0x401434DB:0x3FFBE8E0 0x40085899:0x3FFBE900 0x401E7DF3:0x3FFBBD10 0x40143866:0x3FFBBD30 0x40093F51:0x3FFBBD50 0x4009328D:0x3FFBBD70 

?[0;31mE (41407) task_wdt: Print CPU 1 backtrace?[0m


Backtrace:0x4008370F:0x3FFBEEE0 0x40085899:0x3FFBEF00 0x401196D0:0x3FFD8570 0x40119895:0x3FFD8590 0x401199F9:0x3FFD8620 0x40119AE2:0x3FFD8650 0x40119B44:0x3FFD8670 0x401245D5:0x3FFD86A0 0x401246C0:0x3FFD86C0 0x4011480B:0x3FFD86E0 
0x4009328D:0x3FFD8700
   ・・・