ESP32 Arduino 连接巴法云MQTT服务
巴法云的开发文档较为简略,在网上搜寻了一段时间没有发现ESP32使用MQTT与服务器通信的代码,特此记录一下。
代码效果
仅测试联通效果,ESP32每2s向MQTT服务器发布固定消息。
通过巴法云后台,推送消息,ESP32收到后打印到串口。
一些问题
由于该代码订阅与发布使用的是同一个主题,所以设备发出的消息,自己也会收到一份,这很可能导致数据污染,解决方法就是使用两个不同的主题。
代码实现
#include <WiFi.h> //ESP32下的WIFI库
#include "PubSubClient.h" //MQTT库
/*WIFI配置*/
#define WIFISSID "****" //WIFI名称
#define WIFIPSW "********" //WIFI密码
/*MQTT服务器设置*/
#define MQTT_SERVER "bemfa.com" //MQTT服务器
#define MQTT_SERVER_PORT 9501 //MQTT服务器端口
#define MQTT_ID "bc5b7*************c510335" //巴法云密钥
WiFiClient MQTTclient; //WIFI客户端对象
PubSubClient client(MQTTclient); //MQTT客户端对象
long lastMsg = 0;//上次消息发布时间
char msg[50];//消息
/*订阅的主题有消息发布时的回调函数*/
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic); // 打印主题信息
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]); // 打印主题内容
}
Serial.println();
}
/*重连MQTT函数*/
void MQTT_reconnect()
{
/*如果没连接成功一直循环*/
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
// 尝试去连接
if (client.connect(MQTT_ID)){
Serial.println("connected");//连接成功
client.subscribe("TOPIC");//订阅主题
}
else{
Serial.print("failed, rc=");//连接失败,输出状态,五秒后重试
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
/*WIFI重连(等待)函数,WIFI.begin后需要一段时间才能连接成功*/
void WIFI_reconnect(){
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting to WiFi..");
delay(500);
}
/*连接成功输出IP地址*/
Serial.print("\r\nGet IP Address: ");
Serial.println(WiFi.localIP());
}
void setup()
{
Serial.begin(115200);
client.setServer(MQTT_SERVER, MQTT_SERVER_PORT);//连接MQTT服务器
client.setCallback(callback);//绑定回调函数
WiFi.begin(WIFISSID, WIFIPSW);//连接WIFI
}
void loop()
{
/*检查WIFI连接*/
if (WiFi.status() != WL_CONNECTED)WIFI_reconnect();
/*若WIFI已经连接,则检查MQTT连接*/
else if (!client.connected())MQTT_reconnect();
client.loop();
long now = millis();
/*消息间隔*/
if (now - lastMsg > 2000)
{
lastMsg = now;
Serial.println(now);
dtostrf(now, 2, 2, msg);
client.publish("TOPIC", msg); //向指定主题发布消息
}
}
小碎片
-
Publist 只需要主题名和内容即可发布消息,可以理解为单向向服务器发送消息,发布后不进行操作。
-
Subscribe 只需主题名即可订阅消息,会将主题内的消息通过回调函数传输到设备(没有Sub时回调函数不生效)
-
不要忘记Sub订阅了
Esp8266(NodeMCU)使用MQTT连接巴法云服务器
这篇文章就是没有订阅却设置了callback回调函数,存在误导性。 -
订阅必须在连接成功后进行,否则订阅无效。
-
烧录ESP32时,出现
Connecting........_____..
字样后,需多按、长按几次BOOT烧录