嵌入式Linux下 QT移植mqtt的方法(包含arm端)

2022-01-28 嵌入式大本營

環境:

Ubuntu18.04

開發板:debian

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

Qt:Qt5.11.2

解決方案在文末,如不想看中間過程,可直接跳轉到文末。

mqtt是一種工業物聯網協議,可以用來連接阿里雲、百度雲、onenet等雲端,應用廣泛。

關於mqtt的使用,網上資料主要有以下幾種:

1、STM32+ESP8266:這種方式主要是藉助ESP8266模塊來聯網,至於mqtt協議基本上是要自己實現的。也就是mqtt的報文需要自己去構建,好在mqtt的報文並不是很複雜,稍微研究一下也能理解。

2、Linux下使用官方sdk包,比如阿里雲有提供阿里的sdk包,下載後調用它提供的接口來連接阿里雲。

3、QT裡移植mqtt:這種方式因為可以直接調用官方寫好的接口,因此使用起來就簡單多了,但是這個移植過程並不是那麼簡單。這分為Windows端和Linux端。Windows端就不說了,我主要說一下Ubuntu下和arm開發板上的移植。

移植也分為兩種,一種是編譯成動態連結庫,一種是直接把mqtt官方源碼包含進去自己的工程裡面,然後一起編譯。我本人覺得要編譯成庫,然後配置環境變量什麼的比較麻煩,還不如直接把源碼包含進去。

先說Ubuntu下的移植:

