色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

利用云主機快速開發MQTT客戶端仿真硬件上云IoTDA

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2025-01-13 14:15 ? 次閱讀

一、前言

1.1 開發背景

隨著物聯網技術的不斷發展,越來越多的設備和應用依賴于實時數據交換和遠程控制。在物聯網生態系統中,設備與云平臺之間的通信是核心環節之一,然而對于許多開發者來說,進行這種設備與云平臺之間的通信往往涉及到硬件的配置與調試,這對于一些不熟悉硬件的開發者,尤其是那些處于軟件開發領域的人員,可能是一大挑戰。傳統的物聯網開發往往需要開發者擁有一定的硬件基礎,或者至少具備與硬件設備進行調試和交互的能力,這使得一些開發者在沒有硬件設備的情況下,難以快速上手和測試物聯網應用。

為了解決這一問題,開發者迫切需要一種能夠模擬硬件設備并與云平臺進行交互的工具。通過軟件仿真硬件的方式,開發者可以不依賴于實際硬件設備,就能夠快速學習、理解和驗證物聯網應用中設備與云平臺的通信過程。這種仿真方法不僅能夠降低開發門檻,還能夠幫助開發者更好地理解物聯網系統的工作原理,并有效加速物聯網項目的開發周期。

本項目正是在這樣的背景下應運而生。通過開發一款基于MQTT協議的客戶端調試助手,項目旨在為開發者提供一個簡單易用的工具,模擬硬件設備與云平臺的通信交互。這款工具通過軟件模擬了物聯網設備的行為,支持主題的訂閱與發布,能夠與華為云物聯網平臺(IoTDA)進行實時通信。對于不熟悉硬件的開發者,或者暫時沒有硬件設備的開發者而言,這款調試助手可以讓他們在沒有物理硬件的前提下,體驗完整的物聯網設備上云過程。開發者可以通過該工具快速了解設備如何連接云平臺,如何進行數據傳輸,并學習MQTT協議的基本操作。

此外,物聯網技術本身發展迅速,而MQTT作為一種輕量級、高效的消息傳輸協議,已成為物聯網設備與云平臺之間通信的首選協議。利用MQTT,設備可以以低帶寬、高可靠性的方式與云平臺進行實時數據交換。為了幫助開發者熟悉和掌握這一協議,本項目采用了paho-mqtt庫,它是一個開源的Python庫,能夠簡化MQTT協議的實現,使得開發者能夠專注于業務邏輯,而無需過多擔心底層通信細節。

本項目的目標不僅僅是為開發者提供一個調試工具,更重要的是通過仿真硬件的方式,使得開發者能夠從軟件層面全面體驗物聯網設備上云的全過程。這不僅有助于他們更好地理解物聯網的通信機制,還能夠為未來的硬件開發和云平臺集成打下基礎。通過本項目,開發者能夠在一個完全虛擬的環境中學習和掌握物聯網開發的基本技能,為日后的實際硬件開發做好準備。

本項目的實現將有助于推廣物聯網技術的普及和應用,讓更多的開發者能夠在沒有硬件的情況下,通過軟件模擬快速掌握物聯網設備的云端通信技術,為物聯網應用的發展提供更加廣泛的人才支持和技術儲備。

當前項目使用的相關軟件工具已經上傳到網盤:
[https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink]

代碼設計界面:

image-20241218161112256

運行效果:

image-20241218161153473

填入信息

image-20241218162907871

最終設計完成的界面如下:

image-20241218163313502

1.2 云主機

這里使用的華為云開發者空間云主機,是華為云為全球開發者打造的一個云端開發環境,簡化開發流程、提高開發效率,并促進技術創新。這個平臺提供了一個無需成本即可探索和使用華為云服務的機會,每位注冊的開發者在年度內都能享有數百小時的云主機使用權。云主機預裝了CodeArts IDE(華為云的集成開發環境)、代碼倉庫以及JDK、Python等關鍵運行時插件,從而避免了本地環境配置的復雜性,讓開發者能夠快速上手并立即開始工作。

除了云主機外,華為云還提供了5GB的云存儲容量及定制化的場景模擬沙箱,這些資源幫助開發者在安全隔離的環境中進行實驗和測試。華為云開發者空間提供了豐富的技術培訓課程和專業認證資料,助力開發者提升技能,并通過認證來證明自己的能力。該空間特別注重于應用全周期管理,涵蓋從應用構建到運維的全過程,確保開發者可以高效地完成云端應用搭建。

華為云開發者空間云主機圍繞CodeArts IDE打造了一個全面的開發工具生態系統,整合了鯤鵬、昇騰、鴻蒙等核心生態的開發資源,提供廣泛的開源軟件庫和實用開發插件,支持從代碼托管到應用運維的各個階段。這不僅提升了開發效率,也方便了開發者與華為先進技術和全球開發者社區互動,共同推動技術進步和應用創新。

華為云開發者空間云主機的操作系統版本為Ubuntu 22.04.4 LTS,并且內置了一些常用的應用程序如Gitcode等,為開發者提供了一個穩定而高效的開發環境。

1.3 開發環境

本項目的開發環境采用了華為開發者空間的云主機,這一環境為全球開發者提供了一個功能強大且易于訪問的云端開發平臺。開發者可以通過這一平臺進行快速的應用開發、調試和部署,省去了本地環境配置和硬件限制等問題。整個開發環境包括了操作系統、開發語言、開發框架、工具鏈以及云端資源等多個方面。

(1)云主機平臺:華為開發者空間

華為開發者空間是華為云為開發者提供的一個云端開發環境,能夠幫助開發者無需復雜的本地環境配置即可開展工作。該平臺提供了強大的計算資源和開發工具,能夠滿足大規模開發和調試的需求。在本項目中,云主機提供了一個統一的、穩定的開發環境,開發者只需要通過瀏覽器即可訪問,不需要擔心操作系統的配置、版本兼容性等問題。這種云端開發方式特別適合開發與云服務緊密集成的物聯網應用,能夠高效地進行實時測試和調試。

(2)操作系統:Ubuntu 22.04.4

整個開發環境基于Ubuntu 22.04.4操作系統運行,Ubuntu作為一種流行的Linux發行版,因其穩定性、開源性和豐富的軟件支持而被廣泛應用于開發領域。Ubuntu 22.04.4是該系統的LTS(長期支持)版本,提供了長期的安全更新和穩定性支持,適合進行生產環境中的應用開發。對于Python開發者而言,Ubuntu提供了優良的包管理工具和開發工具,能夠方便地安裝各種開發所需的庫和工具。

(3)開發語言:Python

項目采用Python作為主要開發語言,Python因其簡潔的語法、強大的庫支持和廣泛的應用場景,成為了開發者常用的語言。Python的跨平臺特性使得應用能夠在不同的操作系統上無縫運行,而其龐大的第三方庫(如paho-mqtt)則為開發者提供了許多現成的解決方案。本項目中,Python用于實現MQTT協議的客戶端功能,包括消息的訂閱、發布和連接管理等核心操作。

(4) 界面開發框架:PyQt5

