Category: Internet of Things*


Amazon IoT 安卓SDK 中国区实践

作者:任庆杰,AWS解决方案架构师。

简介

物联网(IOT)是现在非常火热的一个概念。那么怎么样利用AWS提供的IoT服务,快速在自己的安卓智能设备上搭建起IoT的消息推送和订阅呢?

本文将分两部分为你解读:

1)如何动态生成和绑定设备证书

2)如何利用MQTT协议接入Amazon IoT 平台

服务简介

AWS IoT平台

AWS IoT 是一种托管的云平台,使互联设备可以轻松安全地与云应用程序及其他设备交互。AWS IoT 可以支持数十亿台设备和数万亿条消息,并且可以对这些消息进行处理并将其安全可靠地路由至 AWS 终端节点和其他设备。借助 AWS IoT,您的应用程序可以随时跟踪您的所有设备并与其通信,即使这些设备未处于连接状态也不例外。

Amazon Cognito

Cognito Identity 可让您轻松实现联合身份,您可以让用户通过Amazon, OpenID, SAML或者自定义的身份认证系统进行认证。匿名或认证登录后,IoT设备被赋予临时性受限权限凭证,可以利用此凭证访问 AWS 资源。

过程介绍

1.  获取连接IoT的权限证书

1)通过安装在安卓设备上的SDK连接Amazon Cognito,认证用户(本文示例将采用匿名模式),并且获取临时权限的Access Key和Secret Key。

2)使用临时权限向AWS IoT发起创建证书请求,激活证书并且下载。

3)将证书加密存储为Keystore在设备上,用以认证之后的IoT请求。Android Keystore保护你存储在设备上的证书,让它不容易被它人破解和提取。

2.  通过MQTT协议连接AWS IoT,并订阅和推送消息。

1)连接设备与AWS IoT,使用Keystore来通过认证

2)与AWS IoT的设备网关交互来订阅和推送消息

3)通过规则引擎还可以过滤消息,并调度AWS各种服务

操作指南

1.  配置环境

1)下载并安装Android Studio

2)下载样例代码https://github.com/awslabs/aws-sdk-android-samples/

3)在Android Studio中,创建导入项目,源指定为样例代码中的AndroidPubSub文件夹

4)修改build.gradle文件,引入支持中国区服务的Android SDK版本(大于等于2.6.7)。

替换

dependencies {

    compile 'com.amazonaws:aws-android-sdk-iot:2.2.+'

}


为

dependencies {

    compile 'com.amazonaws:aws-android-sdk-iot:2.6.7'

}

2.  配置Amazon Cognito

1)  在console上打开Cognito服务,创建新的身份池,启用未经验证的身份的访问权限,点击创建池。在下一页点击允许。

2)  记录下身份池ID

3)  console中点击进入IAM,在角色中找到Cognito_xxxxUnauth_Role (本例中为Cognito_android_iot_exampleUnauth_Role),加入一条新的内联策略。

{

  "Version": "2012-10-17",

  "Statement": [

    {

      "Effect": "Allow",

      "Action": [

        "iot:AttachPrincipalPolicy",

        "iot:CreateKeysAndCertificate"

      ],

      "Resource": [

        "*"

      ]

    }

  ]

}

3.  配置AWS IoT

1)  在console中进入AWS IoT服务,创建一个新的事物。点击新创建的事物,左边栏点击交互,记录Rest API的终端节点

2)  在左侧边栏,点击安全=》策略,创建一个新的策略

输入并记录下策略名称android_iot_example_policy

点击高级模式输入:

{

"Version": "2012-10-17",

"Statement": [

{

"Effect": "Allow",

"Action": [

"iot:Publish",

"iot:Subscribe",

"iot:Connect",

"iot:Receive"

],

"Resource": "*"

}

]

}

更多策略请见这里

4.  找到文件PubSubActivity,更新代码配置

// rest API 终端节点
private static final String CUSTOMER_SPECIFIC_ENDPOINT = "xxxxxxx.iot.cn-north-1.amazonaws.com.cn";
// Cognito身份池ID
private static final String COGNITO_POOL_ID = "cn-north-1:xxxxxxxx";
// 策略名称

private static final String AWS_IOT_POLICY_NAME = "android_iot_example_policy";
// Region填写CN_NORTH_1
private static final Regions MY_REGION = Regions.CN_NORTH_1;
// keystore存储名字
private static final String KEYSTORE_NAME = "yourkeystorename";
// keystore密码
private static final String KEYSTORE_PASSWORD = "yourpassword";
// 证书别名
private static final String CERTIFICATE_ID = "default";

5.  测试订阅和推送

1)  在android studio中运行项目AndroidPubSub项目。点击界面上的Connect按钮,等待Status变为“Connected”。在topic name处输入话题名称“to_android_device”,并点击SUBSCRIBE按钮。

2)  打开AWS控制台,进入IoT服务。点击左侧栏“测试”,点击生成客户端ID,并点击连接。

在订阅主题中输入“to_console”,并点击订阅主题按钮

3)测试从安卓设备发送消息到控制台客户端

在Topic中输入“to_console”,Message中输入“hello, console”,点击PUBLISH按钮

在控制台确认收到消息

4)从控制台客户端发送消息至安卓设备

在控制台点击“发布消息至一个主题”,在主题中输入“to_android_device”,内容输入“Hello,Android device”,点击发布到主题按钮

在安卓设备确认收到的消息

更多信息

在本文中,我们使用了Cognito的匿名模式来做身份认证。在生产中我们还可以使用Cognito的联合认证进行身份认证。

AWS IoT服务的规则功能使您的设备能够与 AWS 服务交互。基于 MQTT 主题流分析规则并执行操作。

作者简介:

任庆杰,AWS解决方案架构师。负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内和全球的应用和推广。在加入AWS前,拥有超过7年的软件开发和IT项目管理经验。