這個我是參考網上的,[Linux Qt下MQTT模塊的導入(移植)](https://blog.csdn.net/wct3344142/article/details/107022706/)

按照這篇博客來操作,實測有效,總結起來非常簡單,就是下載源碼,添加到自己的工程中,然後編譯,編譯出錯的都是因為頭文件包含的時候,應該把<>替換成"",這兩種頭文件包含的區別相信大家都很清楚。

這樣就移植好了。可以看到,在這裡使用gcc編譯可以通過,並且寫個簡單的測試代碼,確實能連接雲端

接下來說一下移植到arm端:

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

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

但是這裡你這樣做會發現報錯。

提示QSslConfiguration這種類型不認識(未定義)。於是我就去找一下這個在哪裡有定義,找了一下,發現這種類型其實在qsslconfiguration.h這個文件中是有定義的,但是前面通過#ifndef QT_NO_SSL這個宏沒有把這段代碼編譯進去

於是真相大白了,在gcc裡沒有那個宏定義,所以下面那段代碼會被編譯,所以自然就不會出現未定義這種錯誤。但是當使用交叉編譯工具鏈的時候,在qtnetwork-config.h這個文件中找到了這個宏定義,所以#ifndef QT_NO_SSL 到#endif之間的代碼都不會被編譯,自然QSslConfiguration就會未定義了。

於是我猜想,把qtnetwork-config.h中的這個QT_NO_SSL宏給注釋掉,應該就可以了,雖然 說這樣亂改代碼可能導致一些意想不到的結果,但我還是想試一下看能不能編譯通過。結果發現會出現一連串的連鎖反應,改了這個,又會出現新的錯誤,所以這種方法不行。而且像這種文件它默認是只讀的,也就是說它本來就不希望你去修改,所以不應該這樣做。

後面我又想,既然直接改變宏定義不行,能不能把報錯的地方直接注釋掉,反正那些函數可能並沒有用到,所以注釋掉應該不會有什麼影響

這裡是報錯的那個類的頭文件,再切換到源文件

發現都是沒有編譯的,但是仔細觀察源文件,其實也是有QT_NO_SSL這個宏的

這裡就讓人覺得很奇怪了,同樣是有這個宏,其他的地方都不會被編譯,這裡卻會被編譯,而且其他地方都可以跳轉到qtnetwork-config.h文件中去,這裡卻不會。

那麼,很容易猜到,在這個源文件裡沒有包含qtnetwork-config.h這個頭文件,導致沒有定義那個宏。

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

#include "qtnetwork-config.h"

問題成功解決。把編譯好的文件放在arm開發板上,可以成功執行

至此,移植結束,可以盡情開發了。

後臺回復mqtt獲取我修改後的mqtt源碼包

相關焦點

  • 嵌入式Linux-Qt環境搭建
    本編介紹如何在嵌入式Linux開發板上配置Qt運行環境,並進行Qt程序運行測試。>QMAKE_NM = arm-linux-gnueabi-nm -PQMAKE_STRIP = arm-linux-gnueabi-stripload(qt_config)修改成如下:
  • 【Linux公開課】在嵌入式環境運行Qt程序
    執行嵌入式的qmake(別名qmake-arm),重新交叉編譯,便可獲得嵌入式版本的Qt程序。執行嵌入式的qmake(別名qmake-arm),重新交叉編譯,便可獲得嵌入式版本的Qt程序。如圖14.28所示:圖14.28 移植hello Qt14.6.2 在目標板上運行程序 建議通過nfs掛載PC主機上的目錄至目標板上,便於調試開發。具體的nfs掛載方法請查閱6.4章節的內容。
  • i.MX6ULL嵌入式Linux開發1——uboot移植初探
    本系列教程以「i.MX6ULL」處理器的ARM開發板為實驗基礎,學習記錄嵌入式Linux開發的各種知識與經驗,主要內容包括嵌入式Linux移植,嵌入式Linux驅動開發,嵌入式Linux應用開發等。移植「根文件系統(rootfs)」,Linux 中的根文件系統更像是一個文件夾或者叫做目錄,在這個目錄裡面會有很多的子目錄。根目錄下和子目錄中會有很多的文件,這些文件是 Linux 運行所必須的,比如庫、常用的軟體和命令、設備文件、配置文件等等。根文件系統裡面包含了一些最常用的命令和文件。
  • 【萬字長文】嵌入式Linux + Qt應用開發,基於imx6ul晶片平臺
    一般情況下,如果使用通用的方法,進行嵌入式Linux的GPIO控制,可以通過訪問/sys/class/gpio路徑下的文件,控制GPIO的方向(輸入還是輸出),狀態(高電平還是低電平)。以控制GPIO5_IO2為例:1.
  • ARM與嵌入式linux入門建議
    也許你會注意到,現在做嵌入式的人中,做linux研究的人遠比做WinCE的人多,很多產家提供的資料也是以linux為主。我一直很難理解,其實WinCE的界面比linux的界面好看多了,使用起來也很方便,更為重要的是,WinCE的開發和Windows下的開發基本一樣,學起來簡單得多,但是學linux或者使用linux做嵌入式的人就是遠比WinCE多。
  • 移植mplayer播放器到EK200開發板的步驟淺析
    同時它可支持的輸出設備也很多,可以在X11、Xv、DGA、OpenGL、SVGAlib、fbdev、AAlib、DirectFB下工作。因此得以在市面上被廣為應用。 本文將主要介紹將mplayer播放器移植到明遠智睿MY-IMX6-EK200-6Q-1G開發板的方法及步驟。
  • 乾貨:SOAP嵌入式linux下的應用
    這裡介紹soap嵌入式linux下的使用。一、gSOAP選擇gSOAP的原因:gSOAP編譯工具提供了一個SOAP/XML 關於C/C++ 語言的實現,從而讓C/C++語言開發web服務或客戶端程序的工作變得輕鬆了很多。
  • 【Linux公開課】Qt Sdk搭建
    其他平臺下的安裝可查閱官方資料。用戶可以在Qt官方網站找到三個平臺對應的安裝包。推薦通過Ubuntu下的apt-get獲取Linux版的Qt SDK。在Linux主機可以正常上網的條件下,先進行安裝源的更新,否則可能導致Qt-SDK安裝失敗。安裝源更新命令如下:$ sudo apt-get update 其執行過程如所圖14.8示。
  • 嵌入式Linux下Qt/Embedded的應用
    Qt/Embedded則是在嵌入式環境下所使用的 Qt。目前市面上所有上市的LinuxPDA都是採用Qt/Embedded作為圖形接口的函數庫。Qt/Embedded的特性是可以直接在 Framebuffer上顯示圖形接口,反應的速度更快了,這對硬體與容量都有限制的嵌入式環境來說非常重要。圖1為Qt/Embedded的實現結構。
  • 移植opencv
    >CC=arm-linux-gnueabi-gcc .把依賴庫拷貝到 arm-linux-gnueabi 路徑下cp /home/incipe/opencv_depend/include /usr/local/bin/arm-2014.05/arm-none-linux-gnueabi/ -rfcp /home/incipe/opencv_depend/lib /usr/local/bin/
  • 手把手教你使用VSCode + gdb + gdbserver調試ARM程序
    我們可以使用VSCode+gdb+gdbserver來調試我們arm開發板上的arm程序。下面簡單介紹一下使用方法,前提是開發板與PC可以進行無線/有線通信。相關文章:一次關於WiFi 驅動移植的總結復盤1、準備arm格式的gdb及gdbserver工具一般交叉編譯工具鏈裡都包含有,如果沒有則需要自己下載gdb源碼進行交叉編譯,gdb下載源碼下載連結:http://www.gnu.org/software
  • gcc、arm-linux-gcc和arm-elf-gcc的關係?
    arm-linux-gcc 使用 GNU 的 Glibc,而 arm-elf-gcc 一般使用 uClibc/uC-libc 或者使用 RedHat專門為嵌入式系統的開發的C庫newlib。只是所應用的領域不同而已,Glibc是針對PC開發的,uClibc/uC-libc是與Glibc API兼容的小型化C語言庫,實現了Glibc部分功能。
  • 在Visual Studio中進行Qt Quick應用程式的嵌入式開發(一)
    本文我們將展示如何使用此功能在Visual Studio中進行Qt Quick應用程式的嵌入式開發。本次的嵌入式目標板選用的是 Raspberry Pi 3 Model B ,嵌入式作業系統為Linux,應用程式示例圖如下:開發環境的搭建主機環境:
  • 嵌入式項目中使用Linux的技巧
    就已經被移植到各種計算機硬體平臺的作業系統的數量來說,Linux首屈一指。Linux的衍生版本已運行在非常廣泛的嵌入式系統中,包括:網絡路由器、行動電話、建築自動化控制、電視機和視頻遊戲控制臺。雖然Linux被成功使用,但並不意味著它很容易使用。Linux包含的代碼超過一百萬行,其運作帶有鮮明的Linux方法論味道,初學者可能難以迅速掌握。
  • 嵌入式Linux引導以及U-Boot移植介紹
    Linux的引導過程,X86體系的引導過程以及幾種常見嵌入式處理器的引導過程,U-Boot的移植的基本步驟、常用命令如何使用。通過本文可以對嵌入式Linux的引導從概念到實際操作有一個總體清晰的認識1.啟動順序1.1  Bootloader除此基本功能之外,大多數Bootloader(引導加載程序)實現了Shell命令集以執行不同操作。1.2 基於BIOS-X86的引導x86處理器通常安裝在在一塊包含BIOS程序的非易失性存儲器主板上。
  • [乾貨]手把手教你用Zedboard學習Linux移植和驅動開發
    主要分為兩部分,分別闡述Zedboard中FPGA和處理器互聯總線與硬體設計和Zedboard處理器系統上嵌入式Linux的移植與通過驅動和應用程式簡單配置FPGA寄存器的實現。上次介紹了沒有作業系統下的驅動和應用程式開發,本文介紹帶作業系統的驅動和應用程式開發。
  • i.MX6ULL嵌入式Linux開發2-uboot移植實踐
    為了能更多的了解uboot,我們使用代碼改動較大的第二種方式進行uboot的移植。在修改uboot之前,先來看一下uboot的源碼結構。1 uboot源碼結構分析uboot的源碼如下,這裡是源碼編譯後的結果,包含編譯後的文件。
  • 嵌入式Linux內核,文件系統的製作
    嵌入式linux QQ交流群:175159209,歡迎愛好者加入交流技術問題!
  • SQLite3在ARM Cortex-A9開發板上的移植
    /configure   --prefix=$PWD/build     --host=arm-linux      CC=/opt/arm-linux-gcc-4.6.4/bin/arm-linux-gcc  OR  # .
  • MQTT 教程詳解二(linux 下搭建 mosquitto 伺服器)
    對於伺服器的選擇,其實有很多種,具體可以參考連結:https://github.com/mqtt/mqtt.github.io/wiki/serverswindows 下可以使用 Apache-Apollo ,我之前也測試過,畢竟圖形化界面,幾分鐘就可以搭建好並讓服務跑起來,很容易上手,但是今天我不推薦在 windows 下搭建 Apollo,我個人認為,兩個字 — 規範,因為我們在實際開發中其實大多數服務都是部署到 linux 伺服器上的,而且我也習慣了在 linux 下搭建伺服器,習慣了折騰。