Linux 中如何使用Mosquitto MQTT?

唐青枫發表於2024-11-28

簡介

mosquito 是一個流行的 Eclipse 開源的 MQTT(訊息佇列遙測傳輸)代理。它輕巧,易於安裝,適用於小型或大型 IoT(物聯網)應用程式。

安裝

# For Debian/Ubuntu-based
sudo apt install mosquitto mosquitto-clients

# Required for Mosquitto on RHEL/CentOS
sudo yum install epel-release  
sudo yum install mosquitto mosquitto-clients

# 使用dnf安裝
sudo dnf install mosquitto mosquitto-clients

啟動 Mosquitto

sudo systemctl enable mosquitto
sudo systemctl start mosquitto

常用選項

  • -h:指定主機IP地址或域名
  • -t:指定主題的名稱
  • -m:傳送的訊息
  • -p:指定埠
  • -u:授權賬戶的使用者名稱
  • -P:授權賬戶的密碼

常用操作

客戶端連線使用IP地址的方式

mosquitto_pub -h localhost -t "home/temperature" -m "22.5"

mosquitto_sub -h localhost -t "home/temperature"

客戶端連線使用域名的方式

域名只需要解析到IP就行

mosquitto_pub -h your-domain.com -p 1883 -t "test/topic" -m "Hello MQTT"

mosquitto_sub -h your-domain.com -p 1883 -t "test/topic"

客戶端連線使用SSL的方式

  • 安裝 certbot
# Ubuntu/Debian
sudo apt update
sudo apt install certbot

# CentOS/RHEL
sudo yum install epel-release
sudo yum install certbot
  • 使用 Certbot 生成免費證書

使用 Standalone 模式,沒有 Web 服務時

sudo certbot certonly --standalone -d mqtt.example.com

使用 Webroot 模式,有 Web 服務時

sudo certbot certonly --webroot -w /var/www/html -d mqtt.example.com
  • 配置 Mosquitto 使用證書

mosquitto.conf 配置檔案中新增:

# 設定 TLS/SSL 監聽埠(預設 8883)
listener 8883

# 根證書鏈檔案
cafile /etc/letsencrypt/live/mqtt.example.com/fullchain.pem

# 域名證書檔案
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem

# 私鑰檔案
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
  • 重啟 Mosquitto 服務
sudo systemctl restart mosquitto
  • 連線配置了 SSLMosquitto
# --capath 指定包含可信任 CA 根證書的目錄路徑
mosquitto_pub -h mqtt.example.com -p 8883
 --capath /etc/ssl/certs -t "test" -m "Hello, MQTT over TLS!"

# --cafile 用於自定義的單個 CA 檔案,例如測試環境或自簽名證書

mosquitto_pub -h mqtt.example.com -p 8883
 --cafile /path/to/custom-ca.pem -t "test" -m "Hello, MQTT over TLS!"
  • 設定自動續期證書
sudo certbot renew --dry-run
  • 使用計劃任務自動續期
0 3 * * * certbot renew --quiet && systemctl restart mosquitto

設定使用者名稱密碼

  • 建立或更新 Mosquitto 密碼檔案
sudo mosquitto_passwd -c /etc/mosquitto/password_file [username]

# username 為自定義設定的使用者名稱
# 輸入完以上命令後會提示輸入密碼
  • 修改 Mosquitto 配置檔案

mosquitto.conf 中啟用密碼認證

# 表示禁止匿名使用者登入,需要使用者名稱密碼
allow_anonymous false

# 指定密碼檔案的位置
password_file /etc/mosquitto/password_file

password_file 可以自定義名稱,裡面內容與 /etc/shadow 裡面儲存密碼格式型別。

  • 重啟 Mosquitto 服務
sudo systemctl restart mosquitto
  • 客戶端連線時提供使用者名稱密碼
mosquitto_pub -h your-domain.com -p 1883 -u "username" -P "password"
 -t "test/topic" -m "Hello MQTT"

mosquitto_sub -h your-domain.com -p 1883 -u "username" -P "password"
 -t "test/topic"

配置 ACL 規則

ACL(Access Control List,訪問控制列表) 是用來定義客戶端對主題的訪問許可權的規則配置檔案。

透過 ACL,可以精確控制哪些客戶端可以訂閱或釋出哪些主題

  • 建立 ACL 檔案
sudo vim /etc/mosquitto/acl
  • 配置 ACL 規則

ACL 規則語法

# 允許匿名客戶端的預設許可權(如果啟用匿名訪問)
topic read #

# 為某個使用者指定許可權
user <username>
topic <access> <topic>

示例配置:

# 允許匿名使用者只讀訪問所有主題
topic read #

# 限制特定使用者訪問
user client1
topic write sensors/temperature
topic read sensors/temperature

# client2 只能讀取 home/light
user client2
topic read home/light

# client3 可以讀寫所有主題
user client3
topic read #
topic write #

# read 允許訂閱
# write 允許釋出
# #號匹配當前及其子級所有主題
# +號匹配當前級別的單個主題 

相關文章