華為云IoT平臺與MicroPython實戰:從MQTT協議到物聯網設備開發

目錄

前言

1. 華為云

1.1. 創建實例

1.2. 創建產品

1.3. 編輯服務模型

1.4. 注冊設備

1.4.1. 復制設備連接參數

1.5. 連接參考代碼

2. micropython版-物聯網

2.1. 環境搭建

2.2. 實現步驟

2.3. 示例代碼

結語


前言

物聯網(IoT)技術的快速發展,使得設備間的智能互聯成為現實。MQTT協議憑借其輕量級、低功耗和高可靠性,成為物聯網通信的核心技術之一。本文以華為云IoT平臺MicroPython開發為主線,詳細介紹如何通過MQTT協議實現設備與云端的雙向通信。

內容涵蓋:

  • 華為云IoT平臺的實例創建、產品定義、設備注冊及連接配置

  • MicroPython環境搭建,實現ESP32等嵌入式設備的Wi-Fi連接與MQTT通信

  • 完整的代碼示例,包括設備屬性上報、云端指令接收與響應

無論您是物聯網開發者、嵌入式工程師,還是對IoT技術感興趣的愛好者,本文都將幫助您快速掌握設備上云的完整流程,并實現穩定、高效的物聯網通信。

1. 華為云

1.1. 創建實例

記得選擇華北-北京四區

1.2. 創建產品

1.3. 編輯服務模型

1.4. 注冊設備

1.4.1. 復制設備連接參數

1.5. 連接參考代碼

參考連接:設備屬性上報_設備接入 IoTDA_華為云

參考代碼:

import json
import time
import paho.mqtt.client as mqtt
from MqttSign import AuthIfo# pip install paho-mqtt==1.6.1
# 1. 去到設備界面復制設備ID
# 2. 復制設備mqtt聯網參數# 訂閱的話題
subTopic = "$oc/devices/xxxxxxxxxxxxxxx/sys/properties/set/request_id=123"
# 發布的話題
pubTopic = "$oc/devices/xxxxxxxxxxxxxx/sys/properties/report"port = 1883keepAlive = 300"""
{"username": "x","password": "x","clientId": "x","hostname": "x.iot-x.cn-north-4.myhuaweicloud.com","port": 8883,"protocol": "MQTTS"
}
"""
username="x"
password= "x"
clientId= "x"
hostname= "x.iot-mqtts.cn-north-4.myhuaweicloud.com"client = mqtt.Client(clientId)
client.username_pw_set(username=username, password=password)def on_connect(client, userdata, flags, rc):if rc == 0:print("Connect huaweicloud IoT Cloud Sucess")else:print("Connect failed...  error code is:" + str(rc))def on_message(client, userdata, msg):topic = msg.topicpayload = msg.payload.decode()print("receive message ---------- topic is : " + topic)print("receive message ---------- payload is : " + payload)# {"paras":{"switch":1},"service_id":"heima8","command_name":"cmd_switch"}# json格式的字符串轉成python里面的數據結構,字典data = json.loads(payload)print("switch:",data['paras']['switch'])# 回復服務器# $oc/devices/{device_id}/sys/properties/set/response/request_id={request_id}topic = "$oc/devices/67d92038dc85c43dcb35a707_heima8/sys/properties/set/response/request_id=123"client.publish(topic, "post_payload")if ("thing/service/property/set" in topic):on_thing_prop_changed(client, msg.topic, msg.payload)def on_thing_prop_changed(client, topic, payload):post_topic = topic.replace("service","event")post_topic = post_topic.replace("set","post")Msg = json.loads(payload)params = Msg['params']post_payload = "{\"params\":" + json.dumps(params) + "}"print("reveice property_set command, need to post ---------- topic is: " + post_topic)print("reveice property_set command, need to post ---------- payload is: " + post_payload)client.publish(post_topic, post_payload)def connect_mqtt():client.connect(hostname, port, keepAlive)return clientdef publish_message():# publish 5 messages to pubTopic("/a1LhUsK****/python***/user/update")for i in range(50):data = {"services": [{"service_id": "heima8","properties": {"switch": i,},}]}message = json.dumps(data)client.publish(pubTopic, message)print("publish msg: " + str(i))print("publish msg: " + message)time.sleep(2)def subscribe_topic():# subscribe to subTopic("/a1LhUsK****/python***/user/get") and request messages to be deliveredclient.subscribe(subTopic)print("subscribe topic: " + subTopic)client.on_connect = on_connect
client.on_message = on_message
client = connect_mqtt()
client.loop_start()
time.sleep(2)subscribe_topic()
publish_message()while True:time.sleep(1)

2. micropython版-物聯網

