Amazon Web Services ブログ

Amazon FreeRTOSでBluetooth Low Energyが利用可能、Espressif ESP32で利用する例

Amazon Web Services (AWS) は、Amazon FreeRTOS BLEのベータ版を発表しました。本機能により組み込み開発者が、Bluetooth Low Energy (BLE) を使用するAmazon FreeRTOSデバイスをAndroidまたはiOS端末を通して安全にAWS IoTと接続することができます。Amazon FreeRTOSのBLEサポートにより、Wi-Fiを含む他の接続方法よりも低消費電力が必要なデバイス向けの新しいアプリケーション開発が可能になります。

Amazon FreeRTOSのBLEサポートにより、汎用的なAPI経由で標準のGeneric Access Profile (GAP)やGeneric Attributes (GATT)プロファイルを利用することで、Amazon FreeRTOS対応デバイス間で移植可能なBLEアプリケーションの作成や、AndroidやiOS SDKsを利用してAWS IoT機能と統合することが可能です。BLEの仕様によると、GAPはBLEデバイスがどのようにブロードキャストを有効にし、相互接続するかを定義している。GATTは、コネクションが接続されるとどのようにデータが転送されるかを記述している。

Amazon FreeRTOS BLEの開始方法

この記事では、Androidプロキシ経由でAWS IoTへ接続するBLEデバイスの使用例を記載します。これにより、BLEデバイスはBLEまたはWi-Fiといった基本的な通信キャリアを問わず、同じMQTTプロトコルを利用できます。BLEはWi-Fiに比べて消費電力が低いため、BLEを介してデバイスはMQTTプロトコルでAWS IoTサービスへ接続できます。これにより、Amazon FreeRTOS over-the-air(OTA)アップデートなどの低消費電力で豊富なAWS IoTサービスが現場で稼働しているデバイスへと提供されます。

Amazon FreeRTOS BLEを用いてBLE経由でEspressif ESP32をAWS IoTに接続

リセット後のサイクルの開始時に、ESP32はadvertising modeになり、GAPレイヤを使用して近くのBLEデバイスにデータをブロードキャストします。近くのBLEデバイスの1つは、開始時にscanning modeにあるAndroidアプリです。Advertising modeは1対多の転送であり、データの一貫性を保証するものではありません。

Androidアプリでは、ESP32の名前またはアドレスと一致するデバイスをスキャンし、接続スイッチが切り替わるとESP32とAndroidアプリの両方がconnected modeとなります。BLEデバイスは、クライアントがプロキシとして動作し、AWSクラウドからAWS IoTサービスにアクセスできるように、カスタムGATTプロファイルを公開します。認証プロセス中、BLEデバイスはAWSクラウドサービス証明書を使用して、認証されていないクライアントを介してクラウドサービスに向けられたチャレンジ認証を安全にラップします。チャレンジには、BLEデバイスと認証されるクライアントに関する情報が含まれています。チャレンジが満たされた場合、BLEデバイスは認証されたクライアントプロキシに対して、デバイスの代わりにAWS IoTサービスへアクセスする機能を付与することができます。カスタムGATTプロファイル経由で、データパケットはBLEデバイスに配信されます。

以下は、Android phoneで動作するBLEプロキシを使用してESP32をAWS IoTに接続するための高度な手順です。

  1. AWSの設定 – AWS IoTのモノとポリシーを作成し、Cognitoユーザプールを作成し、Cognito IDを設定する
  2. ESP32 – ESP32上でAmazon FreeRTOS BLEをダウンロード、設定し、実行する
  3. BLEパススルーアプリケーション – Android phone上でAmazon FreeRTOSのMQTTプロキシアプリケーションサンプルをダウンロード、設定し、実行する

