Help us understand the problem. What is going on with this article?

AWS SDK for Android SamplesのAndroidPubSubを動かす

More than 1 year has passed since last update.

モチベーション

AndroidアプリでIoTデバイスの操作をしたいと思い、
AWS SDK for Android SamplesのAndroidPubSubを動かしてみましたが、
READMEが英語版のページをもとに作成してあり、(個人的に)分かりづらかったので、
自分なりに日本語版ページでの操作方法をまとめ、備忘録として情報を残そうと思いました。
READMEの建付けにしたがって説明していきます。

前提条件

  • Android Studio(自分の場合はVer3.2.1)
  • Android API 10以上

各種設定

Android StudioにAndroidPubSubプロジェクトをインポートする

まずはプロジェクトのソースコードをダウンロードします。
Gitをインストールしていれば、下記のコマンドで任意のフォルダにダウンロードできます。

git clone https://github.com/awslabs/aws-sdk-android-samples.git

ダウンロードしたら、Android StudioでImport ProjectからAndroidPubSubのフォルダを選択して、インポートします。
import_androidpubsub_project.png

インポートするとGradleがビルドを始めますが、下記メッセージが出ると思うので
「Add Google Maven repository and sync project」をクリックして対処します。
gradle_build_failed_1.png
コンパイルするターゲットのAndroidSDKが見つからないと言われたら、
「Install missing platform(s) and sync project」をクリックしてインストールするか、
すでに別のバージョンがインストール済みなら、build.gradleに書いてある「compileSdkVersion」の数値を変更して、
もう一度ビルドします。
gradle_build_failed_2.png
gradle_build_failed_3.png
下記のようなメッセージが出たら、Updateしましょう。
gradle_build_failed_4.png
下記メッセージが出たら、build.gradleのdependenciesのcompileをimplementationに変更します。
buildToolsVersionを26.0.2から28.0.3に変更します(環境によって違うかも)。
gradle_build_failed_5.png
gradle_build_failed_6.png
下記メッセージが出たら、AndroidManifest.xmlに書いてある「uses-sdk」を削除します。
gradle_build_failed_7.png
gradle_build_failed_8.png
非推奨の書き方はまだ残っていると思いますが、自分の場合はここまででビルドエラーやワーニングはなくなりましたので先に進みます。

Cognitoの設定

AWS IoTにアクセスするためのCognito IDを作成します。
Amazon Cognito Consoleにアクセスして、「IDプールの管理」ボタンをクリックします。
IDプール名を入力します。任意の名前でOKです。
その後、「認証されていないIDに対してアクセスを有効にする」チェックボックスにチェックを入れます。
「プールの作成」ボタンをクリックします。
次の画面では、「詳細を表示」をクリックすると、2つのIAMロールの情報が現れます。
特に設定は必要ありませんので、そのまま「許可」ボタンを押します。
さらに次の画面では、下記のようなサンプルコードが生成されます。
このIDをメモしておきます(下記のap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxの部分)。

// Amazon Cognito 認証情報プロバイダーを初期化します
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
    getApplicationContext(),
    "ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", // ID プールの ID
    Regions.AP_NORTHEAST_1 // リージョン
);

Cognitoの設定は完了です。

IAMの設定

続いて、IAM Consoleにアクセスします。
IAMロールの一覧が表示されるので、先ほどのCognitoの設定で作成したIDプール名がついた、
認証されていないID用のロールをクリックします。
例えば、IDプール名が「TestAppName」なら「Cognito_TestAppNameUnauth_Role」をクリックします。
「インラインポリシーの追加」ボタンをクリックします。
「JSON」タブをクリックし、下記を入力します。
入力後、「Review policy」ボタンをクリックします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:AttachPrincipalPolicy",
        "iot:CreateKeysAndCertificate"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

任意のポリシーの名前を入力して、「Create policy」ボタンをクリックします。
IAMの設定は完了です。

AWS IoTの設定

続いて、AWS IoT Consoleにアクセスします。
サイドパネルの「安全性」の中にある「ポリシー」をクリックします。
「作成」ボタンをクリックします。
次の画面で任意のポリシーの名前を入力します。このポリシー名をアプリ内に設定するので、メモしておきます。
「アドバンストモード」をクリックし、下記を入力します。
「作成」ボタンをクリックします。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Subscribe",
        "iot:Receive"
      ],
      "Resource": "*"
    }
  ]
}

続いて、サイドパネルの「設定」ボタンをクリックします。
アプリ内に設定するので、エンドポイントをメモしておきます。

AWS IoTの設定は完了です。

Androidアプリの設定

最後に、Androidアプリに通信に必要な項目を設定していきます。

CUSTOMER_SPECIFIC_ENDPOINTに、「AWS IoTの設定」でメモしておいたエンドポイントを設定します。

PubSubActivity.java
// AWS Iot CLI describe-endpoint call returns: XXXXXXXXXX.iot.<region>.amazonaws.com
private static final String CUSTOMER_SPECIFIC_ENDPOINT = "CHANGE_ME";

COGNITO_POOL_IDに、「Cognitoの設定」でメモしておいたプールIDを設定します。

PubSubActivity.java
// AWS IoT permissions.
private static final String COGNITO_POOL_ID = "CHANGE_ME";

AWS_IOT_POLICY_NAMEに、「AWS IoTの設定」でメモしておいたポリシー名を設定します。

PubSubActivity.java
// Name of the AWS IoT policy to attach to a newly created certificate
private static final String AWS_IOT_POLICY_NAME = "CHANGE_ME";

MY_REGIONに、リージョンを設定します。
エンドポイントがXXXXXXXXXX.iot.ap-northeast-1.amazonaws.comなら
「Regions.AP-NORTHEAST_1」を設定します。

PubSubActivity.java
// Region of AWS IoT
private static final Regions MY_REGION = Regions.US_EAST_1;

下記のKeyStoreファイルの名前やパスワード、証明書IDは任意でOKです。

PubSubActivity.java
// Filename of KeyStore file on the filesystem
private static final String KEYSTORE_NAME = "iot_keystore";
// Password for the private key in the KeyStore
private static final String KEYSTORE_PASSWORD = "password";
// Certificate and key aliases in the KeyStore
private static final String CERTIFICATE_ID = "default";

以上で設定はすべて完了です。

実機確認

証明書の設定が成功すると、「Connect」ボタンをクリックできるようになります。
「Connect」ボタンをクリックして、StatusがConnecting…→Connectedになることを確認します。
適当なトピック名を入力し、Subscribeしている状態にします。
さらに任意のメッセージをPublishし、Last Messageが更新されるのを確認します。
hello_pubsub.png

以上です。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away