esp8266跨坑技巧

esp8266 MQTT服务器 串口收发

2018-09-26  本文已影响581人  高巨龙

参考资料:
https://www.jianshu.com/p/7f54b92d7a7b

image.png

下载MQTT库函数

通过菜单栏里"文件"→“示例”最下面找到PubSubClient查看是否下载成功

image.png

代码介绍

功能说明:
串口输入"ON"或者“OFF”到通过MQTT协议,以“LED”为主题发送到服务器,同时订阅“LED”,消息到服务器后就会立刻返回。根据返回的信息来控制NodeMCU板载LED灯。同时我们使用MQTT调试助手给“LED”主题发送“OFF”或者“ON”也可以实现板载LED的控制!

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
    const char* ssid = "XXX";//连接的路由器的名字
    const char* password = "XXXXX";//连接的路由器的密码
    const char* mqtt_server = "XXXX";//服务器的地址 
    const int port=1883;//服务器端口号
    
    const char* topic_name = "LED";//订阅的主题
    const char* client_id = "esp8266_0000001";//尽量保持唯一,相同的id连接会被替代
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
    //初始化WIFI
    void setup_wifi() {//自动连WIFI接入网络
      delay(10);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print("...");
        
      }
    }
    
    
    void callback(char* topic, byte* payload, unsigned int length) {
      String callMsg = "";
      Serial.print("Message arrived [");
      Serial.print(topic);   // 打印主题信息
      Serial.print("] ");
    
      for (int i = 0; i < length; i++) {
        callMsg += char(payload[i]);
      }
      
      Serial.println(callMsg);
      
      //如果返回ON关闭LED
      if(callMsg.equals("ON")){
           digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
        }
    
       //如果返回OFF关闭LED
      if(callMsg.equals("OFF")){
           digitalWrite(LED_BUILTIN, HIGH);   // Turn the LED off by making the voltage HIGH
        }
    }
    
    
    
    
    void reconnect() {//等待,直到连接上服务器
      while (!client.connected()) {//如果没有连接上
        if (client.connect(client_id)) {//接入时的用户名,尽量取一个很不常用的用户名
          client.subscribe(topic_name);//接收外来的数据时的intopic
          Serial.println("connect success");
        } else {
          Serial.print("failed, rc=");//连接失败
          Serial.print(client.state());//重新连接
          Serial.println(" try again in 5 seconds");//延时5秒后重新连接
          delay(5000);
        }
      }
    }
    
    
    void setup() {//初始化程序,只运行一遍
      Serial.begin(115200);//设置串口波特率(与烧写用波特率不是一个概念)
      
      pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
      digitalWrite(LED_BUILTIN, HIGH);
      
      setup_wifi();//自动连WIFI接入网络
      client.setServer(mqtt_server, port);//端口号
      client.setCallback(callback); //用于接收服务器接收的数据
    }
    
    
    
    
    void loop() {//主循环
      String msg = "";//用于存放
       reconnect();//确保连上服务器,否则一直等待。
       client.loop();//MUC接收数据的主循环函数。
      
       
      while (Serial.available() > 0)  
        {
            msg += char(Serial.read());
            delay(2);
        }
        int msglen = msg.length();
        if (msglen > 0)
        {
            Serial.println(msg);
            char msgArr[msglen+1];
            msg.toCharArray(msgArr,msglen + 1);
            client.publish(topic_name,msgArr);
        }
       
    }

上传程序到我们的开发板成功后打开串口调试!

使用MQTT测试助手

上一篇 下一篇

猜你喜欢

热点阅读