為了提升用戶體驗并提供便捷的圖形化界面,本項目采用了PyQt5作為界面開發框架。PyQt5是Python的Qt庫綁定,提供了一套豐富的用戶界面組件,開發者可以用它來快速構建高效、美觀且跨平臺的桌面應用程序。通過PyQt5,開發者可以設計直觀的界面,幫助用戶通過圖形化操作進行MQTT主題的訂閱、消息的發布和設備狀態的監控。PyQt5的信號與槽機制也使得界面的事件響應和后臺邏輯處理更加簡潔高效。

(5)MQTT客戶端庫:paho-mqtt

項目中的MQTT協議操作主要通過paho-mqtt庫來實現。paho-mqtt是由Eclipse基金會提供的一個廣泛使用的Python MQTT客戶端庫,它支持MQTT協議的各種操作,如客戶端連接、消息的發布和訂閱、消息的接收等。paho-mqtt庫在本項目中承擔著與華為云物聯網平臺進行通信的核心功能,能夠保證數據的實時傳輸和可靠性。

(6)開發工具:CodeArts IDE

CodeArts IDE是華為開發者空間提供的集成開發環境,它為開發者提供了豐富的開發工具和調試功能。該IDE內置了代碼編輯、版本控制、調試等多種功能,并且預先配置好了開發環境,開發者可以直接進入開發狀態。通過CodeArts IDE,開發者可以在云端編寫代碼、執行調試、管理版本等,而不需要擔心本地環境配置的問題。此外,CodeArts IDE的云端特性也使得開發者能夠隨時隨地進行開發,無論是在不同的設備還是不同的地理位置,都能夠保持一致的開發體驗。

1.4 功能說明

本項目主要解決以下幾個問題:

  1. 模擬硬件設備 :通過軟件模擬物聯網設備,允許開發者在沒有實際硬件的情況下體驗設備與云平臺的通信過程。
  2. 簡化調試流程 :提供圖形化界面和簡易操作,降低了調試和測試的門檻,尤其適合沒有硬件設備的開發者進行學習和驗證。
  3. 實現MQTT協議的基本功能 :通過paho-mqtt庫,支持MQTT協議中的主題訂閱、消息發布等功能,讓開發者能夠快速掌握物聯網通信的核心技術。

本項目主要實現了以下幾項核心功能:

(1)主題訂閱功能

在物聯網通信中,設備通常需要訂閱云平臺上的特定主題(Topic),以便接收實時消息或指令。通過主題訂閱功能,開發者可以模擬設備通過MQTT協議與云平臺進行通信,獲取云平臺推送的消息。此功能支持以下操作:

  • 輸入主題名稱 :用戶可以手動輸入MQTT主題名稱。
  • 訂閱主題 :模擬硬件設備訂閱云平臺的指定主題,等待云平臺推送消息。
  • 查看消息 :訂閱成功后,客戶端能夠實時顯示從云平臺接收到的消息,幫助開發者了解訂閱是否成功以及接收到的內容。

(2)主題發布功能

在物聯網應用中,設備通常會將采集到的數據或狀態信息推送到云平臺。這一過程通過主題發布實現。在本項目中,開發者可以模擬設備向云平臺發布消息,操作步驟包括:

  • 選擇主題 :用戶可以選擇一個已有的主題或創建新的主題。
  • 發布消息 :通過輸入消息內容,模擬設備將數據發布到指定的MQTT主題。
  • 消息傳遞確認 :客戶端會向用戶顯示消息是否成功發布,以及云平臺是否已經成功接收。

(3)MQTT連接管理

為了確保與華為云物聯網平臺的通信穩定,項目提供了MQTT連接管理功能,允許開發者:

  • 連接到華為云IoTDA平臺 :通過設置MQTT代理地址和認證信息,開發者能夠輕松連接到華為云物聯網平臺。
  • 自動重連 :當連接出現問題或網絡中斷時,客戶端可以自動嘗試重新連接,確保設備與平臺的穩定通信。
  • 查看連接狀態 :客戶端實時顯示連接狀態,幫助開發者了解當前的網絡連接情況及連接穩定性。

(4)圖形化用戶界面(GUI)

本項目使用PyQt5構建了一個直觀、易操作的圖形化界面,具體包括:

  • 用戶友好的界面 :通過清晰的按鈕、文本框和消息顯示框,使得開發者可以直觀地進行操作,例如輸入主題、發布消息、查看訂閱的消息等。
  • 操作日志 :界面中展示了連接、訂閱、發布等操作的日志信息,幫助開發者實時查看操作狀態和通信結果。
  • 事件驅動機制 :通過PyQt5的信號與槽機制,客戶端能夠快速響應用戶的操作,執行相應的MQTT協議功能,確保交互過程流暢且無延遲。

(5)實時消息顯示和調試

為了方便開發者進行調試,項目提供了實時的消息顯示功能。每當有新的消息被發布或接收時,客戶端界面會立即更新,開發者可以:

  • 查看接收到的消息內容 :幫助開發者驗證主題訂閱和消息發布的有效性。
  • 調試信息輸出 :在操作過程中,客戶端會顯示詳細的調試信息,幫助開發者跟蹤操作步驟,查找并解決潛在的問題。

(6)支持多平臺運行

通過使用PyQt5框架,項目能夠實現跨平臺運行,開發者可以在不同的操作系統(如Windows、Linux、macOS)上運行調試助手。這使得該工具不僅限于某一操作系統,開發者可以在任何操作系統上進行測試和學習。

(7)MQTT協議的學習和測試工具

本項目不僅僅是一個調試工具,還是一個學習和測試平臺。開發者可以通過該工具快速掌握MQTT協議的基本概念,包括如何建立連接、如何訂閱和發布消息、如何管理MQTT會話等。通過模擬硬件設備與云平臺的交互,開發者能夠更清楚地理解物聯網通信的工作原理,為實際的硬件開發奠定基礎。

二、華為云開發者空間

這一個章節介紹華為云主機的配置與使用。

2.1 進入開發者空間

鏈接地址:[https://developer.huaweicloud.com/space/devportal/desktop]

登錄華為云賬號,進去之后看到的頁面如下:

image-20241128112456710

2.2 配置云主機

在左上角可以看到云主機的配置提醒,目前默認是基礎版。

image-20241128112719601

點擊配置云主機,會彈出對話框,讓你選擇云主機的配置,進行安裝系統。我這里選擇ubuntu 22.04.

image-20241128112849373

2.3 安裝系統

點擊安裝后,會進行安裝系統。需要等等一段時間。

image-20241128112946066

image-20241128113018917

2.4 啟動云主機

安裝完畢之后,直接可以在瀏覽器里啟動云主機。

image-20241128115019990

啟動需要一段時間初始環境。

image-20241128115003882

進去之后會有引導界面,提示云主機的使用技巧。

image-20241128115120299

進入桌面后的默認效果如下。

image-20241128132247230

2.5 全屏切換

在桌面頁面上有個按鈕可以全屏切換,切換全屏后,可視化空間更大,開發更加方便。

image-20241128132652870

2.6 共享桌面

云主機還有共享桌面功能,如果需要遠程演示項目,共享開發過程,對方還可以遠程操作,這個功能非常的方便。 直接雙擊666

image-20241128132902031

2.5 測試Python開發環境

點擊左下角的所有應用程序,可以看到開發菜單里,有安裝好的Python環境,可以直接使用。

image-20241128133211189

啟動之后的效果如下。

image-20241128133407115

進去之后,點擊左上角,新建一個文件。

image-20241128133738010

然后保存文件,名字叫:test.py

image-20241128134016923

image-20241128134054067

然后編寫一段簡單的python代碼,測試當前的開發環境是否正常。

image-20241128134212194

代碼如下:

import socket

def get_local_ip():
    """
    獲取本地 IP 地址
    """
    try:
        # 創建一個 socket 對象,并連接到一個公共地址
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("8.8.8.8", 80))
        local_ip = s.getsockname()[0]
        s.close()
        return local_ip
    except Exception as e:
        return f"無法獲取本地 IP 地址: {e}"

