日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

s3c2440移植MQTT

發布時間:2025/10/17 c/c++ 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 s3c2440移植MQTT 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面:

我的博客已遷移至自建服務器:博客傳送門,CSDN博客暫時停止,如有機器學習方面的興趣,歡迎來看一看。

此外目前我在gitHub上準備一些李航的《統計學習方法》的實現算法,目標將書內算法全部手打實現,歡迎參觀并打星。GitHib傳送門

正文

因為項目需要從機接收MQTT廣播,網上有關2440的MQTT移植文章非常少,懵逼死我了,所以移植成功以后先把它寫出來,給有需要的人看。我當時是參考了下面幾篇文章,但是都不能順利完成,幾篇文章寫得很好,需要相互借鑒。

http://blog.sina.com.cn/s/blog_951adad70101tnyg.html
http://zhuzhouhong8.blog.163.com/blog/static/17480522016116454950/
http://blog.csdn.net/xukai871105/article/details/39252653
http://www.amobbs.com/thread-5643406-1-1.html

雖然最后移植成功了,但是感覺方法有點死,如果照著上面幾篇的步驟都不能完成,沒有辦法了,可以照著我的步驟來。

備注:如果虛擬機之前安裝了openssl,建議先將其卸載,再來照著我的步驟安裝,其中涉及到庫的路徑設置,如果自己能把握,可以不用卸載。

1.準備兩個虛擬機,沒有安裝openssl的,只要將虛擬機的文件復制一份就有兩個虛擬機了。
環境:
虛擬機:ubuntu9.10
交叉編譯器:4.4.3

2.在其中一個虛擬機中交叉編譯openssl。
因為MQTT需要用到openssl庫,所以編譯MQTT前要先編譯openssl。
可以百度openssl-0.9.8e.tar.gz,隨便找一個就可以,最好和我的版本相同,防止版本導致的問題。
我將其放在了/home/MQTT路徑。

tar zxvf openssl-0.9.8e.tar.gz cd openssl-0.9.8e ./config no-asm shared --prefix=/home/MQTT/openssl

prefix后面的是生成的庫的路徑,可以隨便找個地方建個文件放著,這個庫在之后是有用的。
修改Makefile CC=arm-none-linux-gnueabi-gcc

make make install

openssl的動態鏈接庫就建立完成了。

3.交叉編譯MQTT
a. 下載源碼
http://www.eclipse.org/paho/
點擊DownloadNow,選擇Client下的C源碼(注意,是C client for Windows/Unix/Mac)。點擊GitHub鏈接,找到左邊的Branch,選擇develop,選中之后再次點擊Branch,選擇Tags,選擇v1.0.3。我試過V1.1.0,通過我的方法編譯不了,可能做了些修改。選擇完以后點擊右邊的Clone or download,選擇download zip就可以了。
b. 我將其放在了/home/MQTT路徑下,tar,進入文件夾。進入Makefile在最開頭的.PHONY:的下面加兩句話

INCLUDES = -I/home/MQTT/openssl/include LIBSDIR = -L/home/MQTT/openssl/lib

這是把剛才編譯的openssl的庫路徑加進去,后面的路徑就是你庫存放的位置。我是放在/home/MQTT/openssl這個位置的。

添加方式像這樣

.PHONY: clean, mkdir, install, uninstall, htmlINCLUDES = -I/home/MQTT/openssl/include LIBSDIR = -L/home/MQTT/openssl/libifndef release.version

然后到文件的第181行,在${CC} 后面加上$(INCLUDES),在最后加上$(LIBSDIR),生成的時候需要庫,要把庫的路徑添加進去。

${CC} $(INCLUDES) -g -o $@ $< -l${MQTTLIB_CS} ${FLAGS_EXES} $(LIBSDIR)

在第187行,203行,215行做同樣處理。最好和我用一樣的版本,一個是這個位置不對,另一個是我之前用的1.10版本的,這樣子做沒有效果。

c.編譯

make CC=arm-linux-gcc

編譯成功。我之前在這里遇到很多問題
例如:collect2: ld returned 1 exit status ar
解決方法:具體原因不清楚,只能重新和我的做法比對,一定有沒做對的地方。
例如:找不到ssl。
解決方法:我是編譯openssl的交叉編譯器和編譯MQTT的交叉編譯器不是一個版本,導致的找不到ssl。
我在這里卡了很久,大部分問題都是編譯器或MQTT的版本的問題導致的。

d.將文件移入開發板。
把build/output目錄下的所有動態庫文件移入開發板的lib目錄下,把sample文件夾整個例如開發板,位置隨意。test目錄不用管。我把sample文件夾就放在了根文件的頂層目錄。
./sample/subasync
執行自帶的測試文件,如果提示沒有權限,就把這個文件移到文件夾外執行,也就是直接單獨放在頂層目錄。
./subasync
1)如果提示no found之類的,在Ubuntu下找到交叉編譯器的位置
/work/tools/opt/FriendlyARM/toolschain/4.4.3/lib
這是我的位置,把lib目錄下所有的東西都復制到開發板lib目錄下。如果是別的交叉編譯器,可能在lib的同層有libc目錄,這個目錄下的也都拷貝過去。
./subasync
2)還有個提示記不得了,字母I開頭的,兩個單詞,那個是你的內核或者根文件交叉編譯用的編譯器和現在的版本差別太大。我直接改用了友善之臂提供的內核和根文件,錯誤就消失了。
3)如果運行以后什么輸出也沒有,過了很久提示連接失敗,是主機IP沒有設置好,以subasync.c為例,修改

#define ADDRESS "tcp://localhost:1883"為 #define ADDRESS "tcp://192.168.1.110:1883"

192.168.1.110為mosquitto服務端IP地址。
重新交叉編譯就可以了。

在PC機沒有開啟服務前,如果一切正常的話,運行./subasync以后很快就輸出連接失敗。
如果服務器已經開啟,會輸出幾行,內容忘記了,只記得最后一句是按q退出。

4.PC安裝MQTT
這需要在另一臺虛擬機上安裝了,因為我試過在第一臺虛擬機上直接安裝MQTT服務,還是會提示找不到ssl,雖然之前已經安裝過了,但是因為庫路徑等各種原因,導致不行,如果要強行裝上,那如果開發板的MQTT需要重新修改什么的,就沒法交叉編譯了,最方便的方法就是再開一臺清白的虛擬機。

運行命令
wget http://mosquitto.org/files/source/mosquitto-1.4.5.tar.gz
解壓

tar zxfv mosquitto-1.4.5.tar.gz # 進入目錄 cd mosquitto-1.4.5 # 編譯 make # 安裝 sudo make install

如果提示找不到openssl/ssl.h,就安裝openssl

sudo apt-get install libssl-dev

如果遇到其他問題,先看最前面的幾篇文章,里面有講一些。

一套MQTT需要一個代理,一個服務器,一個客戶端
代理和服務器可以由一臺Ubuntu代替,打開兩個控制臺就行了,客戶端是開發板。

打開控制臺,啟動代理服務

mosquitto -v

再打開一個控制臺,發布內容

mosquitto_pub -t sensor -m haha【sensor 】主題【haha】指定消息內容

sensor和haha可以自己代替掉,但是sensor 必須和開發板訂閱的主題是相同的,否則開發板接收不到。如果沒有對subasync.c文件做其他修改,默認的主題是"MQTT Examples",可以自己在c文件里修改主題。
回車以后就可以在開發板上看到廣播了。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的s3c2440移植MQTT的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。