目錄
1.注冊巴法云
2.設備連接mqtt
3.微信小程序
備注
本文esp32用的是MicroPython固件,MQTT服務用的是巴法云。
本文參考巴法云官方教程:https://bemfa.blog.csdn.net/article/details/115282152
1.注冊巴法云
注冊登陸并新建一個topic,注意是MQTT設備云。
2.設備連接mqtt
代碼如下,以點亮esp32設備上的藍色燈舉例,訂閱上一步創建的topic,當設備從mqtt服務器收到“on”時,燈亮,收到“off”時燈滅。
from umqtt.simple import MQTTClient
import time
from machine import Timer, Pin# 需要修改的地方
wifiName = "***" # wifi 名稱,不支持5G wifi
wifiPassword = "***" # wifi 密碼
clientID = "***" # Client ID ,密鑰,巴法云控制臺獲取
myTopic = "topic" # 需要訂閱的主題值,巴法MQTT控制臺創建# 默認設置
serverIP = "bemfa.com" # mqtt 服務器地址
port = 9501
led_pin = Pin(2, Pin.OUT)# WIFI 連接函數
def do_connect():import networksta_if = network.WLAN(network.STA_IF)if not sta_if.isconnected():print("connecting to network...")sta_if.active(True)sta_if.connect(wifiName, wifiPassword)while not sta_if.isconnected():passprint("connect WiFi ok")# 接收消息,并處理
def MsgOK(topic, msg): # 回調函數,用于收到消息print((topic, msg)) # 打印主題值和消息值if topic == myTopic.encode(): # 判斷是不是發給myTopic的消息if msg == b"on": # 當收到onprint("rec on")led_pin.value(1)elif msg == b"off": # 當收到offprint("rec off")led_pin.value(0)# 初始化mqtt連接配置
def connect_and_subscribe():client = MQTTClient(clientID, serverIP, port, keepalive=60)client.set_callback(MsgOK)try:client.connect()print("MQTT connected!")except Exception as e:print("MQTT connect failed:", e)client.subscribe(myTopic, qos=0)print("Connected to %s" % serverIP)return clientdef restart_and_reconnect():print("Failed to connect to MQTT broker. Reconnecting...")time.sleep(10)machine.reset()# 開始連接WIFI
do_connect()# 開始連接MQTT
try:client = connect_and_subscribe()
except OSError as e:restart_and_reconnect()# 全局變量記錄定時器狀態
timer_running = False# 定時器函數
def send_ping(t):client.ping()print("Ping sent!")# 初始化定時器
def init_timer():global timer_runningif not timer_running:timer = Timer(-1)timer.init(period=30000, mode=Timer.PERIODIC, callback=send_ping)timer_running = True# 程序啟動時初始化定時器
init_timer()while True:try:client.check_msg()except OSError as e: # 如果出錯就重新啟動print("Failed to connect to MQTT broker. Reconnecting...")restart_and_reconnect()
3.微信小程序
在微信小程序中,通過wxs連接mqtt,核心代碼如下:
data: {uid:"******",//用戶密鑰,巴法云控制臺獲取ledtopic:"topic",//主題,mqtt控制臺創建client: null,//mqtt客戶端,默認為空},mqttConnect(){var that = this//MQTT連接的配置var options= {keepalive: 60, //60s ,表示心跳間隔clean: true, //cleanSession不保持持久會話protocolVersion: 4, //MQTT v3.1.1clientId:this.data.uid}//初始化mqtt連接this.data.client = mqtt.connect('wxs://bemfa.com:9504/wss',options)// 連接mqtt服務器this.data.client.on('connect', function () {console.log('連接服務器成功')})//接收消息that.data.client.on('message', function (topic, message) {console.log(topic)var msg = message.toString()//打印消息console.log('收到消息:'+msg)})//斷線重連this.data.client.on("reconnect", function () {console.log("重新連接")});}
在小程序中添加一個按鈕來往指定topic發送on/off消息,這樣你的設備在收到相應的消息之后,上面的燈會點亮/熄滅。
onChange({ detail }){//detail是滑塊的值,檢查是打開還是關閉,并更換正確圖標this.setData({ checked: detail,});if(detail == true){//如果是打開操作this.data.client.publish(this.data.ledtopic, 'on')//mqtt推送onthis.setData({ ledicon: "/utils/img/lighton.png",//設置led圖片為on});}else{this.data.client.publish(this.data.ledtopic, 'off')//mqtt推送offthis.setData({ ledicon: "/utils/img/linghtoff.png",//設置led圖片為off});}}
完整的小程序項目代碼參考:點此下載
在巴法云控制臺可以看到小程序發送的消息記錄 :
https://cloud.bemfa.com/zip/mqtt/wxbemfa.zip
備注
(1)在手機上預覽調試需要用真實的小程序id,沒有的話先去去微信公眾平臺注冊一個。在項目中添加小程序id有兩種方法:1.在導入項目時填寫;2.在項目根目錄下的project.config.json文件中填寫appid。
(2)如果小程序發不出消息,去微信公眾平臺,找到你當前的小程序,在request合法域名處,添加域名https://api.bemfa.com
arduino的可參考【基于Arduino IDE平臺開發ESP8266連接巴法云】_esp8266巴法云-CSDN博客