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
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 ・・・