楊皓程 2022/09/08
Last Updated on 2022/09/16 14:16
1-1. Ubuntu 伺服器環境軟體更新
確保軟體版本符合本篇文章所用的環境,需使用 apt 將軟體升級到最新版本,此次操作使用 PuTTY 用 root 權限透過 ssh 連線至伺服器
1-2. 安裝 MQTT 服務及測試工具
首先透過 apt-get 安裝 mosquitto 及 mosquitto-clients 套件
1-3. 測試 MQTT 服務(無安全性,本機測試)
測試 MQTT 需要開啟兩個 PuTTY 視窗,A視窗執行訂閱(Subscribe),B視窗執行推播(Publish)
視窗A:執行訂閱 Subscribe 頻道
視窗B:執行推播 Publish 頻道
成功的話就可以從B視窗送出指令,就可以從A視窗接收到訊息
1-4. 設定具帳號密碼認證的 MQTT 服務
修改 mosquitto 設定檔 /etc/mosquitto/conf.d/test.conf
※第一次新增帳號mosquitto_passwd指令後面的參數為-c (create a new password file. This will overwrite existing files.),將會覆蓋整個檔案,第二次新增帳號就不需要-c的參數了
※為了方便新增帳號,可以加入指令參數-b (run in batch mode to allow passing passwords on the command line.),並將密碼直接放帳號後即可
※刪除MQTT使用者
1-5. 測試 MQTT 服務(帳號密碼認證,本機測試)
測試 MQTT 需要開啟兩個 PuTTY 視窗,A視窗執行訂閱(Subscribe),B視窗執行推播(Publish)
視窗A:執行訂閱 Subscribe 頻道 (帳號: test,密碼: test123)
視窗B:執行推播 Publish 頻道 (帳號: test,密碼: test123)
成功的話就可以從B視窗送出指令,就可以從A視窗接收到訊息
1-6. 測試 MQTT 服務(帳號密碼認證,遠端測試)
這個時間跟 1-5 目的相同,差別在於在不同電腦及軟體測試,測試的電腦與伺服器不同網域,需要確認伺服器是否有固定IP
首先要確認伺服器位址,如果是虛擬IP,兩台電腦必須都是同在一個網域內才有辦法連線,透過 ifconfig 指令可以查詢到目前伺服器網路的狀態
如上例,我們知道目前伺服器的IP為 192.168.88.11 ,因此我們測試的電腦就必須在相同區域網路內,才能連線
測試工具使用 Chrome Extension - MQTTBox 作為 MQTT 測試,安裝完成後啟動應用程式
啟動程式後,點選 Create MQTT Client
MQTT Client Name: 輸入連線名稱,範例: HC-Server
MQTT Client Id: 可以不用改,或按自動產生
Protocol: 選擇MQTT/TCP
Host: 輸入伺服器IP,範例: 192.168.88.11
Username: 1-4 設定之驗證帳號,範例: test
Password: 1-4 設定之驗證密碼,範例: test123
其他選項不需要修改,最下面按下 Save 即可
完成設定後,會自動連線到 MQTT 伺服器,上方狀態顯示 Connected 就表示成功連線了
Add subscribeer > 填寫 Topic to subscribe [範例: testchanel] > Subscribe
Add publisher > Topic to publish [範例: testchanel] > Payload [範例: Hello MQTT] > Publish
成功送出就可以在右邊 subscribe 看到訊息
2-1. mqtt_auth_subscribe.py 下載
# -*- coding: utf-8 -*- import paho.mqtt.client as mqtt #訂閱[testchanel] def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client.subscribe("testchanel") #收到訂閱 def on_message(client, userdata, msg): print(msg.topic+" "+ msg.payload.decode('utf-8')) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.username_pw_set("test","test123") client.connect("localhost", 1883, 60) client.loop_forever()
# -*- coding: utf-8 -*- import paho.mqtt.client as mqtt import random import json import time client = mqtt.Client() # 設定登入帳號密碼 client.username_pw_set("test","test123") client.connect("localhost", 1883, 60) while True: #隨機濕度50~60 value = random.randint(50,60) #送出訊息 payload = {"value":value} print(payload) #發送目的 client.publish("testchanel", json.dumps(payload)) #延遲5秒 time.sleep(5)