前提・実現したいこと
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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/17 02:52