《1》
轉載自: 請看下面這篇好博文
https://www.cnblogs.com/yangfengwu/p/7764667.html
《2》
mosquitto在Linux環境下的部署
轉自 https://blog.csdn.net/lee_xuwei/article/details/95315936
使用傳統源碼安裝步驟:
步驟1:
- http://mosquitto.org/files/source/ 官網下載源碼 mosquitto-1.6.3.tar.gz,放到Linux環境中。
- 解壓(tar -xzvf mosquitto-1.6.3.tar.gz)。
- 找到主要配置文件config.mk,其中包含mosquitto的安裝選項,需要注意的是,默認情況下mosquitto的安裝需要OpenSSL(一個強大的安全套接字層密碼庫)的支持,若不需要SSL,則需要關閉config.mk里面與SSL功能有關的選項(WITH_TLS、WITH_TLS_PSK)。筆者這里直接將這兩句話屏蔽掉了。
步驟2:
- make
- make install(需要root權限),這里編譯失敗出現了一個問題:
error while loading shared libraries:libmosquitto.so.1 : cannot open shared object file: No such file or directory
所以問題很清楚,沒有找到這個動態鏈接庫。遇到這種問題就有兩種情況:
1)確實沒有這個庫或者庫的版本不對 。 2)這個庫所在的路徑不在系統查找范圍內。
筆者感覺這個庫名字很眼熟,果然在“make install”命令執行的打印信息中發現蛛絲馬跡:
“install -s --strip-program=strip libmosquitto.so.1 /usr/local/lib/libmosquitto.so.1”
筆者在這個路徑下,找到了該動態庫,說明現在的問題應該是屬於第二種情況(而且是官方的代碼,也不應該會犯第一種問題),於是在網上找到了解決方案。
1) 如果共享庫文件安裝到了/lib或/usr/lib目錄下, 那么需執行一下ldconfig命令
ldconfig命令的用途,主要是在默認搜尋目錄(/lib和/usr/lib)以及動態庫配置文件/etc/ld.so.conf內所列的目錄下,搜索出可共享的動態鏈接庫(格式如lib*.so*), 進而創建出動態裝入程序(ld.so)所需的連接和緩存文件。 緩存文件默認為/etc/ld.so.cache, 此文件保存已排好序的動態鏈接庫名字列表。
2) 如果共享庫文件安裝到了/usr/local/lib(很多開源的共享庫都會安裝到該目錄下)或其它"非/lib或/usr/lib"目錄下, 那么在執行ldconfig命令前,還要把新共享庫目錄加入到共享庫配置文件/etc/ld.so.conf中,如下:(需要root權限執行下面命令)
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
(詳情參閱http://blog.chinaunix.net/uid-26212859-id-3256667.html)
這里筆者就是使用第二種情況的辦法,成功完成編譯。
完成后會在系統命令行里發現mosquitto、mosquitto_sub、mosquitto_pub三個工具(網上說有四個,還有一個mosquitto_passwd,用於管理密碼,應該是沒關閉SSL的原因),分別用於啟動代理、訂閱消息和發布消息。
圖示:我在這個文件夾內執行命令
測試
步驟1:開啟一個終端:輸入“mosquitto”命令,結果如下圖,服務啟動,因為一直監聽,所以不會看到命令行。
正常情況
輸入“mosquitto”如果如下圖報錯,發現報錯是地址已被使用,可以使用 "ps -e "查看進程和“netstat -apn | grep :1883”來查看誰占用端口,可使用“kill -s 9 pid號”殺死該進程,然后重新輸入“mosquitto”命令即可得到上圖正確結果。
報錯
步驟2:開啟第二個終端,輸入“mosquitto_sub -t 主題名 -i 用戶名”,(后面的“-i 用戶名可省略”)
例如:mosquitto_sub -t mqtt 結果如圖,由於一直監聽,所以也不會看到命令行。
發布消息前第二個終端截圖
步驟3:開啟第三個終端,輸入“mosquitto_pub -t 主題名 -i 用戶名 -m 要發送的消息”
(如果要發送的消息中有空格,需用引號括起來)
例如:mosquitto_pub -h localhost -t mqtt -m "hello world"
則第二個終端可以收到這條信息。筆者看到其命令行有文件傳輸,又嘗試傳一個文件(內容只有一句話),第二個終端會直接顯示文件的內容(截圖中“hello World”下面的那句話就是)。嘗試一個大文件的傳輸,將一個7M的書傳過去,首先是可以傳,但是第二個窗口顯示的全是亂碼,傳輸的速度也是一個問題。
發布消息后的第二個終端截圖
這里之所以會想到傳文件是因為看到mosquitto_pub的命令參數中有關於把文件當做message傳輸的記錄,如圖:
這里的文件上限默認是256M。邏輯中有對文件大小的判斷,超過256M的文件則不傳。不知道這里如果把這個值修改更大,會不會產生影響,筆者沒有嘗試,因為傳7M的文件都感覺很慢。(這個問題在MQTT協議介紹中可以得到答案,MQTT文件長度的表示是用1至4個字節來表示,而其表示長度的方式又有特殊的加密方式,按照這種方式,其最大表示的長度為256M)
測試總結
三個終端,一個用來開啟服務,一個執行mosquitto_sub來訂閱消息,與服務器保持長連接,隨時接收來自服務器推送的消息,最后一個終端則用來發布消息。這個測試的結果現在是正確的,但仍存在局限性,還有以下幾個問題需要注意:
1)了解mosquitto_sub和mosquitto_pub命令背后是如何執行的,需要修改,訂閱端的處理肯定不能僅僅是顯示內容 到標准輸出上。
2)了解mosquitto命令的邏輯,這里包含的內容很多,估計也是最難的。
3)這里的實驗是在本地傳輸,需要做一個客戶端出來(客戶端可能是Android端或者MCU端),看是否可以正常傳輸,還有就是能傳多大的數據,允許同時連入的客戶數有多少(據說是20000以上)。
===============
我的實操截圖:
使用ubuntu內的本地服務器測試:
也可以連接到通信貓的mqtt服務器:
ubuntu內的一個進程向“pu”主題發布消息:ubuntu內的另一個進程可以收到該消息,windows上的通信貓軟件也可以收到該消息。
Ubuntu上的實驗也可以做不少事,
現在有了mqtt, 還可以再加上sqlite 加上json.
因為這些都是單片機物聯網應用場景下一些常用的緊密相關的技能。
.