本人玩各种AI硬件、具身智能、AI算法、模型训练、机器视觉等。欢迎合作!!!
通过 ESP32 连接公共 MQTT Broker(broker.emqx.io),实现 LED 远程控制和定时数据上报,无需自建服务器。
硬件
- ESP32 开发板(任意型号)
- USB 数据线
环境
- Arduino IDE 安装 ESP32 板级支持
- 库管理器搜索安装PubSubClient by Nick O’Leary
代码
#include<WiFi.h>#include<PubSubClient.h>#defineLED_BUILTIN14// ========== 配置区(修改这里) ==========constchar*ssid="你的WiFi名称";constchar*password="你的WiFi密码";constchar*mqtt_broker="broker.emqx.io";constchar*mqtt_topic="emqx/esp32";constintmqtt_port=1883;// ========================================WiFiClient espClient;PubSubClientmqtt_client(espClient);// 获取芯片唯一IDStringgetChipId(){returnString((uint32_t)ESP.getEfuseMac());}voidconnectToWiFi(){WiFi.begin(ssid,password);Serial.print("Connecting WiFi");while(WiFi.status()!=WL_CONNECTED){delay(500);Serial.print(".");}Serial.printf("\nConnected! IP: %s\n",WiFi.localIP().toString().c_str());}voidconnectToMQTT(){String client_id="esp32-"+getChipId();while(!mqtt_client.connected()){Serial.printf("Connecting MQTT as %s...\n",client_id.c_str());if(mqtt_client.connect(client_id.c_str(),nullptr,nullptr)){mqtt_client.subscribe(mqtt_topic);mqtt_client.publish(mqtt_topic,"ESP32 online");Serial.println("MQTT connected & subscribed");}else{Serial.printf("Failed (rc=%d), retry in 5s\n",mqtt_client.state());delay(5000);}}}// 每10秒发布模拟传感器数据voidpublishMessage(){String msg="{\"device\":\"esp32-"+getChipId()+"\",\"temp\":"+String(random(20,30))+",\"humidity\":"+String(random(40,70))+"}";if(mqtt_client.publish(mqtt_topic,msg.c_str()))Serial.printf("Published: %s\n",msg.c_str());}// 收到消息时自动触发voidmqttCallback(char*topic,byte*payload,unsignedintlength){String msg;for(unsignedinti=0;i<length;i++)msg+=(char)payload[i];Serial.printf("Received [%s]: %s\n",topic,msg.c_str());if(msg=="ledon")digitalWrite(LED_BUILTIN,HIGH);if(msg=="ledoff")digitalWrite(LED_BUILTIN,LOW);}voidsetup(){Serial.begin(115200);pinMode(LED_BUILTIN,OUTPUT);connectToWiFi();mqtt_client.setServer(mqtt_broker,mqtt_port);mqtt_client.setKeepAlive(60);mqtt_client.setCallback(mqttCallback);connectToMQTT();}voidloop(){if(!mqtt_client.connected())connectToMQTT();mqtt_client.loop();// 必须定期调用// 每10秒发布一次staticunsignedlonglast=0;if(millis()-last>10000){last=millis();publishMessage();}}代码要点
| 功能 | 说明 |
|---|---|
mqtt_client.loop() | loop 中必须调用,维持连接 + 处理消息 |
setKeepAlive(60) | 心跳 60 秒,防止 Broker 判定超时 |
getChipId() | 用芯片 MAC 作为唯一 client_id |
| 断线重连 | 每次循环检查连接状态,断开自动重连 |
测试
MQTT Explorer:连接broker.emqx.io:1883,向主题emqx/esp32发送ledon/ledoff控制 LED。
命令行:
# 接收数据mosquitto_sub-hbroker.emqx.io-t"emqx/esp32"# 发送指令mosquitto_pub-hbroker.emqx.io-t"emqx/esp32"-m"ledon"常见问题
- WiFi 连不上:ESP32 只支持 2.4GHz
- 收不到消息:确认主题一致;
loop()已调用 - PubSubClient.h 找不到:安装 PubSubClient 库
- LED 不亮:确认
LED_BUILTIN引脚与板子一致