基于QT的IOT物联网MQTT工具实现
前言
采用QT编写IOT物联网MQTT工具,实现IOT设备的数据发布与订阅。
一、界面UI
UI部分包含MQTT的连接信息输入、订阅主题及数据、发布主题及数据。
二、项目树
整个工程包含两个工具类(二进制转换工具类、MQTT工具类、窗口类、主函数和UI)。
三、工具类
MQTT工具的实现涉及到一些二进制数据的转换以及mqtt的数据订阅与发布、服务器连接等,分别将其封装为工具类,以方便修改和后续项目复用。
1. 二进制工具类
二进制的转换包含ASCII二进制数据转换为ASCII字符串与16进制字符串转QByteArray。
a) 头文件
#ifndef UTILS_H
#define UTILS_H
#include <QString>
#include <QDebug>
#include <QByteArray>
class Utils
{
public:
Utils();
/**
* @brief ASCII二进制数据转换为ASCII字符串
* @param byteData
* @return
*/
static QString bytes2ASCIIStr(const QByteArray byteData);
/**
* @brief 16进制字符串转QByteArray
* @param hexStr
* @return
*/
static QByteArray hexStr2ByteArray(QString hexStr);
};
#endif // UTILS_H
b) cpp文件
#include "utils.h"
Utils::Utils()
{
}
QString Utils::bytes2ASCIIStr(const QByteArray byteData)
{
QString temp = "";
for (int i = 0; i < byteData.size(); ++i)
{
if(byteData[i]==0)
continue;
temp += QChar(byteData.at(i));
// qDebug() << QChar(byteData.at(i));
}
return temp;
}
QByteArray Utils::hexStr2ByteArray(QString hexStr)
{
bool ok;
QByteArray ret;
hexStr = hexStr.trimmed();
hexStr = hexStr.simplified();
for(int i = 0;i<hexStr.length();i+=2){
char c = hexStr.mid(i,2).toInt(&ok,16)&0xFF;
if(ok){
ret.append(c);
}
}
return ret;
}
2. MQTT工具类
MQTT工具类包含服务器连接、数据订阅与发布等功能。
a) 头文件
#ifndef MQTTUTIL_H
#define MQTTUTIL_H
#include <QObject>
#include <qmqttclient.h>
#include <QString>
#include <QDebug>
#include <QByteArray>
class MqttUtil:public QObject
{
Q_OBJECT
public:
MqttUtil();
~MqttUtil();
/**
* @brief 连接
* @param hostName 服务器IP
* @param port 服务器端口
* @param userName 用户名
* @param passWord 密码
* @param clientId 客户端ID
* @param topicPub 发布主题
* @param topicSub 订阅主题
*/
void connect(QString hostName, int port, QString userName, QString passWord, QString clientId,
QString topicPub, QString topicSub);
/**
* @brief 连接
* @param hostName 服务器IP
* @param port 服务器端口
* @param userName 用户名
* @param passWord 密码
* @param clientId 客户端ID
*/
void connect(QString hostName, int port, QString userName, QString passWord, QString clientId);
/**
* @brief 断开连接
*/
void disconnected();
/**
* @brief 发布
* @param byteData 发送数据
*/
void publish(QByteArray byteData);
/**
* @brief 发布
* @param topic 发送主题
* @param byteData 发送数据
*/
void publish(QString topic,