因为公司有一个物联网项目需要使用到亚马逊到AWS-IOT服务,通过iot服务来控制物联网设备,国内和国外都没什么人用,连google都极少有跟这个有关帖子,所以做一个踩坑总结:

先放一个官方博客关于Amazon IoT 安卓SDK 中国区实践
https://us-west-2.console.aws.amazon.com/cognito/home?region=us-west-2# 刚开始想到这个肯定先百度了解一下,结果关于到少之又少,有也是跟Android无关到

本篇博客以Android端主,ios端为辅,且以最新的官方demo进行实践

如果你看过上面链接的博客的肯定以为按照上面的会轻松实现,我当初也是一样,按照上面的一步步来,结果到最后连,链接按钮都还是灰色,仔细看会知道这篇博客是17年的,没错,现在已经是19年了,肯定会版本迭代,我对比了一下确实改了很多东西索性坑还是被一个个填完了

接下来开始吧

首先你得有个AWS的账号

官网地址:https://aws.amazon.com/cn/?nc2=h_lg

如果登入进去首先得配置Amazon Cognito:在右上角找到控制台并且进入

ioTDB 连接工具推荐_IoT


然后搜索Cognito,进入然后会看见管理用户池和管理身份池然后就是创建了,这一个步骤开头文章到链接里面已经介绍过如何创建,可以去看看跟目前没有什么区别。

如果创建完成,身份ID先保存一下后面会用到,然后返回控制台搜索:iot greengrass

进入iot管理页面

到了这里创建事物那个地方会有些变化

ioTDB 连接工具推荐_ioTDB 连接工具推荐_02


点击这里进行创建

到了这一步有会跟开头帖子不一样

ioTDB 连接工具推荐_IoT_03


这里我们选择第一个创建单个物品

然后点击下一步

ioTDB 连接工具推荐_Amazon_04


这里我们选最后一个然后完成创建

然后可以看见我们刚刚创建好对一个名字为test_android的物品

ioTDB 连接工具推荐_ioTDB 连接工具推荐_05


在左侧边栏,点击安全—> 策略,创建一个新的策略,名字为android_iot_example_policy

然后点击高级模式把下面代码放进去,这样就创建完成一个策略了

{

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

"Statement": [

{

"Effect": "Allow",

"Action": [

"iot:Publish",

"iot:Subscribe",

"iot:Connect",

"iot:Receive"

],

"Resource": "*"

}

]

}

到这一步没什么困难的接下来就是代码踩坑之旅了,因为开头的官方博客里面并没有详细介绍,只能查阅官方sdk和API
官方Android-SDK的git地址:
github 地址最后更新时间 2022/7/12,总共有四个示例,建议找合适的,提取你需要的
https://github.com/awslabs/aws-sdk-android-samplesioTDB 连接工具推荐_Amazon_06

如果你下载了官方demo,打开项目名为AndroidPubSub的你会看见上图一样的目录结构

接下来我们先对比一下官方博客和现在的demo不同之处在哪

官方博客例子:

ioTDB 连接工具推荐_MQQTT_07


现在的官方demo:

ioTDB 连接工具推荐_AWS_08


可见只是少了一个COGNITO_POOL_ID参数其他的并没有区别:

首先在onCreate里面初始化并链接获取UUID作为AWS链接的唯一标认,根据注释我们可以知道:每个AWS IoT帐户都要求MQTT客户端ID是唯一的。这个UUID“实际上是独一无二的”,但不保证唯一性,如果链接成功会调用initIoTClient(),否则会错误信息会打印出来

ioTDB 连接工具推荐_IoT_09


initIoTClient()方法里面注意做了两件事情重要的事情从文件系统上的密钥库加载证书/密钥,如果没有则会去服务器创建,我们连接一般都会走第二步,initIoTClient()开头初始化了MQTT客户端到一步就是初始化完成:

我们要做到就是填写四个参数:

第一个:

private static final String CUSTOMER_SPECIFIC_ENDPOINT = "xxxxxxx.iot.cn-north-1.amazonaws.com.cn";

这里就是填写rest API 终端节点这个可以在iot中心到设置里面看到

ioTDB 连接工具推荐_IoT_10


第二个:

private static final String AWS_IOT_POLICY_NAME = "cn-north-1:xxxxxxxx";

这里就是要填刚刚我们创建好的那个协议名称
第三个:

"PoolId": "us-east-1:38eb13bd-xxxx-xxxx-8d67-c637bc6d50ac",

这里填写我们刚刚创建的身份管理池的那个id
第四个:

"Region": "us-east-1"

这个就是子节点名称,这里要跟第三个参数的开头对应上
第三和第四的填写位置在res文件下的raw文件,你会可见一个josn文件,找到第三和第四对应的key,按照我的这种填上去,这里会有一个终极坑,你因为结束了可以运行结果还是不行,我排查半天突然发现,下面这个要跟第一个参数的子节点对应否则无效,要填写对应的区域,如图所示
第五个:

private static final Regions MY_REGION = Regions.US_WEST_2;

ioTDB 连接工具推荐_MQQTT_11


如果这一步不跟终端子节点对应上是永远连接不上的会一直是重新连接的状态

然后把我们刚刚创建的策略添加到事物去

ioTDB 连接工具推荐_IoT_12


点击进去,然后点击安全性

ioTDB 连接工具推荐_Amazon_13


由于我已经创建过一个,你们看见肯定跟我不一样,你们选择创建一个就好了

ioTDB 连接工具推荐_IoT_14


创建完成会是这个样子,然后我们选择附加策略,把刚刚创建好到策略添加进去

ioTDB 连接工具推荐_AWS_15


点击完成,就可以运行demo,点击connect进行连接测试,连接成功,进行MQTT的消息收发,这个一步在开头的官方博客有,步骤我就不复述了,到此完成,这个坑填了两天才差不多填完,总结一下,ios的也是一样的,只是参数命名不一样,要填的也是这四个东西,我稍后会把github地址贴出来以供参考,由于项目还没开发完成,后续避坑步骤会慢慢发出来