from machine import UART, Pin
import network
import time
from umqtt.simple import MQTTClient
# ===================== 你提供的巴法云信息 =====================
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
BAFA_CLIENT_ID = "8ed6f605289c4a809341ff69cf0d430f" # 你的UID
BAFA_TOPIC = "light002" # 你的主题
MQTT_BROKER = "bemfa.com"
MQTT_PORT = 9501
# =============================================================
# 初始化硬件
uart = UART(1, baudrate=115200, tx=1, rx=3)
led = Pin(2, Pin.OUT) # LED 接 GPIO2
led_status = "off"
# MQTT 客户端
mqtt_client = None
# 连接 WiFi
def connect_wifi():
uart.write(b"\rConnecting to WiFi...\n")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
max_wait = 20
while max_wait > 0:
if wlan.isconnected():
break
max_wait -= 1
time.sleep(1)
uart.write(b".")
if wlan.isconnected():
uart.write(b"\rWiFi connected! IP: " + wlan.ifconfig()[0].encode() + b"\n")
return True
else:
uart.write(b"\rWiFi failed!\n")
return False
# 连接 MQTT
def connect_mqtt():
global mqtt_client
uart.write(b"\rConnecting to MQTT...\n")
mqtt_client = MQTTClient(
client_id=BAFA_CLIENT_ID,
server=MQTT_BROKER,
port=MQTT_PORT,
keepalive=60
)
try:
mqtt_client.connect()
uart.write(b"\rMQTT connected!\n")
return True
except Exception as e:
uart.write(b"\rMQTT connect failed!\n")
return False
# 接收巴法云指令(核心回调)
def on_mqtt_message(topic, msg):
global led_status
uart.write(b"\rReceived: " + msg + b"\n")
# 巴法云下发 on → 亮
if msg == b"on" or msg == b"ON":
led.value(1)
led_status = "on"
uart.write(b"LED ON\n")
# 巴法云下发 off → 灭
elif msg == b"off" or msg == b"OFF":
led.value(0)
led_status = "off"
uart.write(b"LED OFF\n")
# 发送状态到巴法云
def send_led_status(status):
mqtt_client.publish(BAFA_TOPIC, status)
uart.write(b"\rSent to Bemfa: " + status.encode() + b"\n")
# 主程序
def main():
global led_status
# 通电就亮灯
led.value(1)
led_status = "on"
uart.write(b"\rLED ON AT START\n")
# 连WiFi
if not connect_wifi():
return
# 连MQTT
if not connect_mqtt():
return
# 订阅主题 + 设置回调
mqtt_client.set_callback(on_mqtt_message)
mqtt_client.subscribe(BAFA_TOPIC)
uart.write(b"\rSubscribed: " + BAFA_TOPIC.encode() + b"\n")
# 上电发送 on 到巴法云
send_led_status("on")
# 循环
while True:
if mqtt_client:
mqtt_client.check_msg()
time.sleep(0.1)
if __name__ == "__main__":
main()