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路徑。
prefix后面的是生成的庫的路徑,可以隨便找個地方建個文件放著,這個庫在之后是有用的。
修改Makefile CC=arm-none-linux-gnueabi-gcc
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:的下面加兩句話
這是把剛才編譯的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為例,修改
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
解壓
如果提示找不到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文件里修改主題。
回車以后就可以在開發板上看到廣播了。
總結
以上是生活随笔為你收集整理的s3c2440移植MQTT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移植uboot第十步:制作uboot补丁
- 下一篇: linux IP类常用命令