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_);
版权声明:本文为博主原创文章,未经博主允许不得转载。

从发布新版本 看Intel为何投资WebRTC?

从发布新版本 看Intel为何投资WebRTC? 复制链接 打印 2015年11月13日00:12 | 我来说两句(人参与) | 保存到博客 ...
  • ljh081231
  • ljh081231
  • 2018年01月22日 15:05
  • 38

ESP8266模块使用完整教程

在我入门ESP8266小黄板的过程中,过程是艰难的,因为网络上的资料太多太乱,官网上的资料不算太完备,而在技术交流群里面的就更乱了,所以想按自己学习所总结到的经验来分享给大家。资源链接:http://...
  • sherry_qin
  • sherry_qin
  • 2016年03月16日 11:29
  • 50575

AWS IoT 常见问题

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

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

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

PlatformIO IDE搭建统一的物联网嵌入式开发环境

物联网越来越成为炙手可热的领域,不过提到嵌入式IoT开发,最让人不舒服的一件事无疑就是不同厂家的芯片可能要使用不同的集成开发环境。例如:STM32要使用Keil,Arduino默认使用自家Arduin...
  • gu332523602
  • gu332523602
  • 2017年09月04日 14:17
  • 592

在英特尔® 凌动™ 平台上进行 Android* 应用开发和优化

zhege 原文地址:http://blog.csdn.net/x86android/article/details/19902261
  • yazhouren
  • yazhouren
  • 2014年05月06日 16:04
  • 906

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

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

ESP32 连接 AWS IOT

ESP32 连接 AWS IOT 首先提供源码吧,别说了:GitHub源码地址
  • qq_27114397
  • qq_27114397
  • 2018年01月12日 12:28
  • 126

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
  • 357

国外物联网平台初探(一) ——亚马逊AWS IoT

平台定位 AWS IoT是一款托管的云平台,使互联设备可以轻松安全地与云应用程序及其他设备交互。AWS IoT可支持数十亿台设备和数万亿条消息,并且可以对这些消息进行处理并将其安全可靠地路由至 ...
  • u011596455
  • u011596455
  • 2017年09月10日 20:51
  • 424
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AWS IOT C++ SDK 使用
举报原因:
原因补充:

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