0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式Linux下QT移植MQTT的方法

CHANBAEK ? 來(lái)源:嵌入式大本營(yíng) ? 作者:小小飛飛哥 ? 2023-05-23 15:45 ? 次閱讀

環(huán)境:

Ubuntu18.04

開(kāi)發(fā)板:debian

交叉編譯工具鏈:arm-linux-gnueabihf-gcc 8.3.0

Qt:Qt5.11.2

解決方案在文末,如不想看中間過(guò)程,可直接跳轉(zhuǎn)到文末。

mqtt是一種工業(yè)物聯(lián)網(wǎng)協(xié)議,可以用來(lái)連接阿里云、百度云、onenet等云端,應(yīng)用廣泛。

關(guān)于mqtt的使用,網(wǎng)上資料主要有以下幾種:

1、STM32+ESP8266:這種方式主要是借助ESP8266模塊來(lái)聯(lián)網(wǎng),至于mqtt協(xié)議基本上是要自己實(shí)現(xiàn)的。 也就是mqtt的報(bào)文需要自己去構(gòu)建,好在mqtt的報(bào)文并不是很復(fù)雜,稍微研究一下也能理解。

2、Linux下使用官方sdk包,比如阿里云有提供阿里的sdk包,下載后調(diào)用它提供的接口來(lái)連接阿里云。

3、QT里移植mqtt:這種方式因?yàn)榭梢灾苯诱{(diào)用官方寫(xiě)好的接口,因此使用起來(lái)就簡(jiǎn)單多了,但是這個(gè)移植過(guò)程并不是那么簡(jiǎn)單。 這分為Windows端和Linux端。 Windows端就不說(shuō)了,我主要說(shuō)一下Ubuntu下和arm開(kāi)發(fā)板上的移植。

移植也分為兩種,一種是編譯成動(dòng)態(tài)鏈接庫(kù),一種是直接把mqtt官方源碼包含進(jìn)去自己的工程里面,然后一起編譯。 我本人覺(jué)得要編譯成庫(kù),然后配置環(huán)境變量什么的比較麻煩,還不如直接把源碼包含進(jìn)去。

先說(shuō)Ubuntu下的移植:

這個(gè)我是參考網(wǎng)上的,Linux Qt下MQTT模塊的導(dǎo)入(移植)

按照這篇博客來(lái)操作,實(shí)測(cè)有效,總結(jié)起來(lái)非常簡(jiǎn)單,就是下載源碼,添加到自己的工程中,然后編譯,編譯出錯(cuò)的都是因?yàn)轭^文件包含的時(shí)候,應(yīng)該把<>替換成"",這兩種頭文件包含的區(qū)別相信大家都很清楚。

這樣就移植好了。 可以看到,在這里使用gcc編譯可以通過(guò),并且寫(xiě)個(gè)簡(jiǎn)單的測(cè)試代碼,確實(shí)能連接云端

圖片

接下來(lái)說(shuō)一下移植到arm端:

這部分網(wǎng)上的資料是真的少,搜索半天都找不到你想要的。

我們知道,要移植到arm開(kāi)發(fā)板上面,需要使用交叉編譯工具鏈,正常情況下,你寫(xiě)好的qt程序在主機(jī)Ubuntu上能運(yùn)行,只要換成交叉編譯工具編譯,就可以放到開(kāi)發(fā)板上運(yùn)行了。

但是這里你這樣做會(huì)發(fā)現(xiàn)報(bào)錯(cuò)。

圖片

提示QSslConfiguration這種類型不認(rèn)識(shí)(未定義)。于是我就去找一下這個(gè)在哪里有定義,找了一下,發(fā)現(xiàn)這種類型其實(shí)在qsslconfiguration.h這個(gè)文件中是有定義的,但是前面通過(guò)#ifndef QT_NO_SSL這個(gè)宏沒(méi)有把這段代碼編譯進(jìn)去

圖片

于是真相大白了,在gcc里沒(méi)有那個(gè)宏定義,所以下面那段代碼會(huì)被編譯,所以自然就不會(huì)出現(xiàn)未定義這種錯(cuò)誤。但是當(dāng)使用交叉編譯工具鏈的時(shí)候,在qtnetwork-config.h這個(gè)文件中找到了這個(gè)宏定義,所以#ifndef QT_NO_SSL 到#endif之間的代碼都不會(huì)被編譯,自然QSslConfiguration就會(huì)未定義了。