2.1. 環境搭建

安裝umqtt.simple包

2.2. 實現步驟

  1. 準備好阿里云設備連接參數
  2. 連接wifi
  3. 創建MQTTClient對象
  4. 訂閱消息
  5. 定時發布消息

  1. 準備阿里云設備參數

  1. 連接wifi
def ConnectWifi(ssid, passwd):global wlanwlan = network.WLAN(network.STA_IF)  # create a wlan objectwlan.active(True)  # Activate the network interfacewlan.disconnect()  # Disconnect the last connected WiFiwlan.connect(ssid, passwd)  # connect wifiprint("開始聯網...")while (wlan.ifconfig()[0] == '0.0.0.0'):time.sleep(1)print("聯網成功:",wlan.ifconfig())

  1. 創建MQTTClient

該操作api最后參數為維持心跳的時長,每隔60s就給服務器發消息,告訴服務器設備還活著

client = MQTTClient(CLIENT_ID, SERVER, 1883, username, password, 60) 
  1. 訂閱消息
def subscribe_callback(topic, msg):msg = json.loads(msg)topic = topic.decode()print("接收到topic",topic)if(topic == subscribe_TOPIC):if msg['params']['AlarmSwitch'] !=0:         led.value(0)   else: led.value(1)# 設置訂閱消息回調函數
client.set_callback(subscribe_callback)  # set callback
# 訂閱話題
client.subscribe(subscribe_TOPIC)  # client subscribes to a topic
  1. 等待用戶數據
 while True:client.wait_msg() 

2.3. 示例代碼

#-*-coding:utf-8-*-
from umqtt.simple import MQTTClient
from machine import Pin
import network
import time
import machine
import dht
from machine import Timer
import json"""
{"ProductKey": "k0ejus4OoQl","DeviceName": "5Lq9OGQODLusHlBp97fl","DeviceSecret": "307bf81677628905e79784b4d2f65ace"
}{"clientId":"k0ejus4OoQl.5Lq9OGQODLusHlBp97fl|securemode=2,signmethod=hmacsha256,timestamp=1733748536747|",
"username":"5Lq9OGQODLusHlBp97fl&k0ejus4OoQl",
"mqttHostUrl":"iot-06z00epnznwak8t.mqtt.iothub.aliyuncs.com",
"passwd":"929e8ea099ddb639608637e4088e6ff75f617c358b954ab3c7d6f0f15f24fecc",
"port":1883}"""#---以下的參數值都需要根據自己的環境修改-----------------------------------------------
led=Pin(48,Pin.OUT) #ESP32的引腳2接了LED燈,可根據自己的ESP32板子的LED引腳來設置SSID = "icheima"  #填寫自己的WIFI名稱
PASSWORD = "abcdefgh"   #填寫自己的WIFI密碼SSID = "SUIXING-Hotel"  #填寫自己的WIFI名稱
PASSWORD = ""   #填寫自己的WIFI密碼SERVER = "iot-06z00epnznwak8t.mqtt.iothub.aliyuncs.com"  # mqttHostUrl
CLIENT_ID = "k0ejus4OoQl.5Lq9OGQODLusHlBp97fl|securemode=2,signmethod=hmacsha256,timestamp=1733748536747|"  # clientId
username = "5Lq9OGQODLusHlBp97fl&k0ejus4OoQl" #username
password = "929e8ea099ddb639608637e4088e6ff75f617c358b954ab3c7d6f0f15f24fecc"  #密碼
publish_TOPIC = "/sys/k0ejus4OoQl/5Lq9OGQODLusHlBp97fl/thing/event/property/post"
subscribe_TOPIC = "/sys/k0ejus4OoQl/5Lq9OGQODLusHlBp97fl/thing/service/property/set"
#---以上的參數值都需要根據自己的環境修改-----------------------------------------------client = Nonewlan = Nonei = 0def ConnectWifi(ssid, passwd):global wlanwlan = network.WLAN(network.STA_IF)  # create a wlan objectwlan.active(True)  # Activate the network interfacewlan.disconnect()  # Disconnect the last connected WiFiwlan.connect(ssid, passwd)  # connect wifiprint("開始聯網...")while (wlan.ifconfig()[0] == '0.0.0.0'):time.sleep(1)print("聯網成功:",wlan.ifconfig())def subscribe_callback(topic, msg):msg = json.loads(msg)topic = topic.decode()print("接收到topic",topic)if(topic == subscribe_TOPIC):if msg['params']['AlarmSwitch'] !=0:         led.value(0)   else: led.value(1)def publish_message(mytimer):global clientglobal ii+=1try:request_params = {"CurrentTemperature": 11+i,"CurrentHumidity": 120+i,"CurrentVoltage": 120+i,"AlarmSwitch":1+i}request = {"id": 1,"version": "1.0","params": request_params,"method": "thing.event.property.post"}message = json.dumps(request)print('發布消息============================')print(message)client.publish(topic=publish_TOPIC, msg=message, retain=False, qos=0)print("發布消息成功")except Exception as e:print('exception:', e)mytimer.deinit()def wifi_deng_run():global clientglobal ledglobal wlanprint('物聯網點燈大師啟動...')try:ConnectWifi(SSID, PASSWORD)client = MQTTClient(CLIENT_ID, SERVER, 0, username, password, 60)  # create a mqtt clientprint('client:%s' % str(client))led.value(1)client.set_callback(subscribe_callback)  # set callbackclient.connect()  # connect mqttclient.subscribe(subscribe_TOPIC)  # client subscribes to a topicmytimer = Timer(0)mytimer.init(mode=Timer.PERIODIC, period=2000, callback=publish_message)while True:client.wait_msg()  # wait messageexcept Exception  as ex_results:print('exception1', ex_results)return "FAILED"finally:if (client is not None):led.value(0)client.disconnect()wlan.disconnect()wlan.active(False)print("重新連接")return 'FAILED'while (True):if wifi_deng_run() == 'FAILED':print('FAILED,retry to connect')time.sleep(5)

