我是靠谱客的博主 干净香氛,最近开发中收集的这篇文章主要介绍Liunx下用C++实现MQTT的接收与发送环境准备封装mqtt的C++版本库MQTT数据订阅端MQTT数据发布端测试结果,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
继续上次《Liunx下用C语言实现MQTT的接收与发送(上)(下)》,本人探寻了如何基于paho.mqtt.c库开发C++版本的MQTT。事实上,paho官网有paho.mqtt.c++库,不过笔者进去后玩不怎么转,可能是笔者不太灵光。
环境准备
笔者忽然想到,在《Liunx下用C语言实现MQTT的接收与发送(上)》中,好像安装了些mqtt的动态库,他们是啥情况呢?
本人推断是封装了,在src里面,被我之前排除的库文件。简单测试调用了一下,还真是。
因此,本人又开始封装了。(这里的脑回路太漫长了,几句话也说不清楚,这MQTT任务倒腾了我三天半终于结束了)。
封装mqtt的C++版本库
mqtt.h:
#ifndef MQTT_H
#define MQTT_H
#include <MQTTAsync.h>
#include <string>
using namespace std;
class MQTT {
public:
bool useSSL;
//实例 ID,购买后从控制台获取
string instanceId;
//接入点域名,从控制台获取
string host;
//客户端使用的 GroupID,从控制台申请
string groupId;
//客户端 ClientID 的后缀,由业务自行指定,只需要保证全局唯一即可
string deviceId;
//账号 AccessKey,从账号控制台获取
string accessKey;
//账号 SecretKey,从账号控制台获取
string secretKey;
//使用的协议端口,默认 tcp 协议使用1883,如果需要使用 SSL 加密,端口设置成8883,具体协议和端口参考文档链接https://help.aliyun.com/document_detail/44867.html?spm=a2c4g.11186623.6.547.38d81cf7XRnP0C
int port = 1883;
//测试收发消息的 Topic
string topic;
int (*messageArrived)(void *context, char *topicName, int topicLen, MQTTAsync_message *m);
void (*onConnectFailure)(void *context, MQTTAsync_failureData *response);
void (*onSubcribe)(void *context, MQTTAsync_successData *response);
void (*onConnectServer)(void *context, MQTTAsync_successData *response);
void (*onConnectClient)(void *context, MQTTAsync_successData *response);
void (*onDisconnect)(void *context, MQTTAsync_successData *response);
void (*onPublishFailure)(void *context, MQTTAsync_failureData *response);
void (*onPublish)(void *context, MQTTAsync_successData *response);
void (*connectionLost)(void *context, char *cause);
MQTT();
void init(void);
int subscript_connect(void);
int subscript_disconnect(void);
int publish_connect(void);
int publish_send(char *msg);
int publish_disconnect(void);
MQTTAsync client;
char clientIdUrl[64];
char passWord[100];
char userName[128];
int connected;
};
#endif
mqtt.cpp:
#include <signal.h>
#include <memory.h>
#include <stdlib.h>
#if defined(WIN32)
#define sleep Sleep
#else
#include <unistd.h>
#include <openssl/hmac.h>
#include <openssl/bio.h>
#endif
#include "mqtt.h"
MQTT::MQTT()
{
instanceId = "mqtt-cn-oew1w1cq50a";
host = "localhost";// ip地址
groupId = "GID_DEVICE";
deviceId = "fs1704";
accessKey = "LTAI4G6gf4KQpMTmMEsaf6oF";
secretKey = "pwAzZb7DFMjju3TYI5lmcShw2nlZUs";
topic = "MQTT/test";
port = 1883;
connected = 0;
useSSL = false;
}
void MQTT::init(void)
{
char tempData[100];
int len = 0;
printf("mqtt:init:topic:%s:deviceId:%sn", topic.c_str(), deviceId.c_str());
//ClientID要求使用 GroupId 和 DeviceId 拼接而成,长度不得超过64个字符
snprintf(clientIdUrl, 64, "%s@@@%s", groupId.c_str(), deviceId.c_str());
//username和 Password 签名模式下的设置方法,参考文档 https://help.aliyun.com/document_detail/48271.html?spm=a2c4g.11186623.6.553.217831c3BSFry7
HMAC(EVP_sha1(), (unsigned char *)secretKey.c_str(), strlen(secretKey.c_str()), (const unsigned char *)clientIdUrl, strlen(clientIdUrl), (unsigned char *)tempData, (unsigned int *)&len);
int passWordLen = EVP_EncodeBlock((unsigned char *) passWord, (const unsigned char *)tempData, len);
passWord[passWordLen] = '