圖片

于是我猜想,把qtnetwork-config.h中的這個(gè)QT_NO_SSL宏給注釋掉,應(yīng)該就可以了,雖然 說(shuō)這樣亂改代碼可能導(dǎo)致一些意想不到的結(jié)果,但我還是想試一下看能不能編譯通過(guò)。結(jié)果發(fā)現(xiàn)會(huì)出現(xiàn)一連串的連鎖反應(yīng),改了這個(gè),又會(huì)出現(xiàn)新的錯(cuò)誤,所以這種方法不行。而且像這種文件它默認(rèn)是只讀的,也就是說(shuō)它本來(lái)就不希望你去修改,所以不應(yīng)該這樣做。

后面我又想,既然直接改變宏定義不行,能不能把報(bào)錯(cuò)的地方直接注釋掉,反正那些函數(shù)可能并沒(méi)有用到,所以注釋掉應(yīng)該不會(huì)有什么影響

圖片

這里是報(bào)錯(cuò)的那個(gè)類的頭文件,再切換到源文件

圖片

發(fā)現(xiàn)都是沒(méi)有編譯的,但是仔細(xì)觀察源文件,其實(shí)也是有QT_NO_SSL這個(gè)宏的

這里就讓人覺(jué)得很奇怪了,同樣是有這個(gè)宏,其他的地方都不會(huì)被編譯,這里卻會(huì)被編譯,而且其他地方都可以跳轉(zhuǎn)到qtnetwork-config.h文件中去,這里卻不會(huì)。

圖片

那么,很容易猜到,在這個(gè)源文件里沒(méi)有包含qtnetwork-config.h這個(gè)頭文件,導(dǎo)致沒(méi)有定義那個(gè)宏。

解決辦法:在qmqtt_ssl_socket_p.h文件中添加一句代碼:

#include "qtnetwork-config.h"

圖片

問(wèn)題成功解決。把編譯好的文件放在arm開(kāi)發(fā)板上,可以成功執(zhí)行

圖片

圖片

