Amazon---IoT--Android和iOS上的实践,通过MQTT协议连接AWS IoT,并订阅和推送消息

因为公司有一个物联网项目需要使用到亚马逊到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:在右上角找到控制台并且进入
在这里插入图片描述
然后搜索Cognito,进入然后会看见管理用户池和管理身份池然后就是创建了,这一个步骤开头文章到链接里面已经介绍过如何创建,可以去看看跟目前没有什么区别。
如果创建完成,身份ID先保存一下后面会用到,然后返回控制台搜索:iot greengrass
进入iot管理页面
到了这里创建事物那个地方会有些变化
在这里插入图片描述
点击这里进行创建
到了这一步有会跟开头帖子不一样
在这里插入图片描述
这里我们选择第一个创建单个物品
然后点击下一步
在这里插入图片描述
这里我们选最后一个然后完成创建
然后可以看见我们刚刚创建好对一个名字为test_android的物品
在这里插入图片描述
在左侧边栏,点击安全—> 策略,创建一个新的策略,名字为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-samples
在这里插入图片描述

如果你下载了官方demo,打开项目名为AndroidPubSub的你会看见上图一样的目录结构
接下来我们先对比一下官方博客和现在的demo不同之处在哪
官方博客例子:
在这里插入图片描述
现在的官方demo:
在这里插入图片描述
可见只是少了一个COGNITO_POOL_ID参数其他的并没有区别:
首先在onCreate里面初始化并链接获取UUID作为AWS链接的唯一标认,根据注释我们可以知道:每个AWS IoT帐户都要求MQTT客户端ID是唯一的。这个UUID“实际上是独一无二的”,但不保证唯一性,如果链接成功会调用initIoTClient(),否则会错误信息会打印出来
在这里插入图片描述
initIoTClient()方法里面注意做了两件事情重要的事情从文件系统上的密钥库加载证书/密钥,如果没有则会去服务器创建,我们连接一般都会走第二步,initIoTClient()开头初始化了MQTT客户端到一步就是初始化完成:
我们要做到就是填写四个参数:
第一个:

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

这里就是填写rest API 终端节点这个可以在iot中心到设置里面看到
在这里插入图片描述
第二个:

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;

在这里插入图片描述
如果这一步不跟终端子节点对应上是永远连接不上的会一直是重新连接的状态

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

在这里插入图片描述
点击进去,然后点击安全性
在这里插入图片描述
由于我已经创建过一个,你们看见肯定跟我不一样,你们选择创建一个就好了
在这里插入图片描述
创建完成会是这个样子,然后我们选择附加策略,把刚刚创建好到策略添加进去
在这里插入图片描述
点击完成,就可以运行demo,点击connect进行连接测试,连接成功,进行MQTT的消息收发,这个一步在开头的官方博客有,步骤我就不复述了,到此完成,这个坑填了两天才差不多填完,总结一下,ios的也是一样的,只是参数命名不一样,要填的也是这四个东西,我稍后会把github地址贴出来以供参考,由于项目还没开发完成,后续避坑步骤会慢慢发出来

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
使用 AWS SDK C++ 连接 AWS IoT Core MQTT 协议的步骤如下: 1. 安装 AWS SDK C++:可以从 AWS 官方网站下载并安装 AWS SDK C++。 2. 配置 AWS SDK C++:在代码中导入 AWS SDK C++ 的头文件和库文件。 3. 创建 AWS IoT Core 的客户端:使用 AWS SDK C++ 创建 AWS IoT Core 的客户端对象。 4. 配置 AWS IoT Core 的连接参数:设置客户端对象的连接参数,包括证书、私钥、端点地址等。 5. 连接 AWS IoT Core:使用客户端对象连接 AWS IoT Core。 6. 订阅主题:使用客户端对象订阅需要接收的主题。 7. 发布消息:使用客户端对象发布消息到指定的主题。 下面是一段示例代码,演示如何使用 AWS SDK C++ 连接 AWS IoT Core MQTT 协议: ```c++ #include <aws/core/Aws.h> #include <aws/iot/IotClient.h> #include <aws/iot/model/ConnectRequest.h> #include <aws/iot/model/ConnectResponse.h> #include <aws/iot/model/SubscribeRequest.h> #include <aws/iot/model/SubscribeResponse.h> #include <aws/iot/model/PublishRequest.h> #include <aws/iot/model/PublishResponse.h> int main(int argc, char** argv) { Aws::SDKOptions options; Aws::InitAPI(options); // 创建 IoT Core 客户端 Aws::IoT::IoTClient iotClient; // 配置连接参数 Aws::IoT::Model::ConnectRequest connectRequest; connectRequest.SetClientId("my_client_id"); connectRequest.SetEndpoint("my_endpoint"); connectRequest.SetMqttUsername("my_username"); connectRequest.SetMqttPassword("my_password"); connectRequest.SetUseWebsocket(false); // 连接 IoT Core auto connectOutcome = iotClient.Connect(connectRequest); if (!connectOutcome.IsSuccess()) { std::cout << "Failed to connect to IoT Core: " << connectOutcome.GetError().GetMessage() << std::endl; return 1; } // 订阅主题 Aws::IoT::Model::SubscribeRequest subscribeRequest; subscribeRequest.SetTopic("my/topic"); subscribeRequest.SetQos(Aws::IoT::Model::Qos::AT_LEAST_ONCE); auto subscribeOutcome = iotClient.Subscribe(subscribeRequest); if (!subscribeOutcome.IsSuccess()) { std::cout << "Failed to subscribe to topic: " << subscribeOutcome.GetError().GetMessage() << std::endl; return 1; } // 发布消息 Aws::IoT::Model::PublishRequest publishRequest; publishRequest.SetTopic("my/topic"); publishRequest.SetQos(Aws::IoT::Model::Qos::AT_LEAST_ONCE); publishRequest.SetPayload("Hello, world!"); auto publishOutcome = iotClient.Publish(publishRequest); if (!publishOutcome.IsSuccess()) { std::cout << "Failed to publish message: " << publishOutcome.GetError().GetMessage() << std::endl; return 1; } Aws::ShutdownAPI(options); return 0; } ``` 在上面的代码中,需要将以下参数替换为实际的值: - `my_client_id`:客户端 ID。 - `my_endpoint`:AWS IoT Core 的端点地址。 - `my_username`:MQTT 用户名。 - `my_password`:MQTT 密码。 - `my/topic`:需要订阅或发布的主题。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值