當使用MQTT協議進行數據傳輸時,需要一個 Broker 來轉發資料,在這裡選擇 Mosquitto 當 Broker。Mosquitto 是一個開放原始碼 MQTT broker,特點是輕巧,在低功耗的裝置或者完整服務器的所有設備上都適合使用。
它的功能包括存儲數據以及處理數據,如果收到任何訊息,會根據不同Topic分類,存儲在該Topic下的database中,以及將訊息傳給有訂閱的client。
使用 mosquitto pub和mosquitto sub來發布和訂閱訊息。
連線EC2
ssh -i ~/.ssh/key名稱.pem ubuntu@IP_Address
sudo apt update
sudo
提高權限,讓自己變成管理員apt
套件管理程式sudo apt install mosquitto
sudo apt install mosquitto-clients
Publish、Subscribe測試
開啟兩個終端機
一台為 Subscribe
一台為 Publish
mosquitto_sub : 訂閱
mosquitto_pub : 發布
-d : debug 模式
=> debug-t : 訂閱的主題
=> topic-h : Broker 的 IP
=> host-m : 發送的內容
=> message-v : 顯示主題名稱
=> verbosely更多指令內容可以查看:mosquitto_sub --help
mosquitto_pub --help
訂閱Try/MQTT
的主題 (主題名稱不包含空白)
mosquitto_sub -d -t Try/MQTT
或者
mosquitto_sub -d -h 54.xx.xx.xx -t Try/MQTT
-h : mqtt host to connect to. Defaults to localhost.
接著就會看到
Topic、Qos等...資訊
Client mosqsub|3323-ip-172-31- sending PINGREQ
Client mosqsub|3323-ip-172-31- received PINGRESP
持續保持連線
mosquitto_pub -d -t Try/MQTT -m "Try Message"
或者
mosquitto_pub -d -h 54.xx.xx.xx -t Try/MQTT -m "Try Message"
接著就會看到
發布後,終端機1 (Subscribe)得到以下資訊
上述是在沒有任何帳號密碼的保護下,大家都能看到喔!
接下來就在 mosquitto 使用帳號和密碼吧!
利用 mosquitto_passwd
設立密碼,還有密碼檔案。
指令:
mosquitto_passwd -c <passwordfile> <username>
-c
創建 passwordfile 檔案,再次新增使用者就需要加-c
密碼檔案路徑 /etc/mosquitto/passwd
建立帳號名稱 try,接著輸入密碼後即可建立成功
sudo mosquitto_passwd -c /etc/mosquitto/passwd try
Password: xxxx
Reenter password: xxxx
sudo vi /etc/mosquitto/acl
創建一個acl檔案
新建的檔案
# 用戶 try 能夠讀寫 Try/MQTT這個主題
user try
topic readwrite Try/MQTT
按下 [ESC] 按鈕回到一般模式
在一般模式中按下 :wq 儲存後離開
有關文件編輯的相關指令可以參考 vi 文書處理軟體
mosquitto.conf
參數檔案,開啟模式打開 mosquitto.conf
參數檔案
設定檔位置在 /etc/mosquitto/mosquitto.conf
輸入指令 - 打開並編輯mosquitto.conf
參數檔案:
sudo vi /etc/mosquitto/mosquitto.conf
會看到預設 mosquitto.conf
的檔案長這樣:
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl
allow_anonymous
允許匿名存取,設成false
代表需使用者名稱。password_file
帳號密碼的檔案acl_file
對於使用者權限的設置檔案
按下 [ESC] 按鈕回到一般模式
在一般模式中按下 :wq 儲存後離開
因為剛剛修改了mosquitto.conf
設定檔案
所以要重新開啟 mosquitto service
sudo service mosquitto stop
sudo service mosquitto start
或者
sudo /etc/init.d/mosquitto stop
sudo /etc/init.d/mosquitto start
可以用 status 查看 mosquitto 狀態
service mosquitto status
訂閱Try/MQTT
的主題
來試試如果不加帳號密碼會如何吧!
Connection Refused: not authorised.
就會像這樣被拒絕連接 因為沒有授權。
格式:
mosquitto_sub -v -d -t <topic> -u <user> -P <Possword>
範例:
mosquitto_sub -v -d -t Try/MQTT -u "try" -P "xxxx"
格式:
mosquitto_pub -d -t <Topic> -m <Message> -u <User> -P <Possword>
範例:
mosquitto_pub -d -t Try/MQTT -m "Try Message" -u "try" -P "xxxx"
發布後 Subscribe 得到以下資訊:
今天都是自己連線到同一台(EC2虛擬機),明天來使用 MQTTlens 用其他地方來連進EC2虛擬機的Mosquitto Broker!
https://blog.gtwang.org/iot/raspberry-pi/raspberry-pi-mosquitto-mqtt-broker-iot-integration/
http://linux.vbird.org/linux_basic/0310vi/0310vi.php