【问题标题】:Using Android To Publish MQTT Messages on AWS IoT Services使用 Android 在 AWS IoT 服务上发布 MQTT 消息
【发布时间】:2017-08-01 00:31:00
【问题描述】:

我正在尝试在 Android 应用程序上使用 AWSIotMqttManager 和亚马逊网络服务 IoT 发布一条 mqtt 消息,我遵循使用 this 示例作为我的代码的基础。该应用程序说它可以成功连接到设备,但无法真正发布消息,这是什么问题?

// 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);
                }
            }
        });

日志:

/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

【问题讨论】:

  • 你能解决这个问题吗?我昨天自己偶然发现了这个问题。有时会显示“已连接”,但不会继续前进,有时会继续记录“正在重新连接”。
  • 你能解决这个问题吗?我正在尝试 n 甚至没有连接
  • @SweetyBertilla 抱歉,我一直无法为该应用找出这个 MQTT / AWS 部分。
  • @S.Q 我已经弄明白了,如果您还需要帮助,请告诉我

标签: java android amazon-web-services mqtt aws-iot


【解决方案1】:

感谢您使用 AWS IoT 设备开发工具包。您是否能够使用您的凭据来运行 AndroidPubSubSample 程序,并且您是否能够成功订阅和发布消息?这是为了确保您拥有正确的凭据设置,例如附有正确的政策和权限。

此外,您可以订阅生命周期事件“$aws/events/#”以查看您的订阅日志并发布。我可以成功地将您的 JSON 数据发布到 $aws/things/../update 主题并在 $aws.things/.../update/ 上被硬编码主题和消息接受。

如果您对使用 AWS IoT 设备开发工具包有更多疑问和问题,请随时在 github 存储库上提出问题。具体Android SDK可以去https://github.com/aws/aws-sdk-android

【讨论】:

    【解决方案2】:

    我认为错误是因为您无法订阅主题。订阅在 IAM 策略语句中使用“topicfilter”,而发布和接收使用“topic”。示例中的策略不正确。有效的 IAM 政策如下:

    {
        "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/*"
                ]
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 2022-06-12
      • 1970-01-01
      • 2018-03-23
      • 2021-08-17
      • 2018-11-26
      • 2017-08-17
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多