目錄
前言
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. 實現步驟
- 準備好阿里云設備連接參數
- 連接wifi
- 創建MQTTClient對象
- 訂閱消息
- 定時發布消息
- 準備阿里云設備參數
- 連接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())
- 創建MQTTClient
該操作api最后參數為維持心跳的時長,每隔60s就給服務器發消息,告訴服務器設備還活著
client = MQTTClient(CLIENT_ID, SERVER, 1883, username, password, 60)
- 訂閱消息
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
- 等待用戶數據
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、邊緣計算等技術的發展,物聯網的應用場景將更加豐富。希望本文的實戰指南能為您提供清晰的開發思路,助力您構建更智能、更可靠的物聯網系統。如果您在實踐過程中遇到問題,歡迎查閱華為云官方文檔或社區論壇,共同探索物聯網的無限可能! 🚀