https://www.cnblogs.com/dissun/p/10505007.htmlhtml
關鍵字:在windows安裝mosquitto,在mosquitto中配置日誌,在mosquitto中配置用戶帳號密碼
關於Mosquitto配置的資料網上仍是有幾篇的,可是看來看去,基本上都是基於Linux。基於Window的百裏挑一,看上去貌似配置的東西相差不大,實操過程當中真的煩透了,配置就是不成功,此次把本身實踐過程當中的東西記錄一下,分享出來。linux
1、概念梳理
一、Mosquitto是一款實現了消息推送協議MQTT 3.1的開源消息代理軟件,提供輕量級的、支持可訂閱/可發佈的消息推送模式,是設備與設備之間的短消息通訊變得簡單,普遍應用於低功耗傳感器、手機(app消息推送是場景之一)、嵌入式電腦、微型控制器等移動設備。
二、那什麼是MQTT,他的英文全稱Message Queuing Telemetry Transport,翻譯過來就是「消息隊列遙測傳輸」,是ISO 標準(ISO/IEC PRF 20922)下基於發佈/訂閱範式的消息協議。它工做在 TCP/IP協議族上,是爲硬件性能低下的遠程設備以及網絡情況糟糕的狀況下而設計的發佈/訂閱型消息協議。
目前支持MQTT的服務器中間件有EMQTT、Mosquitto、Apollo。本章講的就是Mosquitto。
三、MQTT的協議內容有不少,其中一個必定要知道,就是「消息發佈服務質量」,只有三個值分別是:
QoS 0:「至多一次」,消息發佈徹底依賴底層 TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於以下狀況,環境傳感器數據,丟失一次讀記錄無所謂,由於不久後還會有第二次發送。
QoS 1:「至少一次」,確保消息到達,但消息重複可能會發生。
QoS 2:「只有一次」,確保消息到達一次。這一級別可用於以下狀況,在計費系統中,消息重複或丟失會致使不正確的結果。git
2、下載與安裝
一、Mosquitto存在不少版本,若是想體驗比較新版本能夠上github,可是比較麻煩的是須要本身去編譯成windows文件,編譯須要用到cmake軟件,我以前操做過沒問題,能夠參照其餘博主的文章:[https://blog.csdn.net/vwadev/article/details/50148265]。github
官方後面提供了比較穩定的window安裝版本,安裝完成後能夠直接使用,而且自動添加成 windows服務,很是方便,下載路徑:https://mosquitto.org/downloadweb
二、安裝完成。若是須要使用,直接啓動服務便可。windows
三、Mosquitto服務默認佔用 1883端口,因此可不在配置文件中顯式設置。服務器
3、關於配置文件的一些重要說明
一、配置文件在安裝目錄下的mosquitto.conf,默認狀況下不作任何修改,就能夠啓動mosquitto。
二、配置說明中出現的地址例如:「/var/run/mosquitto」,「/var/log/messages」,都是相對路徑,相對於系統盤根目錄。這個地方很重要,他可不是相對於安裝目錄的根目錄。例如「/var/run/mosquitto」表示的是「c:\var\run\mosquitto」,我有一段時間一直沒搞定,就是這個目錄緣由,不少人沒有反饋這個問題,由於都是在linux用因此沒啥問題。websocket
三、安裝目錄的完整路徑中,不能出現空格,不然在命令行就沒法經過。Mosquitto默認安裝路徑是在「C:\Program Files\mosquitto」,這裏面的「Program Files」就存在空格,致使不少問題,這個也要特別注意。因此後來我改成安裝在「C:\MosquittoTest」網絡
4、配置登陸帳號和密碼
一、若是想方便測試能夠下載安裝MQTT客戶端(http://www.eclipse.org/paho/components/tool/),我本身是用這個,不過下面咱們仍是用原生的命令行操做:併發
二、在配置文件mosquitto.conf中,任意位置加入下面文本,保存退出(我說的全新安裝的狀況下,若是是維護已經使用好久的系統,可在配置文件中找到對應的屬性進行更改)
#設置不容許匿名登陸 allow_anonymous false #設置帳戶密碼文件位置爲C:\MosquittoTest\pwfile.example password_file /MosquittoTest/pwfile.example
三、重啓mosquitto服務配置文件的修改才能生效。爲了方便調試和操做,咱們後面的操做所有經過命令行模式進行。
四、插入新用戶名及密碼,輸入密碼時界面是不會顯示的,直接輸入後回車就能夠,須要連續輸入兩次。保證pwfile.example的路徑和上面的配置一致。下面打開CMD並進入mosquitto根目錄輸入:
mosquitto_passwd -c /MosquittoTest/pwfile.example FirstUserName (使用-c 參數會致使清空密碼文件,從新插入用戶)
mosquitto_passwd /MosquittoTest/pwfile.example SecondUserName (不使用-c 表示追加用戶,不影響舊用戶)
五、建立成功後pwfile.example會出現剛剛添加的用戶信息。
六、啓動mosquitto 進行測試。
首先啓動第一個cmd窗口啓動服務:mosquitto.exe -c mosquitto.conf
而後啓動第二個cmd窗口訂閱'dissun/topic'主題(其中dissun是帳號,111111是密碼):mosquitto_sub -u dissun -P 111111 -t 'dissun/topic' -v
最後啓動第三個cmd窗口發佈訂閱'腰疼不加班'信息:mosquitto_pub -u dissun -P 111111 -t 'dissun/topic' -m '腰疼不加班'
5、配置日期信息
一、配置日期前請先查看第三大點(關於配置文件的一些重要說明)
二、在mosquitto.conf文件中插入:
#把日誌信息輸入到指定文件 log_dest file /MosquittoTest/DisSunLog_1.log #在控制檯輸出信息,運行win服務無效 log_dest stdout #不記錄 #log_type none #########下面的debug、error、warning.....等等能夠組合使用。 #記錄網絡通訊包,通訊包大小(含心跳包),但不顯示內容 log_type debug #錯誤信息(沒見過) log_type error #警告信息(沒見過) log_type warning #設備的訂閱信息、發佈信息及下線信息(端口、設備名、用戶、不包發佈內容) log_type notice #服務啓動關閉信息、版本號、端口號、配置文件信息 log_type information #全部設備訂閱主題提醒 log_type subscribe #這個沒有試出來幹啥用的(沒見過) #log_type unsubscribe #websockets連接信息(沒見過) #log_type websockets #websockets_log_level 0
三、而後重啓服務,咱們發一條信息來看看記錄了什麼。(參照第四節第6點進行發送信息操做獲得下面運行界面)
四、按Ctrl+C 中止主服務,若是不中止服務,日誌文件會被獨佔鎖住沒法打開。找到這個日誌
五、日誌解析
##########:如下是information信息 1552112775: mosquitto version 1.5.8 starting 1552112775: Config loaded from mosquitto.conf. 1552112775: Opening ipv6 listen socket on port 1883. 1552112775: Opening ipv4 listen socket on port 1883. ##########:如下是subscribe信息(僞造) 1552113940: mosqsub|11332-DisSunPad 0 'dissun/topic' 20-DisSunPad (c1, k60, u'dissun'). ##########:如下是notice信息,訂閱客戶端上線11332 1552112782: New connection from ::1 on port 1883. 1552112782: New client connected from ::1 as mosqsub|11332-DisSunPad (c1, k60, u'dissun'). ##########:如下是debug信息,訂閱客戶端上線11332 1552112782: No will message specified. 1552112782: Sending CONNACK to mosqsub|11332-DisSunPad (0, 0) 1552112782: Received SUBSCRIBE from mosqsub|11332-DisSunPad 1552112782: 'dissun/topic' (QoS 0) 1552112782: mosqsub|11332-DisSunPad 0 'dissun/topic' 1552112782: Sending SUBACK to mosqsub|11332-DisSunPad ##########:如下是notice信息,發佈客戶端上線12284 1552112832: New connection from ::1 on port 1883. 1552112832: New client connected from ::1 as mosqpub|12284-DisSunPad (c1, k60, u'dissun'). ##########:如下是debug信息,發佈客戶端上線12284,併發布12字節的信息,而後離線。 1552112832: No will message specified. 1552112832: Sending CONNACK to mosqpub|12284-DisSunPad (0, 0) 1552112832: Received PUBLISH from mosqpub|12284-DisSunPad (d0, q0, r0, m0, ''dissun/topic'', ... (12 bytes)) 1552112832: Sending PUBLISH to mosqsub|11332-DisSunPad (d0, q0, r0, m0, ''dissun/topic'', ... (12 bytes)) 1552112832: Received DISCONNECT from mosqpub|12284-DisSunPad ##########:如下是notice信息,發佈客戶端離線12284 1552112832: Client mosqpub|12284-DisSunPad disconnected. ##########:如下是debug信息,訂閱客戶端保持跟mosquitto的聯繫。PINGREQ請求心跳包,PINGRESP迴應心跳包 1552112842: Received PINGREQ from mosqsub|11332-DisSunPad 1552112842: Sending PINGRESP to mosqsub|11332-DisSunPad 1552112902: Received PINGREQ from mosqsub|11332-DisSunPad 1552112902: Sending PINGRESP to mosqsub|11332-DisSunPad 1552112962: Received PINGREQ from mosqsub|11332-DisSunPad ##########:如下是information信息 主服務中斷 1552113191: mosquitto version 1.5.8 terminating
6、若是要開啓webSockets,它是支持的。可是要顯式的加入mqtt協議及端口
#MQTT協議
port 1883
protocol mqtt
#websockets協議
listener 8000
protocol websockets
#若是須要查看websockets日誌還能夠加入如下面,上面有提過。
log_type websockets
websockets_log_level 0
7、用戶訪問控制acl_file,看遍了全部的文章,操做都不生效。加了訪問控制後全部的的用戶,都沒法正常的收發信息,因此等下次研究透了再追加。感受這玩意從Linux移至過來,不是徹底通用。
不過仍是按照說明把操做寫下來,有看出問題的童鞋能夠跟我反饋下。(注:下面的內容操做沒有經過,請讀者自行試驗)
一、在mosquitto.cong中間中加入
#加入訪問控制列表文件Acls
acl_file /MosquittoTest/aclfile.example
二、修改aclfile.example內容,加入用戶的權限
# This affects access control for clients with no username. topic read $SYS/# # This only affects clients with username "roger". #user roger #topic foo/bar user dissun topic dissun/topic # This affects all clients. pattern write $SYS/broker/connection/%c/state
三、CMD啓動mosquitto。
四、按道理說設置就是這麼多,沒那麼複雜,可是此時dissun用戶訂閱是成功的,可是dissun用戶發佈失敗,服務debug日誌顯示「denied」。我懷疑是acl文件加載失敗,因此換了絕對路徑,可是依然沒有效果,搞了一下午不成功放棄,之後再搞。
#### 原創:DisSun ##########
#### 時間:2019.03.10 #######