硬件学习_ESP32_IOT_MQTT与巴法云通信

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烧录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值