亚马逊AWS官方博客
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)。
替换
2. 配置Amazon Cognito
1) 在console上打开Cognito服务,创建新的身份池,启用未经验证的身份的访问权限,点击创建池。在下一页点击允许。
2) 记录下身份池ID
3) console中点击进入IAM,在角色中找到Cognito_xxxxUnauth_Role (本例中为Cognito_android_iot_exampleUnauth_Role),加入一条新的内联策略。
3. 配置AWS IoT
1) 在console中进入AWS IoT服务,创建一个新的事物。点击新创建的事物,左边栏点击交互,记录Rest API的终端节点
2) 在左侧边栏,点击安全=》策略,创建一个新的策略
输入并记录下策略名称android_iot_example_policy
点击高级模式输入:
更多策略请见这里
4. 找到文件PubSubActivity,更新代码配置
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项目管理经验。