文章目录
前言
一、确保开发板文件系统有下面的.so库。
STM32MP157-QT文件系统移植MQTT已经做了,即ARM Linux文件系统已经安装了对应的MQTT库,那么你的文件系统应该有下面的东西:
就是.so库
下面开始搭建工程
二、QT Creator+ ARM Linux开发MQTT程序
2.1、新建一个QT项目,这里最好选非QT项目。
新建一个QT项目,这里最好选非QT项目,这里不再细讲。
2.2、拷贝相应的库和头文件。
首先看一下paho.mqtt.c编译完了以后有哪些文件,文件还是蛮多的,MQTT基于UDP做了一些封装。
我们关心的是下面这些东西
- build/output目录下的.so库文件,
- src目录下的.h头文件,
- build/output/samples目录下是mqtt client的一些使用例子。
root@osboxes:/home/osboxes/paho.mqtt.c# tree
.
├── about.html
├── android
│ └── Android.mk
├── appveyor.yml
├── build
│ ├── output
│ │ ├── libpaho-mqtt3a.so -> libpaho-mqtt3a.so.1
│ │ ├── libpaho-mqtt3a.so.1 -> libpaho-mqtt3a.so.1.3
│ │ ├── libpaho-mqtt3a.so.1.3
│ │ ├── libpaho-mqtt3as.so -> libpaho-mqtt3as.so.1
│ │ ├── libpaho-mqtt3as.so.1 -> libpaho-mqtt3as.so.1.3
│ │ ├── libpaho-mqtt3as.so.1.3
│ │ ├── libpaho-mqtt3c.so -> libpaho-mqtt3c.so.1
│ │ ├── libpaho-mqtt3c.so.1 -> libpaho-mqtt3c.so.1.3
│ │ ├── libpaho-mqtt3c.so.1.3
│ │ ├── libpaho-mqtt3cs.so -> libpaho-mqtt3cs.so.1
│ │ ├── libpaho-mqtt3cs.so.1 -> libpaho-mqtt3cs.so.1.3
│ │ ├── libpaho-mqtt3cs.so.1.3
│ │ ├── paho_c_version
│ │ ├── samples
│ │ │ ├── MQTTAsync_publish
│ │ │ ├── MQTTAsync_subscribe
│ │ │ ├── MQTTClient_publish
│ │ │ ├── MQTTClient_publish_async
│ │ │ ├── MQTTClient_subscribe
│ │ │ ├── paho_c_pub
│ │ │ ├── paho_cs_pub
│ │ │ ├── paho_cs_sub
│ │ │ └── paho_c_sub
│ │ └── test
│ │ ├── sync_client_test
│ │ ├── test1
│ │ ├── test10
│ │ ├── test11
│ │ ├── test15
│ │ ├── test2
│ │ ├── test3
│ │ ├── test4
│ │ ├── test45
│ │ ├── test5
│ │ ├── test6
│ │ ├── test9
│ │ ├── test95
│ │ ├── test_mqtt4async
│ │ └── test_mqtt4sync
│ └── VersionInfo.h
├── build.xml
├── cbuild.bat
├── cmake
│ ├── CPackDebConfig.cmake.in
│ ├── toolchain.linux-arm11.cmake
│ ├── toolchain.win32.cmake
│ └── toolchain.win64.cmake
├── CMakeLists.txt
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── deploy_rsa.enc
├── dist
│ ├── Makefile
│ └── paho-c.spec
├── doc
│ ├── CMakeLists.txt
│ ├── DoxyfileV3AsyncAPI.in
│ ├── DoxyfileV3ClientAPI.in
│ ├── DoxyfileV3ClientInternal.in
│ ├── man
│ │ └── man1
│ │ ├── paho_c_pub.1
│ │ ├── paho_cs_pub.1
│ │ ├── paho_cs_sub.1
│ │ └── paho_c_sub.1
│ └── pahologo.png
├── edl-v10
├── epl-v20
├── LICENSE
├── Makefile
├── notice.html
├── PULL_REQUEST_TEMPLATE.md
├── README.md
├── src
│ ├── Base64.c
│ ├── Base64.h
│ ├── Clients.c
│ ├── Clients.h
│ ├── CMakeLists.txt
│ ├── Heap.c
│ ├── Heap.h
│ ├── LinkedList.c
│ ├── LinkedList.h
│ ├── Log.c
│ ├── Log.h
│ ├── Messages.c
│ ├── Messages.h
│ ├── MQTTAsync.c
│ ├── MQTTAsync.h
│ ├── MQTTClient.c
│ ├── MQTTClient.h
│ ├── MQTTClientPersistence.h
│ ├── MQTTExportDeclarations.h
│ ├── MQTTPacket.c
│ ├── MQTTPacket.h
│ ├── MQTTPacketOut.c
│ ├── MQTTPacketOut.h
│ ├── MQTTPersistence.c
│ ├── MQTTPersistenceDefault.c
│ ├── MQTTPersistenceDefault.h
│ ├── MQTTPersistence.h
│ ├── MQTTProperties.c
│ ├── MQTTProperties.h
│ ├── MQTTProtocolClient.c
│ ├── MQTTProtocolClient.h
│ ├── MQTTProtocol.h
│ ├── MQTTProtocolOut.c
│ ├── MQTTProtocolOut.h
│ ├── MQTTReasonCodes.c
│ ├── MQTTReasonCodes.h
│ ├── MQTTSubscribeOpts.h
│ ├── MQTTTime.c
│ ├── MQTTTime.h
│ ├── MQTTVersion.c
│ ├── mutex_type.h
│ ├── OsWrapper.c
│ ├── OsWrapper.h
│ ├── samples
│ │ ├── CMakeLists.txt
│ │ ├── MQTTAsync_publish.c
│ │ ├── MQTTAsync_publish_time.c
│ │ ├── MQTTAsync_subscribe.c
│ │ ├── MQTTClient_publish_async.c
│ │ ├── MQTTClient_publish.c
│ │ ├── MQTTClient_subscribe.c
│ │ ├── paho_c_pub.c
│ │ ├── paho_cs_pub.c
│ │ ├── paho_cs_sub.c
│ │ ├── paho_c_sub.c
│ │ ├── pubsub_opts.c
│ │ └── pubsub_opts.h
│ ├── SHA1.c
│ ├── SHA1.h
│ ├── SocketBuffer.c
│ ├── SocketBuffer.h
│ ├── Socket.c
│ ├── Socket.h
│ ├── SSLSocket.c
│ ├── SSLSocket.h
│ ├── StackTrace.c
│ ├── StackTrace.h
│ ├── Thread.c
│ ├── Thread.h
│ ├── Tree.c
│ ├── Tree.h
│ ├── utf-8.c
│ ├── utf-8.h
│ ├── VersionInfo.h.in
│ ├── WebSocket.c
│ └── WebSocket.h
├── test
│ ├── CMakeLists.txt
│ ├── dll-copy.cmake
│ ├── mqttsas.py
│ ├── MQTTV3112.py
│ ├── MQTTV311.py
│ ├── MQTTV5.py
│ ├── openssl
│ │ └── applink.c
│ ├── python
│ │ ├── controlVMnetworkstate.py
│ │ ├── mqttasync_module.c
│ │ ├── mqttclient_module.c
│ │ ├── setup.py
│ │ ├── test1.py
│ │ ├── test2.py
│ │ └── test_offline.py
│ ├── ssl
│ │ ├── all-ca.crt
│ │ ├── capath
│ │ │ ├── 374b031c.0 -> server.pem
│ │ │ ├── ab88c291.0 -> test-root-ca.pem
│ │ │ ├── server.pem
│ │ │ └── test-root-ca.pem
│ │ ├── client.crt
│ │ ├── client.csr
│ │ ├── client-expired.crt
│ │ ├── client-expired.csr
│ │ ├── client.key
│ │ ├── client.pem
│ │ ├── client-revoked.crt
│ │ ├── client-revoked.csr
│ │ ├── client-revoked.key
│ │ ├── crl.pem
│ │ ├── gen.sh
│ │ ├── openssl.cnf
│ │ ├── rootCA
│ │ │ ├── crlnumber
│ │ │ ├── index.txt
│ │ │ ├── index.txt.attr
│ │ │ ├── index.txt.attr.old
│ │ │ ├── index.txt.old
│ │ │ ├── newcerts
│ │ │ │ ├── 01.pem
│ │ │ │ └── 02.pem
│ │ │ ├── serial
│ │ │ └── serial.old
│ │ ├── server.crt
│ │ ├── server.csr
│ │ ├── server-expired.crt
│ │ ├── server-expired.csr
│ │ ├── server.key
│ │ ├── signingCA
│ │ │ ├── crlnumber
│ │ │ ├── crlnumber.old
│ │ │ ├── index.txt
│ │ │ ├── index.txt.attr
│ │ │ ├── index.txt.attr.old
│ │ │ ├── index.txt.old
│ │ │ ├── newcerts
│ │ │ │ ├── 01.pem
│ │ │ │ ├── 02.pem
│ │ │ │ ├── 03.pem
│ │ │ │ └── 04.pem
│ │ │ ├── serial
│ │ │ └── serial.old
│ │ ├── test-alt-ca.crt
│ │ ├── test-alt-ca.csr
│ │ ├── test-alt-ca.key
│ │ ├── test-bad-root-ca.crt
│ │ ├── test-bad-root-ca.key
│ │ ├── test-fake-root-ca.crt
│ │ ├── test-fake-root-ca.key
│ │ ├── test-root-ca.crt
│ │ ├── test-root-ca.key
│ │ ├── test-signing-ca.crt
│ │ ├── test-signing-ca.csr
│ │ └── test-signing-ca.key
│ ├── sync_client_test.c
│ ├── test10.c
│ ├── test11.c
│ ├── test15.c
│ ├── test1.c
│ ├── test2.c
│ ├── test3.c
│ ├── test45.c
│ ├── test4.c
│ ├── test5.c
│ ├── test6.c
│ ├── test8.c
│ ├── test95.c
│ ├── test9.c
│ ├── test_connect_destroy.c
│ ├── test_issue373.c
│ ├── test_mqtt4async.c
│ ├── test_mqtt4sync.c
│ ├── test_persistence.c
│ ├── test_sync_session_present.c
│ ├── thread.c
│ └── tls-testing
│ ├── Dockerfile
│ ├── keys
│ │ ├── all-ca.crt
│ │ ├── server
│ │ │ ├── server.crt
│ │ │ ├── server.key
│ │ │ ├── server-mitm.crt
│ │ │ └── server-mitm.key
│ │ ├── test-root-ca.crt
│ │ └── test-signing-ca.crt
│ ├── mosquitto.conf
│ ├── mosquitto-docker.conf
│ ├── mosquitto.psk
│ └── mosquitto.pw
├── test_package
│ ├── CMakeLists.txt
│ ├── conanfile.py
│ └── test_package.c
├── travis-build.sh
├── travis-deploy.sh
├── travis-install.sh
├── travis-setup-deploy.sh
├── version.major
├── version.minor
└── version.patch
25 directories, 256 files
把头文件和库文件拷贝到工程路径里面,
- 库文件
├── build
│ ├── output
│ │ ├── libpaho-mqtt3a.so -> libpaho-mqtt3a.so.1
│ │ ├── libpaho-mqtt3a.so.1 -> libpaho-mqtt3a.so.1.3
│ │ ├── libpaho-mqtt3a.so.1.3
│ │ ├── libpaho-mqtt3as.so -> libpaho-mqtt3as.so.1
│ │ ├── libpaho-mqtt3as.so.1 -> libpaho-mqtt3as.so.1.3
│ │ ├── libpaho-mqtt3as.so.1.3
│ │ ├── libpaho-mqtt3c.so -> libpaho-mqtt3c.so.1
│ │ ├── libpaho-mqtt3c.so.1 -> libpaho-mqtt3c.so.1.3
│ │ ├── libpaho-mqtt3c.so.1.3
│ │ ├── libpaho-mqtt3cs.so -> libpaho-mqtt3cs.so.1
│ │ ├── libpaho-mqtt3cs.so.1 -> libpaho-mqtt3cs.so.1.3
│ │ ├── libpaho-mqtt3cs.so.1.3
│ │ ├── paho_c_version
- 头文件
(其实好多的头文件这里用不上,C文件这里也用不上)
├── src
│ ├── Base64.c
│ ├── Base64.h
│ ├── Clients.c
│ ├── Clients.h
│ ├── CMakeLists.txt
│ ├── Heap.c
│ ├── Heap.h
│ ├── LinkedList.c
│ ├── LinkedList.h
│ ├── Log.c
│ ├── Log.h
│ ├── Messages.c
│ ├── Messages.h
│ ├── MQTTAsync.c
│ ├── MQTTAsync.h
│ ├── MQTTClient.c
│ ├── MQTTClient.h
│ ├── MQTTClientPersistence.h
│ ├── MQTTExportDeclarations.h
│ ├── MQTTPacket.c
│ ├── MQTTPacket.h
│ ├── MQTTPacketOut.c
│ ├── MQTTPacketOut.h
│ ├── MQTTPersistence.c
│ ├── MQTTPersistenceDefault.c
│ ├── MQTTPersistenceDefault.h
│ ├── MQTTPersistence.h
│ ├── MQTTProperties.c
│ ├── MQTTProperties.h
│ ├── MQTTProtocolClient.c
│ ├── MQTTProtocolClient.h
│ ├── MQTTProtocol.h
│ ├── MQTTProtocolOut.c
│ ├── MQTTProtocolOut.h
│ ├── MQTTReasonCodes.c
│ ├── MQTTReasonCodes.h
│ ├── MQTTSubscribeOpts.h
│ ├── MQTTTime.c
│ ├── MQTTTime.h
│ ├── MQTTVersion.c
│ ├── mutex_type.h
│ ├── OsWrapper.c
│ ├── OsWrapper.h
2.3、添加相应的头文件和库文件
这里选择外部库和内部库都是可以的,区别是外部库可以顺便把相应的头文件加进来,内部库的话得分两步
选完了之后.pro文件是这样的,可以看到添加了相应的库文件和头文件。
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += \
main.c
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/release/ -lpaho-mqtt3a
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/debug/ -lpaho-mqtt3a
else:unix: LIBS += -L$$PWD/lib/ -lpaho-mqtt3a
INCLUDEPATH += $$PWD/src
DEPENDPATH += $$PWD/src
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/release/ -lpaho-mqtt3as
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/debug/ -lpaho-mqtt3as
else:unix: LIBS += -L$$PWD/lib/ -lpaho-mqtt3as
INCLUDEPATH += $$PWD/src
DEPENDPATH += $$PWD/src
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/release/ -lpaho-mqtt3c
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/debug/ -lpaho-mqtt3c
else:unix: LIBS += -L$$PWD/lib/ -lpaho-mqtt3c
INCLUDEPATH += $$PWD/src
DEPENDPATH += $$PWD/src
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/release/ -lpaho-mqtt3cs
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/debug/ -lpaho-mqtt3cs
else:unix: LIBS += -L$$PWD/lib/ -lpaho-mqtt3cs
INCLUDEPATH += $$PWD/src
DEPENDPATH += $$PWD/src
Main.c里面添加下面的程序代码,编译,没有报错,那就是OK的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "192.168.16.56:1883"
#define CLIENTID "ExampleClientPub"
#define TOPIC "MQTT Examples"
#define PAYLOAD "Hello World!"
#define QOS 1
#define TIMEOUT 10000L
int main(int argc, char* argv[])
{
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
if ((rc = MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to create client, return code %d\n", rc);
exit(EXIT_FAILURE);
}
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
pubmsg.payload = PAYLOAD;
pubmsg.payloadlen = (int)strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
if ((rc = MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to publish message, return code %d\n", rc);
exit(EXIT_FAILURE);
}
printf("Waiting for up to %d seconds for publication of %s\n"
"on topic %s for client with ClientID: %s\n",
(int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message with delivery token %d delivered\n", token);
if ((rc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS)
printf("Failed to disconnect, return code %d\n", rc);
MQTTClient_destroy(&client);
return rc;
}