AWS IOT C++ SDK 使用

原创 2018年01月30日 20:13:55

测试在Linux环境下使用makefile。
使用的是openssl 作为mqtt的网络实现。

C++ SDK samples 中PubSub.cpp写的很清楚该怎么用。
本文主要讲怎么把我们想要的部分从sdk源码中分离出来。

重点:AWS iot message 负载只支持128kb 128kb 128kb 意味着图片视频数据基本上都走不了iot了

1 构建工程环境

整个工程目录结构:
这里写图片描述

1.1 头文件处理
建立include文件夹 并把c++ sdk 我们编译成功的源码中的include拷贝过来。
将openssl生成的include改名为openssl也放到该目录下。

1.2 lib 目录处理
建立lib目录 并把c++ sdk 我们编译成功的源码/build/archive的静态库拷贝过来。
将openssl目录下lib中的库文件也拷贝进来。

1.3 src目录处理
将c++ sdk目录下的common目录放到src目录下。
将c++ sdk目录下的/network下的openssl放到src目录下。
将C++ sdk目录下的samples/PubSub目录下的PubSub.cpp 和 PubSub.hpp 放到对应的src和include下。
我们将参照sample进行测试实现。

1.4 编写makefile
Lib 链接顺序:

LIBS=-L$(LIB_DIR)
LIBS+= -lssl
LIBS+= -lcrypto
LIBS+= -laws-iot-sdk-cpp
LIBS+= -lgmock
LIBS+= -lgmock_main
LIBS+= -lgtest
LIBS+= -lgtest_main

头文件引用顺序

CFLAGS += -I$(INC_DIR)/include -I$(INC_DIR)/openssl -I$(INC_DIR)/OpenSSL -I$(INC_DIR)/src/common -I$(INC_DIR)/discovery -I$(INC_DIR)/mqtt -I$(INC_DIR)/shadow -I$(INC_DIR)/util -I$(INC_DIR)/util/logging -I$(INC_DIR)/util/memory/stl -I$(INC_DIR)/util/threading 
CFLAGS += -I$(INC_DIR)/src/common -I$(INC_DIR)/src/OpenSSL

src编译顺序

APP_SRC += ./src/OpenSSL/OpenSSLConnection.cpp
APP_SRC += ./src/OpenSSL/OpenSSLConnection.cpp
APP_SRC += ./src/common/ConfigCommon.cpp
APP_SRC += ./src/PubSub.cpp
APP_SRC += ./test_main.cpp

2 使用C++ sdk API

均使用SDK 异步API,下面操作基本上是通过topic来执行。我们可以对以下的接口进行再次封装编写自己的app。

2.1 Connect
这里写图片描述

code:
ResponseCode rc = InitializeTLS();初始化mqtt底层网络实现
初始化mqtt实例并绑定相应事件的回调函数:
这里写图片描述

2.2 publish:
topic:MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串

uint16_t packet_id_out;
util::String p_topic_name_str = <topic>;
std::unique_ptr<Utf8String> p_topic_name = Utf8String::Create(p_topic_name_str);
rc = p_client->PublishAsync(std::move(p_topic_name), false, false, mqtt::QoS::QOS1, payload, packet_id_out);

* @param p_topic_name on which the publish is performed(publish的topic)
* @param is_retained last message is retained
* @param is_duplicate is a duplicate message
* @param qos quality of service(服务质量 即对这次传输要求的等级)
* @param payload MQTT message payload(mqtt传输的内容 )
* @param p_async_ack_handler the ack handling function(qos==1 时发送成功触发的回调函数)
* @param packet_id_out packet ID of the message being sent (再一次session中用来标识发送的数据包)
* @return ResponseCode indicating status of request

code:

util::String p_topic_name_str = "baisc0";
uint16_t packet_id = 0;
//util::String payloadSend = payload; 
util::String payloadSend = "hello world"; 
std::unique_ptr<Utf8String> p_topic_name = Utf8String::Create(p_topic_name_str);
ResponseCode rc = p_iot_client_->PublishAsync(std::move(p_topic_name), false, false, mqtt::QoS::QOS1,
payloadSend, PublishSuccessCallback, packet_id);

使用中遇到的问题:因为这个API是异步的 ,在使用有种表现为你不能在调用一次后还没有成功发送,又马上调用,这样mqtt订阅端一条消息都收不到。 而同步api 并不会存在这个问题,这个问题应该可以通过qos=1发布成功回调函数进行处理。
2.3 订阅
2.3.1 订阅

uint16_t packet_id_out;
util::String p_topic_name_str = <topic>;
std::unique_ptr<Utf8String> p_topic_name = Utf8String::Create(p_topic_name_str);
mqtt::Subscription::ApplicationCallbackHandlerPtr p_sub_handler = std::bind(&<handler>, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);

