测试在Linux环境下使用makefile。
使用的是openssl 作为mqtt的网络实现。
C++ SDK samples 中PubSub.cpp写的很清楚该怎么用。
本文主要讲怎么把我们想要的部分从sdk源码中分离出来。
重点:AWS iot message 负载只支持128kb 128kb 128kb 意味着图片视频数据基本上都走不了iot了
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
均使用SDK 异步API,下面操作基本上是通过topic来执行。我们可以对以下的接口进行再次封装编写自己的app。
code:
ResponseCode rc = InitializeTLS();初始化mqtt底层网络实现
初始化mqtt实例并绑定相应事件的回调函数:
2.2 publish:
topic:MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串
uint16_t packet_id_out;
util::String p_topic_name_str = ;
std::unique_ptr 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 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 = ;
std::unique_ptr p_topic_name = Utf8String::Create(p_topic_name_str);
mqtt::Subscription::ApplicationCallbackHandlerPtr p_sub_handler = std::bind(&, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
绑定回调函数
std::shared_ptr::Subscription> p_subscription = mqtt::Subscription::Create(std::move(p_topic_name), mqtt::QoS::QOS0, p_sub_handler, nullptr);
util::Vector::shared_ptr::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::SubscriptionHandlerContextData> p_app_handler_data)
我们可以从中读出我们想要的信息
2.3.2 取消订阅
uint16_t packet_id_out;
util::String p_topic_name_str = ;
std::unique_ptr p_topic_name = Utf8String::Create(p_topic_name_str);
util::Vector::unique_ptr> 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_);