質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

3697閲覧

AndroidによるAWS cognito + AWS IoTでIOException

JTY

総合スコア19

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2018/07/06 07:48

前提・実現したいこと

AndroidでAWS cognito + AWS IoTによる通信を実装しているのですが、接続を確立させることができません。
コードはKotlinで実装しております。

###ソースコード
MainActivityにサインインのため下記コードを追加いたしました。

Kotlin

1override fun onCreate(savedInstanceState: Bundle?) { 2 super.onCreate(savedInstanceState) 3 setContentView(R.layout.activity_main) 4 /*** CognitoUserPoolの作成 ***/ 5 val userPool = CognitoUserPool(applicationContext, "<UserPoolId>", "<AppClientId>", "<AppClientSecret>", Regions.AP_NORTHEAST_1) 6 /*** コールバック処理を定義 ***/ 7 val autoAuthenticationHandler = object : AuthenticationHandler { 8 override fun onSuccess(userSession: CognitoUserSession?, newDevice: CognitoDevice?) { 9 Toast.makeText(applicationContext, "success!", Toast.LENGTH_LONG).show() 10 val preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext) 11 val editor = preferences.edit() 12 editor.putString(getString(R.string.key_token_id), userSession?.idToken!!.jwtToken) 13 editor.apply() 14 val intent = Intent(this@MainActivity, IoTActivity::class.java) 15 startActivity(intent) 16 finish() 17 } 18 override fun authenticationChallenge(continuation: ChallengeContinuation?) { 19 } 20 override fun getAuthenticationDetails(authenticationContinuation: AuthenticationContinuation, userId: String) { 21 Toast.makeText(applicationContext, "getAuthenticationDetails", Toast.LENGTH_LONG).show() 22 val authenticationDetails = AuthenticationDetails(userId, "<Password>", null) 23 authenticationContinuation.setAuthenticationDetails(authenticationDetails) 24 authenticationContinuation.continueTask() 25 } 26 override fun getMFACode(multiFactorAuthenticationContinuation: MultiFactorAuthenticationContinuation) { 27 } 28 override fun onFailure(exception: Exception) { 29 Log.e(LOG_TAG, exception.message) 30 } 31 } 32 /*** サインイン処理を開始 ***/ 33 val cognitoUser = userPool.getUser("<UserId>") 34 cognitoUser.getSessionInBackground(autoAuthenticationHandler) 35}

ログイン完了(IDトークン取得)後に遷移するIoTActivityでは下記のコードを実装しています。

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_pubsub) /*** IDトークンを取得 ***/ val preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext) val token = preferences.getString(getString(R.string.key_token_id), "") if(token == null || token == ""){ Toast.makeText(applicationContext, "Can't get token!", Toast.LENGTH_SHORT).show() return } /*** サインイン情報を付加したCognitoCachingCredentialsProviderを生成 ***/ val loginMap = HashMap<String, String>() val mapIndex = "cognito-idp." + Regions.AP_NORTHEAST_1.getName() + ".amazonaws.com/" + "<UserPoolId>" loginMap[mapIndex] = token val credentialsProvider = CognitoCachingCredentialsProvider(applicationContext, "<IdPoolId>", Regions.AP_NORTHEAST_1) credentialsProvider.logins = loginMap /*** 接続処理 ***/ val clientId = UUID.randomUUID().toString() val mqttManager = AWSIotMqttManager(clientId, AWSUtils.CUSTOMER_SPECIFIC_ENDPOINT) mqttManager.isAutoReconnect = false val btn001 = findViewById<Button>(R.id.btn001) btn001.setOnClickListener{ mqttManager.connect(credentialsProvider) { status, throwable -> Log.d(LOG_TAG, "Status = " + status.toString()) runOnUiThread { if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.Connecting) { Toast.makeText(applicationContext, "Connecting...", Toast.LENGTH_SHORT).show() } else if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.Connected) { Toast.makeText(applicationContext, "Connected", Toast.LENGTH_SHORT).show() } else if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.Reconnecting) { Toast.makeText(applicationContext, "Reconnecting", Toast.LENGTH_SHORT).show() } else if (status == AWSIotMqttClientStatusCallback.AWSIotMqttClientStatus.ConnectionLost) { Toast.makeText(applicationContext, "Disconnected", Toast.LENGTH_SHORT).show() } else { Toast.makeText(applicationContext, "Disconnected", Toast.LENGTH_SHORT).show() } } } } }

エラー内容

コードを実行するとmqttManager.connect()実行後Logcatに下記エラーメッセージが表示されます。

07-06 15:52:37.616 xxxxx-xxxxx/xxxx.sampleawscognitologin001 E/xxxx.sampleawscognitologin001.IoTActivity: Connection error. MqttException (0) - java.io.IOException: Pipe already connected at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38) at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:664) at java.lang.Thread.run(Thread.java:818) Caused by: java.io.IOException: Pipe already connected at java.io.PipedOutputStream.connect(PipedOutputStream.java:91) at java.io.PipedInputStream.connect(PipedInputStream.java:172) at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketReceiver.<init>(WebSocketReceiver.java:42) at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketSecureNetworkModule.start(WebSocketSecureNetworkModule.java:78) at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650) at java.lang.Thread.run(Thread.java:818) 

補足情報

・SDKはappのbuild.gradleに下記コードを追加して利用しています。

Kotlin

1implementation('com.amazonaws:aws-android-sdk-auth-userpools:2.6.+@aar') { transitive = true } 2compile 'com.amazonaws:aws-android-sdk-iot:2.6.23'

・IoTActivityで下記の未認証Providerを使用した際は接続に成功します。
ただ、上記エラーが一度でも発生した後は未認証Providerを使用しても同じエラーメッセージで接続失敗するようになってしまいます。

Kotlin

1val credentialsProvider = CognitoCachingCredentialsProvider(applicationContext, AWSUtils.idPoolId, Regions.AP_NORTHEAST_1)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ずっと回答がないので同じ現象かもしれないstackoverflowの回答があったので載せておきます(全然違っていたらすみません)
見つけた元ネタはgithubのissuesでstackoverflowで解決したよとありました。ご参考までに・・・。
Github
stackoverflow

投稿2018/07/26 03:01

razuma

総合スコア1313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JTY

2018/08/17 02:52

解決に至る前にIoTではなくLambdaを使用する方向性となりましたため本件はクローズさせていただきます。 参考になりそうなURLを提示していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問