if __name__ == '__main__':
    print("本地 IP 地址是:", get_local_ip())

點擊左上角運行。

image-20241128134259768

結果如下:

image-20241128134333622

2.6 安裝requests庫

接下來需要使用Python代碼的requests庫,發起HTTP請求。先提前安裝環境。

image-20241128144050189

2.7 安裝Pillow庫

PillowPIL(Python Imaging Library)的一個分支,提供了圖片處理功能。

pip3 install Pillow

image-20241128230449973

2.8 安裝paho-mqtt庫

安裝命令:

pip install paho-mqtt

image-20241218155230287

到此,云主機的開發環境已經測試OK。

三、配置華為云物聯網平臺IOTDA

華為云官網: https://www.huaweicloud.com/

打開官網,搜索物聯網,就能快速找到 設備接入IoTDA

image-20221204193824815

3.1 物聯網平臺介紹

華為云物聯網平臺(IoT 設備接入云服務)提供海量設備的接入和管理能力,將物理設備聯接到云,支撐設備數據采集上云和云端下發命令給設備進行遠程控制,配合華為云其他產品,幫助我們快速構筑物聯網解決方案。

使用物聯網平臺構建一個完整的物聯網解決方案主要包括3部分:物聯網平臺、業務應用和設備。

物聯網平臺作為連接業務應用和設備的中間層,屏蔽了各種復雜的設備接口,實現設備的快速接入;同時提供強大的開放能力,支撐行業用戶構建各種物聯網解決方案。

設備可以通過固網、2G/3G/4G/5G、NB-IoT、Wifi等多種網絡接入物聯網平臺,并使用LWM2M/CoAP、MQTT、HTTPS協議將業務數據上報到平臺,平臺也可以將控制命令下發給設備。

業務應用通過調用物聯網平臺提供的API,實現設備數據采集、命令下發、設備管理等業務場景。

img

3.2 開通物聯網服務

地址: https://www.huaweicloud.com/product/iothub.html

image-20221204194233414

點擊立即創建

image-20240117134653452

正在創建標準版實例,需要等待片刻。

image-20240117134729401

創建完成之后,點擊實例名稱。 可以看到標準版實例的設備接入端口和地址。

image-20240425180759670

在上面也能看到 免費單元的限制。

image-20240425180817704

開通之后,點擊總覽,也能查看接入信息。 我們當前設備準備采用MQTT協議接入華為云平臺,這里可以看到MQTT協議的地址和端口號等信息。

image-20240425180845461

總結:

端口號:   MQTT (1883)| MQTTS (8883)	
接入地址:ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com

**根據域名地址得到IP地址信息: **

打開Windows電腦的命令行控制臺終端,使用ping 命令。ping一下即可。

Microsoft Windows [版本 10.0.19045.4170]
(c) Microsoft Corporation。保留所有權利。

C:Users11266 >ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com

正在 Ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字節的數據:
來自 117.78.5.125 的回復: 字節=32 時間=35ms TTL=93
來自 117.78.5.125 的回復: 字節=32 時間=36ms TTL=93
來自 117.78.5.125 的回復: 字節=32 時間=36ms TTL=93
來自 117.78.5.125 的回復: 字節=32 時間=39ms TTL=93

117.78.5.125 的 Ping 統計信息:
    數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
    最短 = 35ms,最長 = 39ms,平均 = 36ms

C:Users11266 >

MQTT協議接入端口號有兩個,1883是非加密端口,8883是證書加密端口,單片機無法加載證書,所以使用1883端口比較合適。 接下來的ESP8266就采用1883端口連接華為云物聯網平臺。

3.3 創建產品

(1)創建產品

image-20230109164412041

(2)填寫產品信息

根據自己產品名字填寫,下面的設備類型選擇自定義類型。

image-20240612094809689

(3)產品創建成功

image-20240612095148945

創建完成之后點擊查看詳情。

image-20240612095134263

(4)添加自定義模型

產品創建完成之后,點擊進入產品詳情頁面,翻到最下面可以看到模型定義。

模型簡單來說: 就是存放設備上傳到云平臺的數據。

你可以根據自己的產品進行創建。

比如:

煙霧可以叫  MQ2
溫度可以叫  Temperature
濕度可以叫  humidity
火焰可以叫  flame
其他的傳感器自己用單詞簡寫命名即可。 這就是你的單片機設備端上傳到服務器的數據名字。

先點擊自定義模型。

image-20240612095517900

再創建一個服務ID。

image-20240612095542749

接著點擊新增屬性。

image-20240612095648815

image-20240612095711898

3.4 添加設備

產品是屬于上層的抽象模型,接下來在產品模型下添加實際的設備。添加的設備最終需要與真實的設備關聯在一起,完成數據交互。

(1)注冊設備

image-20240425181935561

(2)根據自己的設備填寫

image-20240612100115167

(3)保存設備信息

創建完畢之后,點擊保存并關閉,得到創建的設備密匙信息。該信息在后續生成MQTT三元組的時候需要使用。

image-20240612100128061

(4)設備創建完成

image-20240612100147232

(5)設備詳情

image-20240612100202960

image-20240612100217236

3.5 MQTT協議主題訂閱與發布

(1)MQTT協議介紹

當前的設備是采用MQTT協議與華為云平臺進行通信。

MQTT是一個物聯網傳輸協議,它被設計用于輕量級的發布/訂閱式消息傳輸,旨在為低帶寬和不穩定的網絡環境中的物聯網設備提供可靠的網絡服務。MQTT是專門針對物聯網開發的輕量級傳輸協議。MQTT協議針對低帶寬網絡,低計算能力的設備,做了特殊的優化,使得其能適應各種物聯網應用場景。目前MQTT擁有各種平臺和設備上的客戶端,已經形成了初步的生態系統。

MQTT是一種消息隊列協議,使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合,相對于其他協議,開發更簡單;MQTT協議是工作在TCP/IP協議上;由TCP/IP協議提供穩定的網絡連接;所以,只要具備TCP協議棧的網絡設備都可以使用MQTT協議。 本次設備采用的ESP8266就具備TCP協議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協議,就可以與華為云平臺完成通信。

華為云的MQTT協議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

img

業務流程:

img

(2)華為云平臺MQTT協議使用限制

