本文是有關於在 Ubuntu 上使用 Mosquitto Clients 與 Mosquitto.org 公開的測試 Broker 做 TLS 的連線測試。
IOT 也聽聞好幾年了,最近終於有機接觸到一個 IOT 的平台,搭配 STM32 Arduino + BG96 4G NBIOT Module,要做監控的方案。自從開始嘗試一些其它工作後,收獲還不少,長了很多見識。像這個案子裡,就用了之前聽過很久的 Arduino、和被我唱衰的IOT。其中一項收獲,就是這篇要講的 MQTT。
MQTT is a machine-to-machine (M2M)/”Internet of Things” connectivity protocol – mqtt.org
MQTT Suite – Mosquitto
MQTT 是一個輕量的訊息發佈、訂閱通訊協定。在 Linux 上如果要找MQTT程式,通常都會找到 Mosquitto 這個程式。Mosquitto 是由知名的 IDE 開發工具 Eclipse 所屬的組織開發,也難怪上 Google 一找都是提到它。
MQTT 協定上有分三個角色, Broker (訊息仲介者), Publisher(訊息發佈者) 與 Subscriber(訊息訂閱者)。這個概念還蠻直覺的,就像報社(Broker)、記者(Publisher)與訂閱戶(Subscriber) 的關係。有人發佈訊息、有人訂閱訊息,還有一個負責轉送訊息的。
Mosquitto Clients 設定
所謂的 Clients 是指 Subscriber與 Publisher,在 Ubuntu Linux 上已可以用 apt 直接安裝。要注意的是在 14.04 上的版本並不支援 TLS,在 16.04 才有。由於本文是利用 TLS ,所以請使用 16.04 做測試。若一定要使用 14.04,可以下載原始碼進行編譯,用apt安裝一個uuid開發套件後就可編譯成功。
1 |
sudo apt-get install mosquitto-clients |
Mosquitto 公用測試伺服器
Mosquitto 有提供一個免費的公用 Broker 伺服器,支援其所有可用的連線方式。包含未加密、SSL、TLS、WebSocket 等等。本文要測試的 TLS,是使用 PORT 8884。
TLS 需要對雙方的身份做認証,因此在測試站上也提供使用者登錄自己的身份和下載伺服器憑証,透過三個檔案 “伺服器憑証“、”用戶端憑証“、”用戶密鑰“,才可以完成連線進行發佈和訂閱。
產生密鑰和取得憑証
伺服器憑証在公用伺服器的主頁就有提供連結可下載 (mosquitto.org.crt),直接下載即可。而用戶端憑証/密鑰則需先在本地端自行產生後再送上公用伺服器做登錄,才可使用。產生的方法在登錄網頁上有寫,這邊節錄說明。其中用到的openssl程式,在新的 Linux Distribution預設都有安裝了。
1 2 |
openssl genrsa -out client.key # 產生私鑰 openssl req -out client.csr -key client.key -new # 產生 CSR (Certificate Signing Request) 檔案 |
其中產生 CSR 的部份,就是為了要將身份登錄到伺服器上。產生過程中會問一些問題,基本上隨便填就可以了(千萬不要傻傻的填真的…),密碼的部份留空白就可以了。下達命令後,會產生一個 .csr 的檔案,可用 cat 指令將其內容輸出後,複制下來。
接下來將 CSR 的內容 (包含前後 BEGIN/END 的兩行)複制下來,貼到登錄網頁右側的部份,按下 Submit 後,即完成登錄,並且下載其產生的用戶端憑証 (client.crt)。
發佈與訂閱
到此,會取得三個檔案:伺服器憑証 (mosquitto.org.crt), 用戶端憑証 (client.crt) 與 用戶端密鑰 (client.key)。這樣,便能使用這三個檔案與伺服器連線,進行發佈與訂閱。為方便測試,我們可以開啟兩個終端機,一個執行發佈,一個執行訂閱。
發佈的動作執行完,程式會結束,但訂閱則會持續連線監聽事件。並且,發佈進行時,訂閱程式要先執行。發佈時若訂閱程式未執行,後面再執行是收不到之前的訊息的。
訂閱命令
1 2 3 4 5 6 7 8 |
mosquitto_sub -d -h test.mosquitto.org -p 8884 -t topic --cafile mosquitto.org.crt --cert client.crt --key client.key # -d : 啟用 debug 訊息 # -h : 指定要連線的 broker 伺服器 # -p : 通訊埠。 Mosquitto 的公開伺服器, 8884 是給 TLS 連線專案。 # -t : 要訂閱的 topic # --cafile : 指定伺服器憑証檔案 # --cert : 指定用戶憑証檔案 # --key : 指定憑証密鑰 |
發佈命令
1 2 3 4 5 6 7 8 9 |
mosquitto_pub -d -h test.mosquitto.org -p 8884 -t topic -m "Hello! World" --cafile mosquitto.org.crt --cert client.crt --key client.key # -d : 啟用 debug 訊息 # -h : 指定要連線的 broker 伺服器 # -p : 通訊埠。 Mosquitto 的公開伺服器, 8884 是給 TLS 連線專案。 # -t : 要發佈的 topic # -m : 發佈的內容 # --cafile : 指定伺服器憑証檔案 # --cert : 指定用戶憑証檔案 # --key : 指定憑証密鑰 |
當訂閱程式啟動後,再執行發佈程式,訂閱端就可以收到其訊息了。
結語
本文提及的部份,只是符合個人使用上的需求。其它諸如Broker伺服器架設、Mosquitto 程式編譯、參數解說都沒談到。因為在 IOT 的Arduino系統上,並非使用 Mosquitto Client,伺服器端也非我的負責範圍內。因此側重在憑証的產生與驗証,確保可以產生 Mosquitto 可接受的憑証,再放到 Arduino 上的 MQTT Client。
另外,官方網頁上也有 Mosquitto 的 Windows 版程式,單純當成訂閱端也是蠻方便的,參數上基本相同。
Latest Comments