結語

本文通過華為云IoT平臺和MicroPython的結合,展示了MQTT協議在物聯網中的強大能力。從云端實例配置到嵌入式設備開發,我們一步步實現了設備與云的高效通信,并完成了數據上報與遠程控制功能。

未來,隨著5G、邊緣計算等技術的發展,物聯網的應用場景將更加豐富。希望本文的實戰指南能為您提供清晰的開發思路,助力您構建更智能、更可靠的物聯網系統。如果您在實踐過程中遇到問題,歡迎查閱華為云官方文檔或社區論壇,共同探索物聯網的無限可能! 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77876.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77876.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77876.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025-04-30 AIGC-如何做短片視頻

摘要: 2025-04-30 AIGC-如何做短片視頻 如何做短片視頻: 一、畫圖修圖 1.保存視頻(無水保存) 2.文案提取(提取文案) 3. DeepSeek(提示詞) 4.小夢Ai(圖片視頻) 5.修圖Ai 6.擴圖Ai 7.養生…

硬件工程師面試常見問題(10)

第四十六問:鎖存器,觸發器,寄存器三者的區別 觸發器:能夠存儲一位二值信號的基本單元電路統稱為 "觸發器"。(單位) 鎖存器:一位觸發器只能傳送或存儲一位數據,而在實際工…

外部訪問 Kubernetes 集群中 MQ 服務的方案

外部訪問 Kubernetes 集群中 MQ 服務的方案 當您在 Kubernetes 集群中部署了消息隊列服務(如 RabbitMQ、Kafka、ActiveMQ 等)后,以下是外部客戶端訪問這些服務的幾種可靠方法: 一、基礎訪問方案 1. NodePort 方式暴露服務 # M…

論文筆記(八十二)Transformers without Normalization

Transformers without Normalization 文章概括Abstract1 引言2 背景:歸一化層3 歸一化層做什么?4 動態 Tanh (Dynamic Tanh (DyT))5 實驗6 分析6.1 DyT \text{DyT} DyT 的效率6.2 tanh \text{tanh} tanh 和 α α α 的消融實驗…

軟考中級-軟件設計師 操作系統(手寫筆記)

第一章:基礎知識 第二章:進程管理 狀態轉換圖 進程同步機制 信號量機制 信號量題 死鎖 第三章:存儲管理 基礎知識 分頁存儲管理 分段存儲管理 段頁式存儲管理 頁面置換算法 第四章:文件管理 基礎知識 索引分配 空閑存儲空間的管…

ubuntu 部署moodle

通過地址https://download.moodle.org/releases/latest/選擇下載,下載兩種壓縮包都特別慢(有可能無法下載)。 可以使用下面git下載項目 注意圖中php、mysql等版本要求,本次采用Ubuntu22.04下 nginxphp8.2mysql8.4部署 mkdir /var…

python實戰項目67:空氣質量在線檢測平臺js逆向

python實戰項目67:空氣質量在線檢測平臺js逆向 一、需求介紹二、完整代碼一、需求介紹 項目需求是獲取某個城市(以北京市為例)歷年(2013年12月至2025年4月)的空氣質量數據,字段包括日期、AQI、質量等級、PM2.5、PM10、NO2、CO、SO2等。改網站的網址是“https://www.aqis…