描述限制
支持的MQTT協議版本3.1.1
與標準MQTT協議的區別支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg
MQTTS支持的安全等級采用TCP通道基礎 + TLS協議(最高TLSv1.3版本)
單帳號每秒最大MQTT連接請求數無限制
單個設備每分鐘支持的最大MQTT連接數1
單個MQTT連接每秒的吞吐量,即帶寬,包含直連設備和網關3KB/s
MQTT單個發布消息最大長度,超過此大小的發布請求將被直接拒絕1MB
MQTT連接心跳時間建議值心跳時間限定為30至1200秒,推薦設置為120秒
產品是否支持自定義Topic支持
消息發布與訂閱設備只能對自己的Topic進行消息發布與訂閱
每個訂閱請求的最大訂閱數無限制

(3)主題訂閱格式

幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

image-20221207153310037

對于設備而言,一般會訂閱平臺下發消息給設備 這個主題。

設備想接收平臺下發的消息,就需要訂閱平臺下發消息給設備 的主題,訂閱后,平臺下發消息給設備,設備就會收到消息。

如果設備想要知道平臺下發的消息,需要訂閱上面圖片里標注的主題。

以當前設備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
    
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down

(4)主題發布格式

對于設備來說,主題發布表示向云平臺上傳數據,將最新的傳感器數據,設備狀態上傳到云平臺。

這個操作稱為:屬性上報。

幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

image-20221207153637391

根據幫助文檔的介紹, 當前設備發布主題,上報屬性的格式總結如下:

發布的主題格式:
$oc/devices/{device_id}/sys/properties/report
 
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發布主題時,需要上傳數據,這個數據格式是JSON格式。

上傳的JSON數據格式如下:

{
  "services": [
    {
      "service_id": < 填服務ID >,
      "properties": {
        "< 填屬性名稱1 >": < 填屬性值 >,
        "< 填屬性名稱2 >": < 填屬性值 >,
        ..........
      }
    }
  ]
}
根據JSON格式,一次可以上傳多個屬性字段。 這個JSON格式里的,服務ID,屬性字段名稱,屬性值類型,在前面創建產品的時候就已經介紹了,不記得可以翻到前面去查看。