至此,移植結(jié)束,可以盡情開(kāi)發(fā)了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11212

    瀏覽量

    208721
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    376

    瀏覽量

    28098
  • Ubuntu
    +關(guān)注

    關(guān)注

    5

    文章

    559

    瀏覽量

    29503
  • 工業(yè)物聯(lián)網(wǎng)

    關(guān)注

    25

    文章

    2357

    瀏覽量

    63600
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    647

    瀏覽量

    22392
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式linux部署qt的幾個(gè)疑問(wèn)

    QT程序不能直接在嵌入式linux里跑(這里指ARM平臺(tái));Windows做交叉編譯需要使用插件,有點(diǎn)多余,直接用linux虛擬機(jī)做交叉編譯;嵌入式
    發(fā)表于 10-27 09:47

    基于QT嵌入式linux圖形應(yīng)用軟件設(shè)計(jì)

    嵌入式linux開(kāi)發(fā)環(huán)境搭建、嵌入式linux開(kāi)發(fā)模型、linux內(nèi)核移植和文件系統(tǒng)、
    發(fā)表于 11-05 08:11

    嵌入式LinuxQT移植mqtt的步驟教程

    環(huán)境:Ubuntu18.04開(kāi)發(fā)板:debian交叉編譯工具鏈:arm-linux-gnueabihf-gcc 8.3.0QtQt5.11.2解決方案在文末,如不想看中間過(guò)程,可直接跳轉(zhuǎn)到文末
    發(fā)表于 12-27 06:50

    嵌入式Linux系統(tǒng)的移植研究

    介紹嵌入式系統(tǒng)和嵌入式系統(tǒng)中的GUI , 詳細(xì)說(shuō)明三種常見(jiàn)的嵌入式GUI (Microwindows、MiniGUI 和QT)的設(shè)計(jì)結(jié)構(gòu)和使用上的優(yōu)缺點(diǎn), 描述Microwindows
    發(fā)表于 04-24 10:43 ?23次下載

    基于Qt嵌入式Linux通訊簿程序設(shè)計(jì)

      摘 要: 隨著嵌入式系統(tǒng)的發(fā)展,在Linux 使用Qt 開(kāi)發(fā)嵌入式應(yīng)用程序是嵌入式圖形用戶
    發(fā)表于 11-23 11:31 ?3573次閱讀

    嵌入式linux GUI-Qt解析

    職業(yè)培訓(xùn)班》二期課程中嵌入式linux應(yīng)用開(kāi)發(fā)方面的重要內(nèi)容。不少學(xué)員對(duì)QT方面的內(nèi)容比較關(guān)注,所以在這里我們先對(duì)QT做一簡(jiǎn)單介紹。
    發(fā)表于 11-01 16:53 ?1次下載

    基于嵌入式LinuxQt編程實(shí)現(xiàn)數(shù)碼相框的設(shè)計(jì)

    基于Linux使用Qt編寫(xiě)的數(shù)碼相框架構(gòu)設(shè)計(jì)方案通過(guò)使用純C++語(yǔ)言開(kāi)發(fā)來(lái)支持嵌入式Linux系統(tǒng),采用
    的頭像 發(fā)表于 03-05 08:05 ?3241次閱讀

    基于嵌入式Linux系統(tǒng)Mini GUI的移植方法與過(guò)程詳解

    的結(jié)構(gòu)和特點(diǎn),描述了將MiniGUI在ARM Linux移植方法與過(guò)程,并對(duì)這種基于MiniGUI的嵌入式系統(tǒng)開(kāi)發(fā)做了展望。
    發(fā)表于 09-12 16:22 ?3625次閱讀

    嵌入式LINUXQt開(kāi)發(fā)入門(mén)教程

    嵌入式LINUXQt開(kāi)發(fā)入門(mén)教程(最好的嵌入式開(kāi)發(fā)板)-該文檔為嵌入式LINUX
    發(fā)表于 08-04 11:01 ?30次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>LINUX</b>的<b class='flag-5'>Qt</b>開(kāi)發(fā)入門(mén)教程

    嵌入式linux安裝qt

    QT程序不能直接在嵌入式linux里跑(這里指ARM平臺(tái));Windows做交叉編譯需要使用插件,有點(diǎn)多余,直接用linux虛擬機(jī)做交叉編譯;嵌入式
    發(fā)表于 10-20 18:06 ?6次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b>安裝<b class='flag-5'>qt</b>

    嵌入式LinuxQt

    嵌入式LinuxQt嵌入式LinuxQt配置特定設(shè)備嵌入
    發(fā)表于 11-01 17:06 ?3次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>的<b class='flag-5'>Qt</b>

    嵌入式LinuxQT版本,嵌入式Linux版本Qt5.4快速部署

    (Toradex Apalis iMX6)基于Embedded Linux快速部署做較詳細(xì)說(shuō)明。嵌入式Linux版本Qt5.4快速部署--- by Toradex 秦海
    發(fā)表于 11-01 17:20 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>的<b class='flag-5'>QT</b>版本,<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>版本<b class='flag-5'>Qt</b>5.4快速部署

    嵌入式linux幾種播放視頻方法

    嵌入式linux幾種播放視頻的方法:交叉編譯mplayer、smplayer等軟件,移植嵌入式平臺(tái)。這種
    發(fā)表于 11-01 17:38 ?9次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b>幾種播放視頻<b class='flag-5'>方法</b>

    嵌入式linux安裝qt,嵌入式Linux版本Qt5.4快速部署

    (Toradex Apalis iMX6)基于Embedded Linux快速部署做較詳細(xì)說(shuō)明。嵌入式Linux版本Qt5.4快速部署--- by Toradex 秦海
    發(fā)表于 11-02 10:51 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b>安裝<b class='flag-5'>qt</b>,<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>版本<b class='flag-5'>Qt</b>5.4快速部署

    嵌入式Linux路線

    嵌入式linux開(kāi)發(fā)環(huán)境搭建、嵌入式linux開(kāi)發(fā)模型、linux內(nèi)核移植和文件系統(tǒng)、
    發(fā)表于 11-02 11:51 ?18次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>路線