import time
import network
from umqttsimple import MQTTClient
# ---- 添加 --------
from machine import Pin  #

def do_connect():
    #STA,链接热点模式
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('Redmi', '123456789')
        i = 1
        while not wlan.isconnected():
            print("正在链接...{}".format(i))
            i += 1
            time.sleep(1)
    print('network config:', wlan.ifconfig())


def sub_cb(topic, msg): # 回调函数,收到服务器任何类型(主题)消息后都会调用这个函数
    print(topic, msg)
        # ---- 添加 --------
    if topic.decode("utf-8") == "ledctl" and msg.decode("utf-8") == "on":
        led_pin.value(1)
    elif topic.decode("utf-8") == "ledctl" and msg.decode("utf-8") == "off":
        led_pin.value(0)
    # ---- 添加 --------


# 1. 联网,esp32要和mqt服务器(本地电脑)在同一个局域网下
do_connect()
# 2. 在esp32上创建mqtt客户端,客户端名称,mqt服务器ip
c = MQTTClient("umqtt_client", "192.168.56.8")  # 建立一个MQTT客户端
c.set_callback(sub_cb)  # 设置回调函数,当收到服务器任何消息后都会调用这个函数
c.connect()  # 建立连接
c.subscribe(b"ledctl")  # 给服务器说订阅这个主题
# ---- 添加 --------
# 3. 创建LED对应Pin对象
led_pin = Pin(2, Pin.OUT)
# ---- 添加 --------
while True:
    c.check_msg()#检测是否有消息
    time.sleep(1)

数据传输时为byte类型,要进行decode解码,解码类型为utf-8,

mqttx向服务器发送消息和消息类型,服务器接收,发现有客户端(esp32)订阅该消息类型,会把该消息转发给esp32,esp32进行解码后进行逻辑判断,执行对应的函数。三者在同一局域网下

链接远程emqx:

连接本地emqx,

端口号 1883

ip:电脑的ip地址,这次是192.168.3.75

emqx效果

更多推荐