【Linux】記錄一個有用PS1

PS1 是用來定義shell提示符的環境變量 下面是一個帶有顏色和豐富信息的 Linux PS1 配置示例,包含用戶名、主機名、路徑、時間、Git 分支和退出狀態提示: # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 綠色粗體用戶名 PS…

Python PyTorch庫【機器學習框架】全面深入講解與實踐

一、PyTorch 核心概念 1. 定義與發展背景 PyTorch 是由 Facebook AI Research (FAIR) 開發的開源機器學習框架,2016 年首次發布。其核心特性包括: 動態計算圖(Define-by-Run)GPU 加速張量計算自動微分系統豐富的神經網絡模塊 …

呼叫中心座席管理系統:智能升級,高效服務

在數字化轉型加速的今天,客戶服務體驗已成為企業競爭力的核心要素。傳統 呼叫中心系統 依賴硬件設備、人工操作的模式已無法滿足高效、智能、靈活的現代企業需求。暢信達呼叫中心 座席管理系統 V5.0應運而生,以WEBRTC軟電話接入、智能座席輔助、知識庫管…

時態--00--總述

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 時態句子結構時態標志詞 時態 句子結構 時態標志詞

算法每日一題 | 入門-順序結構-字母轉換

字母轉換 題目描述 輸入一個小寫字母,輸出其對應的大寫字母。例如輸入 q[回車] 時,會輸出 Q。 輸入格式 無 輸出格式 無 輸入輸出樣例 #1 輸入 #1 q輸出 #1 QC 首先我們要知道,C字符的所有轉換形式都是依照ASCII碼來的。 所以&…

晶振:從消費電子到航天領域的時間精度定義者

從手表到衛星:晶振如何在不同領域定義時間精度 在時間的長河中,人類對時間精度的追求永無止境。從古老的日晷到如今精密的計時儀器,每一次進步都離不開技術的革新。而晶振,作為現代計時的核心元件,在不同領域發揮著至…

短視頻矩陣系統貼牌開發實戰:批量剪輯文件夾功能設計與實現

摘要:在短視頻矩陣系統的開發中,批量處理功能是提升運營效率的關鍵。本文將深入探討如何實現基于文件夾的短視頻批量剪輯功能,涵蓋技術選型、核心功能實現及代碼示例。 一、需求背景與場景價值 在短視頻矩陣運營場景中,運營者常面…

讀書筆記--華為從偶然到必然之創新與技術開發閱讀有感

最近繼續閱讀一本講述華為研發投資與管理實踐方面的書籍,分享給大家。華為在創新與技術研發方面有體系化、系統化和延續性。創新是企業的生命線,是企業發展的不竭動力,同時將企業文化與創新精神進行了融合,華為的企業文化強調以客…

基于DeepSeek與HTML的可視化圖表創新研究

一、研究背景 在當今數字化時代,數據呈指數級增長,廣泛滲透于社會各個領域。無論是商業運營、科學研究,還是公共管理等方面,海量數據蘊含著豐富的潛在價值,成為驅動決策優化、推動業務發展、促進科學創新的關鍵要素。數…

K8S - 命名空間實戰 - 從資源隔離到多環境管理

引言 在傳統的物理機或虛擬機環境中,不同業務應用共享資源,容易導致權限沖突、資源爭用和管理混亂。Kubernetes 通過 命名空間(Namespace)實現資源邏輯隔離,將集群劃分為多個虛擬子集群,從而解決以下問題&…

Unity3D仿星露谷物語開發40之割草動畫

1、目標 當Player選擇Scythe后,鼠標懸浮在草上,會顯示綠色光標。鼠標左擊,會觸發割草的動畫。 2、優化Settings.cs腳本 添加以下兩行代碼: // Reaping(收割) public const int maxCollidersToTestPerRe…

【LLM】基于 Ollama 部署 DeepSeek-R1 本地大模型

本文詳細介紹如何在 Linux 和 Windows 環境下,通過 Docker Compose 整合 Ollama 和 Open WebUI,部署 DeepSeek-R1 大語言模型,并提供 GPU 加速支持。無論你是開發者還是 AI 愛好者,均可通過本指南快速搭建私有化 GPT 環境。 一、環境準備 1. Docker 與 Docker Compose 安…

深度體驗兩年半!MAC 硬件好物分享|屏幕、掛燈、鍵盤、鼠標

寫在前面 最近快五一放假了,所以寫點輕松一點的文章~ 這篇文章就介紹這兩年半來,我一直在用MAC硬件搭子!!而買這些硬件設備的錢都是一行行代碼寫出來的!! 我的MAC是21款14寸 m1 pro 32512版本,22年年底在…