根據這個格式,組合一次上傳的屬性數據:
{"services": [{"service_id": "stm32","properties":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}

3.6 MQTT三元組

MQTT協議登錄需要填用戶ID,設備ID,設備密碼等信息,就像我們平時登錄QQ,微信一樣要輸入賬號密碼才能登錄。MQTT協議登錄的這3個參數,一般稱為MQTT三元組。

接下來介紹,華為云平臺的MQTT三元組參數如何得到。

(1)MQTT服務器地址

要登錄MQTT服務器,首先記得先知道服務器的地址是多少,端口是多少。

幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

image-20240509193207359

MQTT協議的端口支持1883和8883,它們的區別是:8883 是加密端口更加安全。但是單片機上使用比較困難,所以當前的設備是采用1883端口進連接的。

根據上面的域名和端口號,得到下面的IP地址和端口號信息: 如果設備支持填寫域名可以直接填域名,不支持就直接填寫IP地址。 (IP地址就是域名解析得到的)

華為云的MQTT服務器地址:117.78.5.125
華為云的MQTT端口號:1883

如何得到IP地址?如何域名轉IP? 打開Windows的命令行輸入以下命令。

ping  ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com

image-20240425182610048

(2)生成MQTT三元組

華為云提供了一個在線工具,用來生成MQTT鑒權三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打開這個工具,填入設備的信息(也就是剛才創建完設備之后保存的信息),點擊生成,就可以得到MQTT的登錄信息了。

下面是打開的頁面:

image-20240425183025893

填入設備的信息: (上面兩行就是設備創建完成之后保存得到的)

直接得到三元組信息。

image-20240509193310020

得到三元組之后,設備端通過MQTT協議登錄鑒權的時候,填入參數即可。

ClientId  663cb18871d845632a0912e7_dev1_0_0_2024050911
Username  663cb18871d845632a0912e7_dev1
Password  71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237

3.7 模擬設備登錄測試

經過上面的步驟介紹,已經創建了產品,設備,數據模型,得到MQTT登錄信息。 接下來就用MQTT客戶端軟件模擬真實的設備來登錄平臺。測試與服務器通信是否正常。

(1)填入登錄信息

打開MQTT客戶端軟件,對號填入相關信息(就是上面的文本介紹)。然后,點擊登錄,訂閱主題,發布主題。

image-20240509193457358

(2)打開網頁查看

完成上面的操作之后,打開華為云網頁后臺,可以看到設備已經在線了。

image-20240612100508790

點擊詳情頁面,可以看到上傳的數據:

image-20240612100529581

到此,云平臺的部署已經完成,設備已經可以正常上傳數據了。

(3)MQTT登錄測試參數總結

MQTT服務器:  117.78.5.125
MQTT端口號:  183

//物聯網服務器的設備信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"

//訂閱與發布的主題
#define SET_TOPIC  "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down"  //訂閱
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report"  //發布


發布的數據:
{"services": [{"service_id": "stm32","properties":{"DHT11_T":30,"DHT11_H":10,"BH1750":1,"MQ135":0}}]}

3.8 創建IAM賬戶

創建一個IAM賬戶,因為接下來開發上位機,需要使用云平臺的API接口,這些接口都需要token進行鑒權。簡單來說,就是身份的認證。 調用接口獲取Token時,就需要填寫IAM賬號信息。所以,接下來演示一下過程。

地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

**【1】獲取項目憑證 ** 點擊左上角用戶名,選擇下拉菜單里的我的憑證

image-20240509193646253

image-20240509193701262

項目憑證:

28add376c01e4a61ac8b621c714bf459

【2】創建IAM用戶

鼠標放在左上角頭像上,在下拉菜單里選擇統一身份認證

image-20240509193729078

點擊左上角創建用戶

image-20240509193744287

image-20240314153208692

image-20240314153228359

image-20240314153258229

創建成功:

image-20240314153315444

【3】創建完成

image-20240509193828289

用戶信息如下:

主用戶名  l19504562721
IAM用戶  ds_abc
密碼     DS12345678

3.9 獲取影子數據

幫助文檔:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html

設備影子介紹:

設備影子是一個用于存儲和檢索設備當前狀態信息的JSON文檔。
每個設備有且只有一個設備影子,由設備ID唯一標識
設備影子僅保存最近一次設備的上報數據和預期數據
無論該設備是否在線,都可以通過該影子獲取和設置設備的屬性

簡單來說:設備影子就是保存,設備最新上傳的一次數據。

我們設計的軟件里,如果想要獲取設備的最新狀態信息,就采用設備影子接口。

如果對接口不熟悉,可以先進行在線調試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow

在線調試接口,可以請求影子接口,了解請求,與返回的數據格式。

調試完成看右下角的響應體,就是返回的影子數據。

image-20240509194152229

設備影子接口返回的數據如下:

{
 "device_id": "663cb18871d845632a0912e7_dev1",
 "shadow": [
  {
   "service_id": "stm32",
   "desired": {
    "properties": null,
    "event_time": null
   },
   "reported": {
    "properties": {
     "DHT11_T": 18,
     "DHT11_H": 90,
     "BH1750": 38,
     "MQ135": 70
    },
    "event_time": "20240509T113448Z"
   },
   "version": 3
  }
 ]
}

調試成功之后,可以得到訪問影子數據的真實鏈接,接下來的代碼開發中,就采用Qt寫代碼訪問此鏈接,獲取影子數據,完成上位機開發。

image-20240509194214716

鏈接如下:

https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow

四、圖形化界面開發

4.1 安裝PyQt5

為了方便能直觀的展示項目的整體功能,接下來安裝PyQt,完成MQTT調試助手的設計。

在Python中安裝PyQt庫非常簡單,可以使用pip這個包管理工具來完成。PyQt有兩個主要版本:PyQt5(基于Qt 5)和PyQt6(基于Qt 6)。

我這里安裝Qt5,以Qt5為例進行開發。

要安裝PyQt5,打開命令行界面,然后運行以下命令:

pip install PyQt5

安裝過程中:

image-20241128222327822

安裝完畢。

image-20241128222708039

4.2 安裝QtDesigner

如果想使用PyQt5的設計工具(Qt Designer),用圖形方式設計界面,可以安裝pyqt5-tools

pip install pyqt5-tools

安裝過程如下:

image-20241128222745062

安裝過程中

image-20241128223523710

安裝完畢。

image-20241128224259036

4.3 測試Qt環境

安裝完成后,先寫一份測試代碼,創建一個窗口,運行測試Qt環境是否正常。

新建一個文件:hello_pyqt.py

image-20241128224337337

編寫代碼如下:

import sys
from PyQt5.QtWidgets import QApplication, QWidget  # 如果使用PyQt6,這里改為 from PyQt6.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)

window = QWidget()
window.setWindowTitle('Hello PyQt')
window.show()

sys.exit(app.exec_())

在終端命令行中運行:

python3 hello_pyqt.py

如果一切正常,應該能看到一個標題為Hello PyQt的空白窗口。這表明PyQt已經成功安裝并且可以正常使用了。

運行效果如下:

image-20241215002633330

4.4 編寫MQTT調試助手【設計界面】

下面是基于PyQt5 的設計的MQTT調試助手,當前只是設計了界面,沒有設計功能。

import sys
from PyQt5.QtCore import Qt  # 導入Qt核心模塊,包含Qt的基礎功能
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QFormLayout, QLabel, QLineEdit, QSpinBox, QPushButton, QGridLayout, QGroupBox, QPlainTextEdit, QSpacerItem, QSizePolicy, QMenuBar, QStatusBar  # 導入PyQt5組件

class MainWindow(QMainWindow):  # 創建主窗口類,繼承自QMainWindow
    def __init__(self):
        super().__init__()

        self.setWindowTitle("MainWindow")  # 設置窗口標題
        self.setGeometry(100, 100, 1019, 772)  # 設置窗口位置和大小

        self.centralWidget = QWidget(self)  # 創建一個中央控件
        self.setCentralWidget(self.centralWidget)  # 設置中央控件為上面創建的控件
        
        # 主布局
        self.mainLayout = QVBoxLayout(self.centralWidget)  # 創建一個垂直布局
        
        # 連接設置布局
        self.connectionLayout = QHBoxLayout()  # 創建水平布局,用于連接設置

        # 創建表單布局,添加各個輸入框
        self.formLayout = QFormLayout()  
        self.hostLineEdit = QLineEdit()  # 創建一個文本框
        self.hostLineEdit.setText("117.78.5.125")  # 設置默認服務器IP地址
        self.formLayout.addRow(QLabel("服務器域名或者IP地址:"), self.hostLineEdit)  # 添加一個標簽和文本框
        
        # 端口號使用QSpinBox
        self.spinBoxPort = QSpinBox()  # 創建一個整數框
        self.spinBoxPort.setMaximum(99999)  # 設置最大值為99999
        self.spinBoxPort.setValue(1883)  # 設置默認端口號為1883
        self.formLayout.addRow(QLabel("服務器端口:"), self.spinBoxPort)  # 添加端口號輸入框

        # 客戶端ID輸入框
        self.clientIdLineEdit = QLineEdit()  
        self.clientIdLineEdit.setText("6746c32eef99673c8ad0812e_dev1_0_0_2024112707")  # 預設客戶端ID
        self.formLayout.addRow(QLabel("ClientId"), self.clientIdLineEdit)  # 添加客戶端ID輸入框

        # 用戶名輸入框
        self.usernameLineEdit = QLineEdit()  
        self.usernameLineEdit.setText("6746c32eef99673c8ad0812e_dev1")  # 預設用戶名
        self.formLayout.addRow(QLabel("Username"), self.usernameLineEdit)  # 添加用戶名輸入框

        # 密碼輸入框
        self.passwordLineEdit = QLineEdit()  
        self.passwordLineEdit.setText("b69234ba506cf2c1c579c4fd407a0a801479a672032fcf5ab9ea126abcf2a8b1")  # 預設密碼
        self.formLayout.addRow(QLabel("Password"), self.passwordLineEdit)  # 添加密碼輸入框

        self.connectionLayout.addLayout(self.formLayout)  # 將表單布局添加到連接設置布局中
        
        # 連接按鈕
        self.connectButton = QPushButton("Connect")  # 創建連接按鈕
        self.connectionLayout.addWidget(self.connectButton)  # 將按鈕添加到連接設置布局中
        
        # 將連接設置布局添加到主布局中
        self.mainLayout.addLayout(self.connectionLayout)
        
        # MQTT 主題和消息布局
        self.gridLayout = QGridLayout()  # 創建網格布局

        self.gridLayout.addWidget(QLabel("訂閱主題:"), 0, 0)  # 添加訂閱主題標簽
        self.subscribeTopicLineEdit = QLineEdit("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/messages/down")  # 設置默認訂閱主題
        self.gridLayout.addWidget(self.subscribeTopicLineEdit, 0, 1)  # 添加訂閱主題文本框
        self.gridLayout.addWidget(QPushButton("訂閱"), 0, 2)  # 添加訂閱按鈕

        self.gridLayout.addWidget(QLabel("發布主題:"), 1, 0)  # 添加發布主題標簽
        self.publishTopicLineEdit = QLineEdit("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/properties/report")  # 設置默認發布主題
        self.gridLayout.addWidget(self.publishTopicLineEdit, 1, 1)  # 添加發布主題文本框

        self.gridLayout.addWidget(QLabel("主題消息:"), 2, 0)  # 添加主題消息標簽
        self.messageLineEdit = QLineEdit()  # 創建主題消息輸入框
        self.gridLayout.addWidget(self.messageLineEdit, 2, 1)  # 添加主題消息文本框
        self.gridLayout.addWidget(QPushButton("發布"), 2, 2)  # 添加發布按鈕

        self.gridLayout.addWidget(QPushButton("點擊發送心跳包"), 3, 2)  # 添加心跳包按鈕

        self.mainLayout.addLayout(self.gridLayout)  # 將網格布局添加到主布局中

        # 日志顯示區域
        self.logGroupBox = QGroupBox("日志消息:")  # 創建一個日志組框
        self.logLayout = QHBoxLayout()  # 創建水平布局
        self.logTextEdit = QPlainTextEdit()  # 創建一個只讀文本框用于顯示日志
        self.logTextEdit.setReadOnly(True)  # 設置文本框為只讀模式
        self.logLayout.addWidget(self.logTextEdit)  # 將文本框添加到布局中
        self.logGroupBox.setLayout(self.logLayout)  # 設置組框布局

        self.mainLayout.addWidget(self.logGroupBox)  # 將日志組框添加到主布局中

        # 底部按鈕布局
        self.bottomLayout = QHBoxLayout()  # 創建水平布局用于底部按鈕
        
        # 創建底部按鈕
        self.testButton = QPushButton("測試按鈕(一鍵填充MQTT信息)")  
        self.clearButton = QPushButton("一鍵清除MQTT信息")
        self.clearLogButton = QPushButton("清除日志消息")
        self.viewTutorialButton = QPushButton("【查看物聯網項目開發教程】")
        self.quitButton = QPushButton("退出軟件")

        self.testButton.clicked.connect(self.fillMQTTInfo)  # 連接填充按鈕點擊事件
        self.clearButton.clicked.connect(self.clearMQTTInfo)  # 連接清除按鈕點擊事件

        self.bottomLayout.addWidget(self.testButton)  # 將測試按鈕添加到底部布局
        self.bottomLayout.addWidget(self.clearButton)  # 將清除按鈕添加到底部布局
        self.bottomLayout.addWidget(self.clearLogButton)  # 將清除日志按鈕添加到底部布局
        self.bottomLayout.addWidget(self.viewTutorialButton)  # 將查看教程按鈕添加到底部布局
        self.bottomLayout.addWidget(self.quitButton)  # 將退出按鈕添加到底部布局

        self.mainLayout.addLayout(self.bottomLayout)  # 將底部按鈕布局添加到主布局中

        # 菜單欄
        self.menuBar = self.menuBar()  # 創建菜單欄
        self.fileMenu = self.menuBar.addMenu("File")  # 添加“File”菜單
        quitAction = self.fileMenu.addAction("Quit")  # 創建退出菜單項
        quitAction.triggered.connect(self.close)  # 連接退出菜單項的點擊事件

        # 狀態欄
        self.statusBar = QStatusBar()  # 創建狀態欄
        self.setStatusBar(self.statusBar)  # 設置窗口的狀態欄

    # 填充MQTT信息的函數
    def fillMQTTInfo(self):
        """填充MQTT服務器信息到表單字段中"""
        self.hostLineEdit.setText("117.78.5.125")  # 設置服務器IP地址
        self.spinBoxPort.setValue(1883)  # 設置端口號
        self.clientIdLineEdit.setText("6746c32eef99673c8ad0812e_dev1_0_0_2024112707")  # 設置客戶端ID
        self.usernameLineEdit.setText("6746c32eef99673c8ad0812e_dev1")  # 設置用戶名
        self.passwordLineEdit.setText("b69234ba506cf2c1c579c4fd407a0a801479a672032fcf5ab9ea126abcf2a8b1")  # 設置密碼
        self.subscribeTopicLineEdit.setText("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/messages/down")  # 設置訂閱主題
        self.publishTopicLineEdit.setText("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/properties/report")  # 設置發布主題

    # 清除MQTT信息的函數
    def clearMQTTInfo(self):
        """清除MQTT服務器信息從表單字段中"""
        self.hostLineEdit.clear()  # 清空IP地址輸入框
        self.spinBoxPort.clear()  # 清空端口號輸入框
        self.clientIdLineEdit.clear()  # 清空客戶端ID輸入框
        self.usernameLineEdit.clear()  # 清空用戶名輸入框
        self.passwordLineEdit.clear()  # 清空密碼輸入框
        self.subscribeTopicLineEdit.clear()  # 清空訂閱主題輸入框
        self.publishTopicLineEdit.clear()  # 清空發布主題輸入框

if __name__ == '__main__':
    app = QApplication(sys.argv)  # 創建應用實例
    mainWin = MainWindow()  # 創建主窗口實例
    mainWin.show()  # 顯示主窗口
    sys.exit(app.exec_())  # 啟動應用并等待退出

4.5 運行結果

image-20241218161100498

運行效果:

image-20241218160956255

image-20241218161204000

五、MQTT客戶端開發

完成 MQTT 客戶端調試助手整體開發,基于 paho-mqtt 庫來實現以下功能:

  1. 連接到 MQTT 服務器 :通過提供的 IP、端口、客戶端 ID、用戶名和密碼連接到 MQTT 服務器。
  2. 訂閱主題 :從用戶輸入的訂閱主題中接收消息。
  3. 發布消息 :發布主題消息到指定的發布主題。
  4. 心跳包功能 :通過發送保活消息來保持與服務器的連接。

每個按鈕添加相應的功能:Connect訂閱發布心跳包。在此基礎上,日志框將顯示與 MQTT 連接和消息傳輸相關的調試信息。

import sys
import json
import paho.mqtt.client as mqtt  # 導入 paho-mqtt 庫
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QFormLayout, QLabel, QLineEdit, QSpinBox, QPushButton, QGridLayout, QGroupBox, QPlainTextEdit, QSpacerItem, QSizePolicy, QMenuBar, QStatusBar

class MQTTClientDebugger(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("MQTT 客戶端調試助手")
        self.setGeometry(100, 100, 1019, 772)  # 設置窗口大小

        self.centralWidget = QWidget(self)
        self.setCentralWidget(self.centralWidget)

        self.client = None  # MQTT 客戶端實例

        # 主布局
        self.mainLayout = QVBoxLayout(self.centralWidget)

        # 連接設置布局
        self.connectionLayout = QHBoxLayout()

        self.formLayout = QFormLayout()
        self.hostLineEdit = QLineEdit()
        self.hostLineEdit.setText("117.78.5.125")  # 默認服務器IP地址
        self.formLayout.addRow(QLabel("服務器域名或者IP地址:"), self.hostLineEdit)

        # 端口號
        self.spinBoxPort = QSpinBox()
        self.spinBoxPort.setMaximum(99999)
        self.spinBoxPort.setValue(1883)  # 默認端口號
        self.formLayout.addRow(QLabel("服務器端口:"), self.spinBoxPort)

        self.clientIdLineEdit = QLineEdit()
        self.clientIdLineEdit.setText("6746c32eef99673c8ad0812e_dev1_0_0_2024112707")  # 默認客戶端ID
        self.formLayout.addRow(QLabel("ClientId"), self.clientIdLineEdit)

        self.usernameLineEdit = QLineEdit()
        self.usernameLineEdit.setText("6746c32eef99673c8ad0812e_dev1")  # 默認用戶名
        self.formLayout.addRow(QLabel("Username"), self.usernameLineEdit)

        self.passwordLineEdit = QLineEdit()
        self.passwordLineEdit.setText("b69234ba506cf2c1c579c4fd407a0a801479a672032fcf5ab9ea126abcf2a8b1")  # 默認密碼
        self.formLayout.addRow(QLabel("Password"), self.passwordLineEdit)

        self.connectionLayout.addLayout(self.formLayout)

        # 連接按鈕
        self.connectButton = QPushButton("Connect")
        self.connectButton.clicked.connect(self.connect_to_server)
        self.connectionLayout.addWidget(self.connectButton)

        self.mainLayout.addLayout(self.connectionLayout)

        # MQTT 主題和消息布局
        self.gridLayout = QGridLayout()

        self.gridLayout.addWidget(QLabel("訂閱主題:"), 0, 0)
        self.subscribeTopicLineEdit = QLineEdit("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/messages/down")
        self.gridLayout.addWidget(self.subscribeTopicLineEdit, 0, 1)
        self.gridLayout.addWidget(QPushButton("訂閱"), 0, 2)

        self.gridLayout.addWidget(QLabel("發布主題:"), 1, 0)
        self.publishTopicLineEdit = QLineEdit("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/properties/report")
        self.gridLayout.addWidget(self.publishTopicLineEdit, 1, 1)

        self.gridLayout.addWidget(QLabel("主題消息:"), 2, 0)
        self.messageLineEdit = QLineEdit()
        self.gridLayout.addWidget(self.messageLineEdit, 2, 1)
        self.gridLayout.addWidget(QPushButton("發布"), 2, 2)

        self.gridLayout.addWidget(QPushButton("點擊發送心跳包"), 3, 2)

        self.mainLayout.addLayout(self.gridLayout)

        # 日志區域
        self.logGroupBox = QGroupBox("日志消息:")
        self.logLayout = QHBoxLayout()
        self.logTextEdit = QPlainTextEdit()
        self.logTextEdit.setReadOnly(True)
        self.logLayout.addWidget(self.logTextEdit)
        self.logGroupBox.setLayout(self.logLayout)

        self.mainLayout.addWidget(self.logGroupBox)

        # 底部按鈕布局
        self.bottomLayout = QHBoxLayout()

        self.testButton = QPushButton("測試按鈕(一鍵填充MQTT信息)")
        self.clearButton = QPushButton("一鍵清除MQTT信息")
        self.clearLogButton = QPushButton("清除日志消息")
        self.viewTutorialButton = QPushButton("【查看物聯網項目開發教程】")
        self.quitButton = QPushButton("退出軟件")

        self.testButton.clicked.connect(self.fillMQTTInfo)
        self.clearButton.clicked.connect(self.clearMQTTInfo)
        self.clearLogButton.clicked.connect(self.clear_logs)

        self.bottomLayout.addWidget(self.testButton)
        self.bottomLayout.addWidget(self.clearButton)
        self.bottomLayout.addWidget(self.clearLogButton)
        self.bottomLayout.addWidget(self.viewTutorialButton)
        self.bottomLayout.addWidget(self.quitButton)

        self.mainLayout.addLayout(self.bottomLayout)

        # 菜單欄
        self.menuBar = self.menuBar()
        self.fileMenu = self.menuBar.addMenu("File")
        quitAction = self.fileMenu.addAction("Quit")
        quitAction.triggered.connect(self.close)

        # 狀態欄
        self.statusBar = QStatusBar()
        self.setStatusBar(self.statusBar)

    # 連接到MQTT服務器
    def connect_to_server(self):
        host = self.hostLineEdit.text()
        port = self.spinBoxPort.value()
        client_id = self.clientIdLineEdit.text()
        username = self.usernameLineEdit.text()
        password = self.passwordLineEdit.text()

        self.client = mqtt.Client(client_id)
        self.client.username_pw_set(username, password)  # 設置用戶名和密碼

        # 設置連接成功、消息接收、連接丟失等回調函數
        self.client.on_connect = self.on_connect
        self.client.on_message = self.on_message
        self.client.on_disconnect = self.on_disconnect

        # 連接到服務器
        self.client.connect(host, port, 60)

        # 啟動 MQTT 客戶端
        self.client.loop_start()

    def on_connect(self, client, userdata, flags, rc):
        """當連接到MQTT服務器時調用"""
        self.log(f"連接成功,返回碼:{rc}")
        # 連接成功后訂閱主題
        subscribe_topic = self.subscribeTopicLineEdit.text()
        client.subscribe(subscribe_topic)

    def on_message(self, client, userdata, msg):
        """當接收到MQTT消息時調用"""
        self.log(f"接收到消息:{msg.topic} {msg.payload.decode()}")

    def on_disconnect(self, client, userdata, rc):
        """當斷開連接時調用"""
        self.log(f"MQTT服務器斷開連接,返回碼:{rc}")

    # 發布消息
    def publish_message(self):
        topic = self.publishTopicLineEdit.text()
        message = self.messageLineEdit.text()
        if self.client:
            self.client.publish(topic, message)
            self.log(f"發布消息:{topic} {message}")

    # 發送心跳包
    def send_heartbeat(self):
        if self.client:
            self.client.ping()
            self.log("發送心跳包")

    # 日志輸出
    def log(self, message):
        """向日志框輸出信息"""
        self.logTextEdit.appendPlainText(message)

    # 填充MQTT信息
    def fillMQTTInfo(self):
        self.hostLineEdit.setText("117.78.5.125")
        self.spinBoxPort.setValue(1883)
        self.clientIdLineEdit.setText("6746c32eef99673c8ad0812e_dev1_0_0_2024112707")
        self.usernameLineEdit.setText("6746c32eef99673c8ad0812e_dev1")
        self.passwordLineEdit.setText("b69234ba506cf2c1c579c4fd407a0a801479a672032fcf5ab9ea126abcf2a8b1")
        self.subscribeTopicLineEdit.setText("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/messages/down")
        self.publishTopicLineEdit.setText("$oc/devices/6746c32eef99673c8ad0812e_dev1/sys/properties/report")
        self.messageLineEdit.setText('{"services": [{"service_id": "stm32","properties":{"DHT11_T":18.1,"DHT11_H":16.2,"SOIL":12.4,"BH1750":124.5,"MOTOR_SW":1,"SOIL_MAX":30,"run_mode":1}}]}')

    # 清除MQTT信息
    def clearMQTTInfo(self):
        self.hostLineEdit.clear()
        self.spinBoxPort.clear()
        self.clientIdLineEdit.clear()
        self.usernameLineEdit.clear()
        self.passwordLineEdit.clear()
        self.subscribeTopicLineEdit.clear()
        self.publishTopicLineEdit.clear()

    # 清除日志信息
    def clear_logs(self):
        self.logTextEdit.clear()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWin = MQTTClientDebugger()
    mainWin.show()
    sys.exit(app.exec_())

六、總結

本項目通過結合云主機、Python編程語言、PyQt5圖形界面開發框架和paho-mqtt庫,成功實現了一款功能強大的MQTT客戶端調試助手。該工具為開發者提供一個簡便的方式,通過軟件模擬硬件設備與華為云物聯網平臺(IoTDA)進行通信,完成主題訂閱和消息發布等操作。通過這一工具,即便是沒有硬件設備的開發者,或者對硬件開發不熟悉的開發者,也能夠快速上手并深入理解物聯網設備與云平臺之間的通信過程。

利用華為開發者空間的云主機,本項目充分發揮了云端開發環境的優勢,降低了本地開發環境搭建的復雜性,使得開發者能夠專注于應用的開發和調試,而無需關心底層環境配置問題。通過集成的CodeArts IDE,開發者可以在統一的開發環境中高效地編寫、調試和運行代碼,提升了開發效率。

項目采用的MQTT協議是物聯網通信中的核心技術,通過paho-mqtt庫實現了與華為云物聯網平臺的快速對接和可靠通信。該庫為開發者提供了易于使用的API,支持靈活的消息發布與訂閱操作,并通過連接管理、自動重連等功能,確保了客戶端與云平臺的穩定通信。

在界面設計上,PyQt5為項目提供了直觀、易操作的圖形化界面,用戶可以通過簡單的操作實現復雜的MQTT通信功能,極大地提升了用戶體驗。借助這種圖形化界面,開發者不僅能夠方便地調試物聯網應用,還能夠在沒有實際硬件的情況下,模擬設備與云平臺的通信過程,從而加速了物聯網應用的學習和開發。

本項目不僅為開發者提供了一個功能完備的調試工具,也為物聯網應用的學習和開發提供了寶貴的實踐機會。無論是在測試調試階段,還是在實際應用中,開發者都能夠通過該工具深入理解MQTT協議、物聯網通信機制和云平臺集成的基本流程,為未來的物聯網項目開發打下堅實的基礎。同時,本項目的實現也展示了云端開發和虛擬化硬件仿真技術在物聯網領域中的巨大潛力,推動了物聯網開發者社區的普及和技術創新。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真
    +關注

    關注

    50

    文章

    4104

    瀏覽量

    133766
  • STM32
    +關注

    關注

    2270

    文章

    10912

    瀏覽量

    356674
  • 硬件
    +關注

    關注

    11

    文章

    3351

    瀏覽量

    66322
  • MQTT
    +關注

    關注

    5

    文章

    653

    瀏覽量

    22578
  • 華為云
    +關注

    關注

    3

    文章

    2639

    瀏覽量

    17493
收藏 人收藏

    評論

    相關推薦

    【OK210申請】桌面客戶端研發

    申請理由:通過嵌入式開發板研究瘦客戶端開發制作,用于連接桌面虛擬桌面。如自研成功,可長期合作,后續的桌面項目將使用自研的瘦
    發表于 07-10 11:20

    阿里展示“”整體方案

    MDM9206 中預集成阿里 Link 物聯網套件,模組廠商和物聯網開發者可以利用 LTE IoT 連接以及運行在 LTE 系統級芯片客戶端
    發表于 07-27 06:30

    手把手教你將MQTT客戶端移植到stm32開發

    手把手教你將MQTT客戶端移植到stm32開發,使用TencentOS tiny官方開發板——TencentOS_tiny_EVB_MX
    發表于 08-03 07:33

    MQTT客戶端移植到stm32開發

    手把手教你將MQTT客戶端移植到stm32開發,使用野火stm32f429官方開發板作為移植實驗,使用lwip+以太網連接到
    發表于 08-24 08:04

    AT32基于FreeRTOS的AWS MQTT客戶端

    AT32基于FreeRTOS的AWS MQTT客戶端建立一個MQTT客戶端與 AWS IoT Core進行通訊,用戶可以基于這個范例去開發
    發表于 10-26 06:03

    mqtt 客戶端VS2010

    mqtt客戶端源代碼,有一個工程是生成mqtt協議的需要的dll文件,另一個工程師簡單的調用這個dll實現客戶端與服務器的通信,適合剛開始學習的用戶了解!!
    發表于 11-19 15:17 ?59次下載

    如何使用MQTT客戶端連接阿里MQTT服務器詳細教程說明

    這一篇文章零妖老哥將給你展示兩個電腦軟件的使用方法,將極大地方便你調試與MQTT有關的物聯網項目。一個叫MQTT客戶端用來模擬設備向云端發送數據和接收云端的數據;另一個叫作MQTT單片
    發表于 05-29 17:57 ?29次下載
    如何使用<b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>連接阿里<b class='flag-5'>云</b><b class='flag-5'>MQTT</b>服務器詳細教程說明

    NodeMCU項目(三)MQTT客戶端

    NodeMCU模塊連接WiFi后,作為一個客戶端連接MQTT服務器;手機通過微信小程序連接到相同的服務器,作為另一個客戶端。手機和NodeMCU不需要處于同一局域網下,兩者之間的通信
    發表于 11-05 17:05 ?1次下載
    NodeMCU項目(三)<b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>

    MQTT客戶端空氣質量快速入門指南

    MQTT客戶端空氣質量快速入門指南
    發表于 01-12 18:43 ?1次下載
    <b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>空氣質量<b class='flag-5'>快速</b>入門指南

    MQTT客戶端快速入門指南 按鍵按下

    MQTT客戶端快速入門指南 按鍵按下
    發表于 01-12 18:43 ?1次下載
    <b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b><b class='flag-5'>快速</b>入門指南 按鍵按下

    MQTT客戶端介紹

    一個高性能、高穩定性的跨平臺MQTT客戶端,基于socket API之上開發,可以在嵌入式設備(FreeRTOS/LiteOS/RT-Thread/TencentOS tiny)、Linux
    的頭像 發表于 02-28 16:14 ?2468次閱讀
    <b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>介紹

    MQTT客戶端空氣質量快速入門指南

    MQTT客戶端空氣質量快速入門指南
    發表于 07-03 18:34 ?1次下載
    <b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>空氣質量<b class='flag-5'>快速</b>入門指南

    MQTT客戶端快速入門指南 按鍵按下

    MQTT客戶端快速入門指南 按鍵按下
    發表于 07-03 18:34 ?0次下載
    <b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b><b class='flag-5'>快速</b>入門指南 按鍵按下

    盤點2023年值得嘗試的MQTT客戶端工具

    隨著物聯網(IoT)的快速發展,MQTT協議被許多公司和開發人員廣泛使用。在學習和使用 MQTT 的過程中,MQTT
    的頭像 發表于 07-13 10:11 ?5311次閱讀
    盤點2023年值得嘗試的<b class='flag-5'>MQTT</b><b class='flag-5'>客戶端</b>工具

    MQTT中服務客戶端

    MQTT 是一種基于客戶端-服務架構(C/S)的消息傳輸協議,所以在 MQTT 協議通信中,有兩個最為重要的角色,它們便是服務
    的頭像 發表于 07-30 14:55 ?2699次閱讀
    主站蜘蛛池模板: 亚洲一级电影| 娇小老少配xxxxx| 日本精品久久久久中文字幕 1| XXX国产麻豆HD| 偷柏自拍亚洲综合在线| 久 久 亚洲 少 妇 无 码| 99精品在线免费| 乌克兰16~18sex| 久久精品无码成人国产毛| 99久久国产露脸精品麻豆 | 国产成人综合高清在线观看| 亚洲欧美色综合影院| 欧美日韩亚洲一区视频二区| 国产精品永久在线| 97久久无码精品AV| 亚洲2017天堂色无码| 美女被爽cao免费漫画| 国产精品99re6热在线播放| 野花香在线观看免费观看大全动漫 | 中国成人在线视频| 十8禁用B站在线看漫画| 快播电影频道| 国产一区二区在线观看免费| xxxxhd17欧美老师| 在线观看免费视频a| 消息称老熟妇乱视频一区二区| 脔到她哭H粗话HWWW男男动漫| 国产免费人成在线视频有码| eussse手机电影在线观看| 夜色福利院在线看| 天堂so导航| 欧美一区二区影院| 久久久久999| 国产午夜精品一区二区三区 | 最近免费中文字幕完整版HD| 午夜国产理论| 欧美亚洲日本日韩在线| 久久精品国产在热亚洲| 国产精品一区二区在线观看| japansemature护士| 最新国产av.在线视频|