前提条件

  1. ESP32開発ボード
  2. MicroUSB-USB Aケーブル
  3. AWSアカウント(無料利用枠でも問題ありません)
  4. Xtensa toolchainとAmazon FreeRTOSのソースコードとサンプルのための十分なディスク容量(〜500Mb)。この記事は、Xtensa toolchain、ESP-IDF、Amazon FreeRTOSコードがユーザーのホームディレクトリである、espディレクトリ(〜/ esp)にインストールされていることを前提に書かれています。そのため、〜/ esp / xtensa-esp32-elf / binを$ PATH変数に追加する必要があります。
  5. Android 4.3以降のAndroid phone
  6. Android 4.3以降(API Level 18以降)のSDKがインストールされたAndroid Studio

ESP32ハードウェアの設定やビルド手順についての情報は、同僚のAnton Shmaginが投稿したブログ記事、 Connect Microcontroller-Based Devices to the Cloud with Amazon FreeRTOS and Espressif ESP32 を参照してください。

AWSの設定

AWS IoTの設定

まずはじめに、AWS IoTのモノとポリシーを設定します。Amazon Cognitoを使用して認証されるAndroid Phone上でMQTTプロキシを使用しているため、ESP32デバイスにはAWS IoT証明書は必要ありません。

ステップ1 – AWS IoTポリシーの作成

AWS IoT ポリシーの作成前に、AWSリージョンとAWSアカウントIDを確認します。

  1. https://console.aws.amazon.com/iot/へサインイン。
  2. AWSマネージメントコンソールの右上にある、ご自身のアカウントからアカウントを選択。アカウント設定に記載されている12桁のアカウントIDをメモします。
  3. AWS IoT Coreのコンソールへ移動します。
  4. 左側のナビゲーションペインから設定を選択。カスタムエンドポイントに記載されているエンドポイントをメモします。エンドポイントは “xxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com”のように記載されており、この場合、AWSリージョンは、 us-west-2になります。
  5. 左側のナビゲーションペインから安全性ポリシーを選択し、作成を選択します。
  6. アカウントにてポリシーが作成されていない場合は、「ポリシーはまだ作成されていません」というメッセージが表示されます。ポリシーの作成を選択します。
  7. ポリシー名を入力します(例: esp32_mqtt_proxy_iot_policy)。
  8. ステートメントを追加のセクションにて、アドバンストモードを選択。下記のJSONをコピーして、ポリシーエディタウィンドウに貼り付けます。aws-account-idをご自身のアカウントID(Step2でメモしたID)に置換してください。aws-regionus-west-2(Step4でメモしたエンドポイントのリージョン)に置換してください。
  9. 作成を選択します。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:<aws-region>:<aws-account-id>:*"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": "arn:aws:iot:<aws-region>:<aws-account-id>:*"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Subscribe",
      "Resource": "arn:aws:iot:<aws-region>>:<aws-account-id>:*"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Receive",
      "Resource": "arn:aws:iot:<aws-region>:<aws-account-id>:*"
    }
  ]
}

ステップ2 -AWS IoTモノの作成

AWS IoT モノの作成方法

  1. https://console.aws.amazon.com/iot/へサインイン。
  2. 左側のナビゲーションペインから管理モノを選択。右上の作成を選択します。
    アカウントにてモノが登録されていない場合は、「まだモノがありません」というメッセージが表示されます。モノの登録を選択します。
  3. AWS IoT モノを作成するのページで、単一のモノを作成するを選択します。
  4. Thing Registry にデバイスを追加のページで、モノの名前を入力します(例:esp32-ble)。英数字、ハイフン( ” – ” )、アンダースコア( “_” )のみ使用できます。次へを選択します。
  5. モノに証明書を追加のページで、証明書をスキップしてモノを作成証明書なしでモノを作成を選択します。

Amazon Cognito認証情報を使用して認証と認可を行うBLEプロキシモバイルアプリケーションを使用しているため、デバイス証明書は不要です。

AWS Cognitoの設定

