测试在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_);
Logo

更多推荐