如何在Android应用程序上获取aws-iot的东西阴影

时间:2017-09-04 07:25:25

标签: android amazon-web-services iot

想要使用Android应用程序使用AWS IOT开始开发

我正在寻找Android中的IOT示例。需要在AWS控制台和Android应用程序上启动基本配置。我已经测试了温度演示,但没有得到任何线索!需要关于影子,政策,角色的基本步骤。如何逐步配置和使用cognito。

下面的getshadow()方法被称为onCreate,需要实时更新值而不是on onCreate。

  public void getShadows() {

        GetShadowTask getControlShadowTask = new GetShadowTask("TemperatureControl");
       getControlShadowTask.execute();
    }


    private class GetShadowTask extends AsyncTask<Void, Void, AsyncTaskResult<String>> {

        private final String thingName;

        public GetShadowTask(String name) {
            thingName = name;
        }

        @Override
        protected AsyncTaskResult<String> doInBackground(Void... voids) {
            try {
                GetThingShadowRequest getThingShadowRequest = new GetThingShadowRequest()
                        .withThingName(thingName);
                GetThingShadowResult result = iotDataClient.getThingShadow(getThingShadowRequest);
//                Toast.makeText(getApplication(),result.getPayload().remaining(),Toast.LENGTH_LONG).show();
                byte[] bytes = new byte[result.getPayload().remaining()];
                result.getPayload().get(bytes);
                String resultString = new String(bytes);
                return new AsyncTaskResult<String>(resultString);
            } catch (Exception e) {

                Log.e("E", "getShadowTask", e);
                return new AsyncTaskResult<String>(e);
            }
        }

        @Override
        protected void onPostExecute(AsyncTaskResult<String> result) {
            if (result.getError() == null) {
                JsonParser parser=new JsonParser();
                JsonObject jsonObject= (JsonObject) parser.parse(result.getResult());
response=result.getResult();
         setPoint=jsonObject.getAsJsonObject("state").getAsJsonObject("reported")
               .get("current_date").getAsString();
textView.setText(setPoint);
           //     Toast.makeText(getApplication(),setPoint,Toast.LENGTH_LONG).show();
                Log.i(GetShadowTask.class.getCanonicalName(), result.getResult());

            } else {
                Log.e(GetShadowTask.class.getCanonicalName(), "getShadowTask", result.getError());
                Toast.makeText(getApplication(),result.getError().toString(),Toast.LENGTH_LONG).show();
            }
        }
    }

更新

影子

{   “期望”:{     “欢迎”:“aws-iot”   },   “已报告”:{     “欢迎”:“aws-iot”,     “current_date”:“06-Sep-2017 1:26:40 PM”   } }

2 个答案:

答案 0 :(得分:0)

AWS提供了完整的Github repo个Android示例。在示例中,执行PubSubWebSocket连接,订阅并将数据发布到阴影。

如果您仔细查看PubSubWebSocket示例,您将找到有关如何制定事物策略和角色的详细信息。它不能比那更简洁明了。

要理解和使用Cognito,请按照AmazonCognitoAuthDemo示例创建标识池并在PubSubWebSocket示例中使用它。

更好地了解角色和Cognito。请阅读AWS文档。

<强>更新 在物联网事物策略中,您是否提供了连接,订阅和发布的适当权限。该选项可在AWS IoT-&gt; Security-&gt; Policy-&gt; Create Policy中找到。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "arn:aws:iot:us-east-2:293751794947:topic/replaceWithATopic"
    }
  ]
}

以上政策提供对用户的所有访问权限。另外,请确保您创建的池适用于未经身份验证的用户。

要获取对阴影类型的更改,请在示例android(WebSocketAwsPubSub)编辑框$aws/things/thing_name/shadow/update/accepted

中进行以下操作

将数据发布到阴影类型$aws/things/thing_name/shadow/update

更新2: Android代码,您将收到报告的消息。它对设备的怀疑。它是PubSubWebSocketSample的片段副本。

public void AwsSubscribe(){
    final String topic = "$aws/things/D1/shadow/update/accepted";

Log.d(LOG_TAG, "topic = " + topic);

try {
    mqttManager.subscribeToTopic(topic, AWSIotMqttQos.QOS0,
            new AWSIotMqttNewMessageCallback() {
                @Override
                public void onMessageArrived(final String topic, final byte[] data) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                String message = new String(data, "UTF-8");
                                Log.d(LOG_TAG, "Message arrived:");
                                Log.d(LOG_TAG, "   Topic: " + topic);
                                Log.d(LOG_TAG, " Message: " + message);

                                tvLastMessage.setText(message);

                            } catch (UnsupportedEncodingException e) {
                                Log.e(LOG_TAG, "Message encoding error.", e);
                            }
                        }
                    });
                }
            });
} catch (Exception e) {
    Log.e(LOG_TAG, "Subscription error.", e);
}

}

答案 1 :(得分:0)

如果要创建主题,只需更改此变量final String topic = "YOUR TOPIC"的值,然后使用示例代码进行订阅即可。