Amazon Cognitoは、MQTTプロキシモバイルアプリケーションの認証に必要です。プリンシパルがAWS IoTポリシーを認証情報と紐付けることができるように、認証アイデンティティとIAMポリシーを紐付けます。

 ステップ1 – AWS Cognitoユーザープール

  1. Amazon Cognitoコンソール、https://console.aws.amazon.com/cognito/users/へサインイン。
  2. 右上のナビゲーション・バナーから、ユーザープールを作成するを選択します。
  3. プール名を入力します(例: esp32_mqtt_proxy_user_pool)。
  4. デフォルトを確認するを選択します。
  5. アプリクライアント箇所のアプリクライアントの追加をクリックし、アプリクライアントの追加を選択します。
  6. アプリクライアント名を入力します(例: mqtt_app_client)。
  7. クライアントシークレットを生成にチェックが入っていることを確認します。
  8. アプリクライアントの作成を選択します。
  9. プールの詳細に戻るを選択します。
  10. ユーザプールの確認ページにて、プールの作成を選択。
  11. “ユーザープールは正常に作成されました。”のメッセージが表示されます。
  12. pool IDをメモしてください。
  13. ナビゲーションペインから、アプリクライアントを選択します。
  14. 詳細を表示を選択します。
  15. アプリクライアント IDアプリクライアントのシークレットをメモします。

ステップ2 – Amazon Cognito ID プール の作成

  1. Amazon Cognitoコンソール、https://console.aws.amazon.com/cognito/federatedへサインイン。
  2. 新しい ID プールの作成を選択します。
  3. ID プール名を入力します(例:mqtt_proxy_identity_pool)。
  4. 認証プロバイダーをクリックします。
  5. Cognitoタブを選択します。
  6. 前のステップでメモした、ユーザープール IDアプリクライアントIDを入力します。
  7. プールの作成を選択します。
  8. 次のページで許可を選択し、認証されたIDと認証されていないIDの新しいロールを作成します。
  9. ID プールの IDをメモしてください。フォーマットは以下の通りです。us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

ステップ3 – 認証されたIDとIAMポリシーの紐付け

認証されたアイデンティティにIAMポリシーを紐付けることで、認証情報とIoTポリシーを紐付けることができます。

  1. Amazon Cognitoコンソール、https://console.aws.amazon.com/cognito/federatedを開きます。
  2. 先ほど作成したIDプールを選択します(今回の例だと、mqtt_proxy_identity_pool)。
  3. IDプールの編集を選択します。
  4. 認証されたロールに割り当てられたロール名をメモします(例:Cognito_mqtt_proxy_identity_poolAuth_Role)。
  5. IAMコンソール、https://console.aws.amazon.com/iam/homeを開きます。
  6. ナビゲーションペインのロールを選択します。
  7. 先ほどメモしたロールを検索し(今回の例だと、Cognito_mqtt_proxy_identity_poolAuth_Role)、選択します。
  8. インラインポリシーの追加を選択し、JSONを選択。
  9. 下記のポリシーを入力します。:
    {
       "Version": "2012-10-17",
       "Statement": [
       {
          "Effect": "Allow",
          "Action": [
             "iot:AttachPolicy",
             "iot:AttachPrincipalPolicy",
             "iot:Connect",
             "iot:Publish",
             "iot:Subscribe"
          ],
          "Resource": "*"
       }]
    }
  10. Review Policyを選択します。
  11. ポリシーの名前を入力します(例:mqttProxyCognitoPolicy)。
  12. Create policyを選択します。

 Amazon FreeRTOS BLE用ESP32のセットアップ

ハードウェアのセットアップ

この記事では、Espressifが開発したESP32-DevKitC V4を使用します。

  1. ボード用のドライバがインストールされていることを確認します。macOS High SierraにSilicon Labs CP2104のドライバをインストールする場合は、システム環境設定 > セキュリティ&プライバシーでインストールパッケージをホワイトリストへ登録後、インストールの再起動が必要になります。
  2. ESP32 の開発ボードに接続します。
  3. UART to USBは以下のように表示されます。
    1. Windowsの場合、ドライバはCOMxとしてポートに表示されます:
    2. macOSの場合:
      $ ls /dev/tty.S*
      /dev/tty.SLAB_USBtoUART
    3. Linuxの場合:
      $ ls /dev/ttyUSB* /dev/ttyUSB0

