2017-03-10 2 views
0

Je suis en train de publier un message mqtt utilisant AWSIotMqttManager avec les services Web de amazon IOT sur une application Android, j'ai suivez utilisé this exemple comme base pour mon code. L'application dit qu'elle peut se connecter avec succès à l'appareil, mais ne parvient pas à publier un message, ce qui ne va pas ici?Utiliser Android Pour publier des messages MQTT sur AWS IdO services

// Initialize the AWS Cognito credentials provider 
     credentialsProvider = new CognitoCachingCredentialsProvider(
       getApplicationContext(), // context 
       COGNITO_POOL_ID, // Identity Pool ID 
       MY_REGION // Region 
     ); 
     Region region = Region.getRegion(MY_REGION); 

     //intialize unnqique clientid as client to iot aws 
     Long tsLong = System.currentTimeMillis()/1000; 
     clientId = tsLong.toString(); 
// MQTT Client 
     mqttManager = new AWSIotMqttManager(clientId, CUSTOMER_SPECIFIC_ENDPOINT); 
// The following block uses a Cognito credentials provider for authentication with AWS IoT. 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       awsCredentials = credentialsProvider.getCredentials(); 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         bttnConnect.setEnabled(true); 
         Toast.makeText(WelcomePageActivity.this, "credentials ok?", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 
     }).start(); 
//connection button onclick lisetner will connect to the mqtt protocol 
     bttnConnect.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d("LOG_TAG", "clientId = " + clientId); 
       try { 
        mqttManager.connect(credentialsProvider, new AWSIotMqttClientStatusCallback() { 
         @Override 
         public void onStatusChanged(final AWSIotMqttClientStatus status, 
                final Throwable throwable) { 
          Log.d("LOG_TAG", "Status = " + String.valueOf(status)); 

          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            if (status == AWSIotMqttClientStatus.Connecting) { 
             tvStatus.setText("Connecting..."); 

            } else if (status == AWSIotMqttClientStatus.Connected) { 
             tvStatus.setText("Connected"); 

            } else if (status == AWSIotMqttClientStatus.Reconnecting) { 
             if (throwable != null) { 
              Log.e("LOG_TAG", "Connection error.", throwable); 
             } 
             tvStatus.setText("Reconnecting"); 
            } else if (status == AWSIotMqttClientStatus.ConnectionLost) { 
             if (throwable != null) { 
              Log.e("LOG_TAG", "Connection error.", throwable); 
              throwable.printStackTrace(); 
             } 
             tvStatus.setText("Disconnected"); 
            } else { 
             tvStatus.setText("Disconnected"); 

            } 
           } 
          }); 
         } 
        }); 

       } catch (final Exception e) { 
        Log.e("LOG_TAG", "Connection error.", e); 
        tvStatus.setText("Error! " + e.getMessage()); 
       } 
      } 
     }); 
     //publisj button 
     ledbutton.setOnClickListener(new View.OnClickListener() { 
      final String topic = "$aws/things/industech/shadow/update"; 
      final String msg = "{\"state\": {\"desired\": {\"ledBarStatus\": 1},\"reported\": {\"temperature\": 25,\"ledBarStatus\":1}}}"; 

      @Override 
      public void onClick(View v) { 
       try { 
        mqttManager.publishString(msg, topic, AWSIotMqttQos.QOS1); 
       } catch (Exception e) { 
        Log.e("LOG_TAG", "Publish error.", e); 
       } 
      } 
     }); 

Le journal:

/CognitoCachingCredentialsProvider: Loading credentials from SharedPreferences 

D/CognitoCachingCredentialsProvider: Saving credentials to SharedPreferences 

D/LOG_TAG: clientId = 1489081527 

D/LOG_TAG: Status = Connecting 

D/LOG_TAG: Status = Connected 

D/LOG_TAG: Status = Reconnecting 

D/LOG_TAG: Status = Connected 
+0

Avez-vous pu résoudre ce problème? Je suis tombé sur ce problème moi-même hier. Il dit parfois "connecté" et ne va pas de l'avant ou continue parfois à se connecter "Reconnecting". – RamithDR

Répondre

0

Merci pour avoir utilisé SDK Device AWS IdO. Êtes-vous capable d'utiliser vos informations d'identification pour exécuter le programme AndroidPubSubSample et êtes-vous en mesure de vous abonner et de publier des messages avec succès? Ceci afin de vous assurer que vous disposez de la bonne configuration des informations d'identification, par ex. Corrigez les stratégies et les autorisations associées. En outre, vous pouvez vous abonner aux événements du cycle de vie "$ aws/events/#" pour voir le journal de votre abonnement et le publier. Je pourrais publier avec succès vos données JSON dans $ aws/things /../ mettre à jour des sujets et être accepté sur $ aws.things /.../ update/accepted par hardcoding sujet et message.

Si vous avez d'autres questions et problèmes concernant l'utilisation du SDK AWS IoT Device, n'hésitez pas à ouvrir un problème sur le référentiel github. Pour Android SDK spécifiquement, vous pouvez aller à https://github.com/aws/aws-sdk-android

0

Je crois que l'erreur est parce que vous ne pouviez pas vous abonner à un sujet. Subscribe utilise "topicfilter" dans l'instruction de stratégie IAM alors que Publish and Receive utilise "topic". La stratégie de l'exemple est incorrecte. La politique IAM de travail est la suivante:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "iot:Connect" 
      ], 
      "Resource": [ 
       "*" 
      ] 
     }, 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "iot:Publish", 
       "iot:Receive" 
      ], 
      "Resource": [ 
       "arn:aws:iot:<your region>:<youracc>:topic/whatevertopic/*" 
      ] 
     }, 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "iot:Subscribe" 
      ], 
      "Resource": [ 
       "arn:aws:iot:<your region>:<youracc>:topicfilter/whatevertopic/*" 
      ] 
     } 
    ] 
}