概述
Qt开发MQTT程序有两种方式,一个是Qt官方提供的基于MQTT的封装,一个是第三方(EMQ)开发的用于Qt调用MQTT的接口,二者使用方法大同小异,并且均提供了源码。最好使用Qt官方提供的封装来使用MQTT。
下载
Qt官方在github上提供了源代码,地址:https://github.com/qt/qtmqtt
mqtt源码版本要跟自己qt版本相同,不然会有各种问题,我这边下载了qtmqtt 5.12.12版本。
编译源码
如果你的是linux或者ARM也是如此编译,但是如果是ARM板子,需要先配置交叉编译环境,配置交叉编译环境可以看我以往的文章。https://blog.csdn.net/qq_42851716/article/details/124447518 。
然后编译完成以后window版本会有*.dll的库文件,
此时需要把mqtt编译后的库文件和头文件加入到qt安装目录里面,也可以单独在工程里面添加。
这里添加到工程目录,首先将mqtt头文件全部提取。
然后新建文件夹QtMqtt,将刚刚提取的.h文件全部复制到文件夹内,
最后将头文件添加到QT安装路径的 D:\QT5.12.12\5.12.12\mingw73_64\include
然后把 mqtt库文件添加到 D:\QT5.12.12\5.12.12\mingw73_64\lib
在工程中使用
添加OpenSSL,也是重头戏
所属模块:QT += network
由于关于QT的SSL资料网上不多,也是我写这篇文章的原因,关于SSL的介绍这里就赘述了,QtMqtt的SSL看官网文档介绍也是支持的,但是没有集成SSL的库文件,所以需要我们下载openssl的库文件,添加到qt安装目录。
QT的官方文档:
https://doc.qt.io/archives/qt-5.12/ssl.html
https://doc.qt.io/archives/qt-5.5/opensslsupport.html
下载openssl库文件
验证是否支持SSL ,在QT中看 QSslSocket::supportsSsl()返回的是true还是false,如果是false,也就是qt没有找到SSL库文件,
首先查看你QT的SSL版本,使用
qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString(); // 输出当前QT支持的openSSL版本
我的ssl版本,"OpenSSL 1.1.1k。到 :https://www.openssl.org/官网下载openssl对应的版本文件。
下载安装有两种方式:
通过源码编译,直接在官网下载源码编译即可,优点是安全,全版本都有,缺点是费事。具体步骤参考:
QT支持https及编译OpenSSL
使用第三方编译好的安装包:优点是省事,缺点是无法确定发布者是否可靠、版本不全。具体步骤参考:Qt 连接 https :解决OpenSSL问题
我这边下载的是
配置SSL
当下载好openssl库以后,将.dll的库文件添加到本地qt安装目录库,D:\QT5.12.12\5.12.12\mingw73_64\bin
然后再 qDebug() << QSslSocket::supportsSsl(); 返回true,说明配置完成。
测试
使用开源的MQTT服务器做测试 :https://test.mosquitto.org/
到mosquitto下载证书,
然后配置
const QByteArray pem_mos = R"(-----BEGIN CERTIFICATE-----
MIIEAzCCAuugAwIBAgIUBY1hlCGvdj4NhBXkZ/uLUZNILAwwDQYJKoZIhvcNAQEL
BQAwgZAxCzAJBgNVBAYTAkdCMRcwFQYDVQQIDA5Vbml0ZWQgS2luZ2RvbTEOMAwG
A1UEBwwFRGVyYnkxEjAQBgNVBAoMCU1vc3F1aXR0bzELMAkGA1UECwwCQ0ExFjAU
BgNVBAMMDW1vc3F1aXR0by5vcmcxHzAdBgkqhkiG9w0BCQEWEHJvZ2VyQGF0Y2hv
by5vcmcwHhcNMjAwNjA5MTEwNjM5WhcNMzAwNjA3MTEwNjM5WjCBkDELMAkGA1UE
BhMCR0IxFzAVBgNVBAgMDlVuaXRlZCBLaW5nZG9tMQ4wDAYDVQQHDAVEZXJieTES
MBAGA1UECgwJTW9zcXVpdHRvMQswCQYDVQQLDAJDQTEWMBQGA1UEAwwNbW9zcXVp
dHRvLm9yZzEfMB0GCSqGSIb3DQEJARYQcm9nZXJAYXRjaG9vLm9yZzCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAME0HKmIzfTOwkKLT3THHe+ObdizamPg
UZmD64Tf3zJdNeYGYn4CEXbyP6fy3tWc8S2boW6dzrH8SdFf9uo320GJA9B7U1FW
Te3xda/Lm3JFfaHjkWw7jBwcauQZjpGINHapHRlpiCZsquAthOgxW9SgDgYlGzEA
s06pkEFiMw+qDfLo/sxFKB6vQlFekMeCymjLCbNwPJyqyhFmPWwio/PDMruBTzPH
3cioBnrJWKXc3OjXdLGFJOfj7pP0j/dr2LH72eSvv3PQQFl90CZPFhrCUcRHSSxo
E6yjGOdnz7f6PveLIB574kQORwt8ePn0yidrTC1ictikED3nHYhMUOUCAwEAAaNT
MFEwHQYDVR0OBBYEFPVV6xBUFPiGKDyo5V3+Hbh4N9YSMB8GA1UdIwQYMBaAFPVV
6xBUFPiGKDyo5V3+Hbh4N9YSMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADggEBAGa9kS21N70ThM6/Hj9D7mbVxKLBjVWe2TPsGfbl3rEDfZ+OKRZ2j6AC
6r7jb4TZO3dzF2p6dgbrlU71Y/4K0TdzIjRj3cQ3KSm41JvUQ0hZ/c04iGDg/xWf
+pp58nfPAYwuerruPNWmlStWAXf0UTqRtg4hQDWBuUFDJTuWuuBvEXudz74eh/wK
sMwfu1HFvjy5Z0iMDU8PUDepjVolOCue9ashlS4EB5IECdSR2TItnAIiIwimx839
LdUdRudafMu5T5Xma182OC0/u/xRlEm+tvKGGmfFcN0piqVl8OrSPBgIlb+1IKJE
m/XriWr/Cq4h/JfB7NTsezVslgkBaoU=
-----END CERTIFICATE-----
)";
QSslCertificate cert = QSslCertificate(pem_mos,QSsl::Pem);
QSslSocket::addDefaultCaCertificate(cert);
mqtt->setHostname("test.mosquitto.org"); //
mqtt->setPort(8883); //8883
mqtt->setUsername("xxx");
mqtt->setPassword("xxxx");
mqtt->setKeepAlive(10); // 心跳
// mqtt->connectToHost(); // 连接服务器 不带SSL
mqtt->connectToHostEncrypted(); //加密SSL
总结
到这里终于实现了SS来加密,不用的QT版本connectToHostEncrypted();参数形式不同,具体的还是要参考QT官方文档。
其实有几种方法:
1、可以全局设置证书,以便所有 QSslSocket 默认使用它:
QSslCertificate cert = QSslCertificate(...);
QSslSocket::addDefaultCaCertificate(cert);
QMqttClient client;
client.setHostname(...);
client.setPort(...);
// ...
client.connectToHostEncrypted();
2、可以使用 QSslConfiguration 来设置证书和/或私钥:文章来源:https://www.toymoban.com/news/detail-791694.html
QSslCertificate cert = QSslCertificate(...);
QSslConfiguration conf;
conf.setCaCertificates({cert});
// conf.setPrivateKey();
QSslConfiguration::setDefaultConfiguration(conf);
QMqttClient client;
client.setHostname(...);
client.setPort(...);
// ...
client.connectToHostEncrypted();
我使用的是第一种方式,测试成功。文章来源地址https://www.toymoban.com/news/detail-791694.html
到了这里,关于QtMqtt使用SSL加密协议传输教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!