ESP32用のAmazon FreeRTOS BLEのダウンロード手順

  1. https://github.com/aws/amazon-freertosの GitHubリポジトリからAmazon FreeRTOSをgit cloneします。ブランチは、feature / ble-betaです。
    $ cd ~/esp 
    $ git clone -b feature/ble-beta --single-branch https://github.com/aws/amazon-freertos
  2. ボーレートとシリアルポートを設定します。各ハードウェア用のMakefileのサンプルがあります。amazon-freertos-library-share/demos/<manufacturer>/<hardware kit name>/make/.
    Espressif ESP32用は下記にあります。amazon-freertos-library-share/demos/espressif/esp32_devkitc_esp_wrover_kit/make/

    $ cd ~/esp/amazon-freertos-library-share/demos/espressif/esp32_devkitc_esp_wrover_kit/make
    $ make menuconfig


  3. 設定を保存します。

Amazon FreeRTOSの設定

  1. amazon-freertos-library-share/demos/espressif/esp32_devkitc_esp_wrover_kit/common/application_code/main.cを開きます。mainBLE_DEVICE_NAMEをメモしてください。Androidアプリケーションでは、 BLEの名前と一致する必要があります(例:ESP32)。
  2. ~esp/amazon-freertos-library-share/demos/common/include/aws_clientcredential.hを開きます。
  3. 以下を変更します。
    1. clientcredentialMQTT_BROKER_ENDPOINTを、AWS IoTエンドポイントに変更
    2. clientcredentialIOT_THING_NAMEを、先ほど作成したAWS IoTのモノに変更(今回の例だと、 esp32-ble

Amazon FreeRTOSをESP32へコンパイルとフラッシュ

  1. プログラムをESP32にフラッシュします。
    $ make flash monitor
  2. フラッシュが成功したら、ターミナルに以下が表示されるはずです。
    I (719) wifi: Init dynamic tx buffer num: 32
    I (719) wifi: Init data frame dynamic rx buffer num: 32
    I (719) wifi: Init management frame dynamic rx buffer num: 32
    I (729) wifi: Init static rx buffer size: 1600
    I (729) wifi: Init static rx buffer num: 10
    I (739) wifi: Init dynamic rx buffer num: 32
    0 49 [Btc_task] Started advertisement. Listening for a BLE Connection.

MQTT プロキシ用のサンプルAndroidアプリケーションのダウンロード、設定と実行

  1. GitHubリポジトリ、https://github.com/aws/amazon-freertos-ble-android-sdkからAndroid用のAmazon FreeRTOS MQTTプロキシアプリケーションをgit cloneします。
    $ cd ~/android
    $ git clone https://github.com/aws/amazon-freertos-ble-android-sdk
  2. 既存のAndroid Studioプロジェクトを開くを選択して、Android Studioからプロジェクトを開きます。 ~/android/amazon-freertos-ble-android-sdk
  3. amazonfreertossdk/src/main/java/com/amazon/aws/amazonfreertossdk/AmazonFreeRTOSManager.javaを開き、TEMPORARY_IOT_ENDPOINTをAWS IoT のエンドポイントに変更します。
  4. app/src/main/java/com/amazon/aws/freertosandroid/AuthenticatorActivity.javaを開き、以下のように編集します。
    1. AWS_IOT_POLICY_NAMEを、IoTのポリシー名に変更します(今回の例だと、esp32_mqtt_proxy_iot_policy)。
    2. COGNITO_POOL_IDを、pool IDに変更します。
    3. AWS_REGIONを、AWSサービスのリージョンに変更します。
  5. app/src/main/java/com/amazon/aws/freertosandroid/MainActivity.javaを開き、ESP_NAMEを編集します。今回の例だと、ESP_NAMEは、ESP32になります。
  6. app/src/main/res/raw/awsconfiguration.jsonを開いてファイルを編集します。
    {
    "UserAgent": "MobileHub/1.0",
    "Version": "1.0",
    "CredentialsProvider": {
    "CognitoIdentity": {
    "Default": {
     "PoolId": "<Cognito Identity Pool ID, e.g. us-east-2:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>",
     "Region": "<AWS region, e.g. us-east-2>"
    }
    }
    },
    "IdentityManager": {
    "Default": {}
    },
    "CognitoUserPool": {
    "Default": {
    "PoolId": "<Cognito user pool ID, such as us-east-2_0000XXXXX>",
    "AppClientId": "<Cognito user pool app client ID>",
    "AppClientSecret": "<Cognito user pool app client secret>",
    "Region": "<AWS region, e.g. us-east-2>"
    }
    }
    }
  7. Android phoneとコンピュータを接続します。
  8. Run → Run ‘app’を実行します。
  9. Select Deployment Targetにて、Connected Devices でPhoneを選択し、OKを選択します。

MQTT プロキシ

登録とログイン

  1. Android phoneでAndroidアプリが正常にコンパイルされて起動する場合は、以下のログイン画面が表示されます。
  2. Create New Accountを選択します。メールアドレスとパスワードを入力して、Amazon Cognitoユーザーを作成します。
  3. Amazon Cognitoからメールアドレスに確認コードを送信されます。
  4. 次の画面で、メールアドレスに送信された確認コードを入力します。

MQTTプロキシの実行

  1. 近くのBLEデバイスをスキャンするために、Scanを選択します。
  2.  ESP_ADDR またはESP_NAMEと一致するデバイスが見つかれば 、Connectスイッチが有効になります。
  3. Connect スイッチをトグルします
  4. AndroidアプリがESP32に接続されたら、ESP32のターミナルで以下のメッセージを確認できます。次にMQTTプロキシを有効化するため、MQTTエラーは無視して構いません
    2 16681 [Btc_task] BLE Connected to remote device, connId = 0
    3 16682 [Tmr Svc] Creating MQTT Echo Task...
    4 16682 [MQTTEcho] MQTT echo attempting to connect to a1jgguqwhae8ke-ats.iot.us-east-2.amazonaws.com.
    5 16682 [MQTTEcho] Sending command to MQTT task.
    6 16683 [MQTT] Received message 10000 from queue.
    7 16683 [MQTT] Failed to send notification, mqtt proxy state:1 
    8 16683 [MQTT] Failed to send CONNECT message, sent = 0
    9 16683 [MQTT] MQTT_Connect failed!
    
  5. Discoverを選択  して、esp32からすべてのGATTサービスを検出して登録します。
  6. Set MTU を選択して、デフォルトのMTUを20から500に増やします。
  7. MQTT Proxy スイッチをトグルして、MQTT プロキシを有効にします。
  8. MQTTプロキシが有効になったら、ESP32のターミナルで以下のメッセージが確認できます:
    65 4316 [MQTTEcho] MQTT echo attempting to connect to a1jgguqwhae8ke-ats.iot.us-east-2.amazonaws.com.
    66 4316 [MQTTEcho] Sending command to MQTT task.
    67 4316 [MQTT] Received message 70000 from queue.
    68 4446 [Btc_task] MQTT Connect was accepted. Connection established.
    69 4446 [Btc_task] Notifying task.
    70 4446 [MQTTEcho] Command sent to MQTT task passed.
    71 4446 [MQTTEcho] MQTT echo connected.
    72 4446 [MQTTEcho] Sending command to MQTT task.
    73 4446 [MQTT] Received message 80000 from queue.
    74 4558 [Btc_task] MQTT Subscribe was accepted. Subscribed.
    75 4558 [Btc_task] Notifying task.
    76 4558 [MQTTEcho] Command sent to MQTT task passed.
    77 4558 [MQTTEcho] MQTT Echo demo subscribed to freertos/demos/echo
    78 4558 [MQTTEcho] Sending command to MQTT task.
    79 4559 [MQTT] Received message 90000 from queue.
    80 4582 [Btc_task] MQTT Publish was successful.
    81 4582 [Btc_task] Notifying task.
    82 4583 [MQTTEcho] Command sent to MQTT task passed.
    83 4583 [MQTTEcho] Echo successfully published 'Hello World 0'
    84 4593 [Echoing] Sending command to MQTT task.
    85 4593 [MQTT] Received message a0000 from queue.
    86 4617 [Btc_task] MQTT Publish was successful.
    87 4617 [Btc_task] Notifying task.
    88 4617 [Echoing] Command sent to MQTT task passed.
    89 4619 [Echoing] Message returned with ACK: 'Hello World 0 ACK'
    

Android Studioでの出力結果

Android Studioと携帯電話を接続している場合は、選択したアプリケーションのみを表示 を選択して、Logcat内のメッセージをフィルタリングできます。

2018-11-09 11 (tel:2018110911):50:31.398 26628-26643/com.amazon.aws.freertosandroid D/AmazonFreeRTOSManager: Characteristic changed for: MQTT_TX with data: {"type":3,"topic":"ZnJlZXJ0b3MvZGVtb3MvZWNobw==","qoS":1,"msgID":272,"payloadVal":"SGVsbG8gV29ybGQgNDI="}
2018-11-09 11 (tel:2018110911):50:31.405 26628-26643/com.amazon.aws.freertosandroid I/AmazonFreeRTOSManager: Received Mqtt Message type : 3
2018-11-09 11 (tel:2018110911):50:31.419 26628-26643/com.amazon.aws.freertosandroid I/AmazonFreeRTOSManager: Sending mqtt message to IoT on topic: freertos/demos/echo message: Hello World 42
2018-11-09 11 (tel:2018110911):50:31.524 26628-29470/com.amazon.aws.freertosandroid I/AWSIotMqttManager: delivery is complete
2018-11-09 11 (tel:2018110911):50:31.524 26628-29470/com.amazon.aws.freertosandroid D/AmazonFreeRTOSManager: Publish msg delivery status: Success
2018-11-09 11 (tel:2018110911):50:31.524 26628-29470/com.amazon.aws.freertosandroid I/AmazonFreeRTOSManager: Sending PUB ACK back to device.
2018-11-09 11 (tel:2018110911):50:31.532 26628-29470/com.amazon.aws.freertosandroid D/AmazonFreeRTOSManager: Processing BLE command: WRITE_CHARACTERISTIC queue size: 0
2018-11-09 11 (tel:2018110911):50:31.534 26628-29470/com.amazon.aws.freertosandroid D/AmazonFreeRTOSManager: Writing to characteristic: MQTT_RX with data: {"msgID":272,"type":4}
2018-11-09 11 (tel:2018110911):50:31.634 26628-26643/com.amazon.aws.freertosandroid D/AmazonFreeRTOSManager: onCharacteristicWrite for: MQTT_RX; status: Success
2018-11-09 11 (tel:2018110911):50:31.634 26628-26643/com.amazon.aws.freertosandroid D/AmazonFreeRTOSManager: There's no ble command in the queue.

AWS IoT MQTTクライアントのMQTTメッセージのモニタリング

MQTTテストクライアントを使用して、AWT IoTで受信されているMQTTメッセージをモニタリングできます。

  1. AWS IoTコンソール、https://console.aws.amazon.com/iotにサインイン。
  2. ナビゲーションペインから、テストを選択します。
  3.  freertos/demos/echoをサブスクリプションします。
  4. AWS IoTコンソールにて、MQTTメッセージを確認できます。

最後に

Amazon FreeRTOS BLEを使い始めるのは簡単です。Amazon FreeRTOSコンソールからソースコードを、GitHubからAndroidまたはiOS用の SDKをダウンロードできます。このダウンロードファイルには、BLEデバイスの構築を開始するためのAndroid / iOSアプリのサンプルも含まれています。BLEデバイスが起動すると、ヘッドレスデバイスの標準BLEペアリングプロセスになります。

BLEのAmazon FreeRTOSサポートは、この記事で使用したEspressif ESP32などの認定された開発ボードで利用できます。開始方法の詳細については、Amazon FreeRTOS開発者ガイドを参照してください。

 

この記事はSA小泉が翻訳しました。原文はこちら