绑定回调函数

std::shared_ptr<mqtt::Subscription> p_subscription = mqtt::Subscription::Create(std::move(p_topic_name), mqtt::QoS::QOS0, p_sub_handler, nullptr);
util::Vector<std::shared_ptr<mqtt::Subscription>> topic_vector;
topic_vector.push_back(p_subscription);
rc = p_client->SubscribeAsync(topic_vector, nullptr, packet_id_out);

订阅

回调函数声明:

ResponseCode PubSub::SubscribeCallback(util::String topic_name, util::String payload,std::shared_ptr<mqtt::SubscriptionHandlerContextData> p_app_handler_data) 

我们可以从中读出我们想要的信息

2.3.2 取消订阅

uint16_t packet_id_out;
util::String p_topic_name_str = <topic>;
std::unique_ptr<Utf8String> p_topic_name = Utf8String::Create(p_topic_name_str);
util::Vector<std::unique_ptr<Utf8String>> topic_vector;
topic_vector.push_back(std::move(p_topic_name));
rc = p_client->Subscribe(topic_vector, packet_id_out);

2.4 disconnect:

virtual ResponseCode Disconnect(std::chrono::milliseconds action_response_timeout);

code:

ResponseCode rc = p_iot_client_->Disconnect(ConfigCommon::mqtt_command_timeout_);
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37263637/article/details/79210194

AWS IoT 常见问题

介绍 问:什么是 AWS IoT? AWS IoT 是一款托管的云平台,使互联设备可以轻松安全地与云应用程序及其他设备交互。AWS IoT 可支持数十亿台设备和数万亿条消息,并且可以对这些消息进行处理...
  • m0_37204491
  • m0_37204491
  • 2017-06-02 11:44:12
  • 2572

AWS IoT 限制

http://docs.aws.amazon.com/zh_cn/general/latest/gr/aws_service_limits.html AWS IoT 限制 ...
  • whatnamecaniuse
  • whatnamecaniuse
  • 2017-09-22 18:39:39
  • 590

golang 开源项目全集

一直更新中,地址:https://github.com/golang/go/wiki/Projects#zeromq Indexes and search engines These si...
  • yangyangye
  • yangyangye
  • 2017-06-22 09:19:00
  • 3328

交叉编译AWS IOT C++ SDK及环境测试

开始前 先强烈建议 登录控制台走一遍亚马逊的引导流程,并用nodejs版 在你ubuntu上跑一边,把策略文件生成了。并了解如何创建事物(设备)文档:https://docs.aws.amazon.c...
  • m0_37263637
  • m0_37263637
  • 2018-01-30 19:47:33
  • 628

物联网平台概览 - Amazon, Microsoft, IBM IoT 解决方案概述

物联网平台概览 - Amazon, Microsoft, IBM IoT 解决方案概述 最近研究了一些物联网平台技术资料,以做选型参考。脑子里积累大量信息,便想写出来做一些普及。作为科普文章,力争...
  • franklfeng
  • franklfeng
  • 2017-08-19 23:27:09
  • 2352

C++与C之间相互接口和库函数调用

1 C++中调用C的接口我们在阅读一些库的代码的时候, 经常看到有些函数被extern “C”来修饰1.1 extern “C”引入C的库代码如下所示extern "C" void func()...
  • gatieme
  • gatieme
  • 2016-10-04 00:12:44
  • 5502

AWSSDK.dll

  • 2011年12月23日 10:22
  • 1.61MB
  • 下载

IoT

背景对IoT(Internet of Things, 物联网)平台进行调研,调研对象有:亚马逊的AWS IoT 和 阿里智能AWS IoT 主页: https://aws.amazon.com/c...
  • chj90220
  • chj90220
  • 2016-06-21 16:36:15
  • 1481

亚马逊云物联网AWS IoT初体验

AWS IoT 是一款托管的云平台,使互联设备可以轻松安全地与云应用程序及其他设备交互。AWS IoT 可支持数十亿台设备和数万亿条消息,并且可以对这些消息进行处理并将其安全可靠地路由至 AWS 终端...
  • jo_joe
  • jo_joe
  • 2017-09-14 09:16:52
  • 1354

ESP32 连接 AWS IOT

ESP32 连接 AWS IOT 首先提供源码吧,别说了:GitHub源码地址
  • qq_27114397
  • qq_27114397
  • 2018-01-12 12:28:08
  • 468
收藏助手
不良信息举报
您举报文章:AWS IOT C++ SDK 使用
举报原因:
原因补充:

(最多只允许输入30个字)