• esp8266物联网开发四:MQTT再论部控


    之前利用点灯科技的库来使小爱同学控制LED的过程中,我们大略提到了一下MQTT的整体流程,由于其MQTT服务器是由点灯科技提供的,所以对其中的很多连接细节,我们并不知道,本节我们准备通过搭建本地的MQTT服务器,然后通过MQTT Client向MQTT服务器发送控制命令,来控制我们的LED灯。

    首先,我们需要启动MQTT服务器,启动方式我们就不需要多说了,之前章节有讲解,启动完毕之后,其连接地址为:192.168.43.2:1883,切记连接地址不可写成127.0.0.1,否则无法连接成功。

    然后,开始进行编码操作,具体编码内容如下:

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    
    #define JDQ 16
    
    const char* MQTT_SERVER  = "192.168.43.2";
    const int   MQTT_PORT    = 1883;
    const char* MQTT_USRNAME = "addmin";
    const char* MQTT_PASSWD  = "public";
    const char* TOPIC = "home/devices/onoff/";
    const char* CLIENT_ID    = "scy-mqtt-client";  //当前设备的clientid标志
    
    const char* ssid     = "cxsr";     //待连接WIFI
    const char* password = "scy251147";//待连接WIFI密码
    
    WiFiClient espClient;
    PubSubClient  client(espClient);
    long lastMsg = 0;   
    
    /**
    * 连接wifi
    */
    void setupWifi(){
      delay(100);
      Serial.println("Startup");
      pinMode(JDQ, OUTPUT);
      WiFi.mode(WIFI_STA);//设置模式为STA
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {//等待WiFi连接成功
        delay(500);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    
    void reconnect() {
      while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Attempt to connect
        if (client.connect(CLIENT_ID)) {
          Serial.println("connected");
          // 连接成功时订阅主题
          client.subscribe(TOPIC);
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }
    
    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]); // 打印主题内容
      }
      if ((char)payload[0] == '1') {
        digitalWrite(JDQ, HIGH);   // 亮灯
        Serial.print(" 开灯");
      } else {
        digitalWrite(JDQ, LOW);   // 熄灯
        Serial.print(" 关灯");
      }
    
      Serial.println();
    }
    
    void setup() {
      Serial.begin(115200);
      pinMode(JDQ, OUTPUT);
      setupWifi();
      client.setServer(MQTT_SERVER, MQTT_PORT); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口
      client.setCallback(callback);        //设定回调方式,当ESP8266收到订阅消息时会调用此方法
    }
    
    void loop() {
      if (!client.connected()) {
        reconnect();
      }
      client.loop();
    }

    需要说明的是,在执行过程中,将会先进行联网操作,然后进行连接MQTT服务端的操作,这俩操作都进行完毕之后,我们就可以通过MQTT Client来进行控制了。

    代码烧写完毕后,通过串口调试窗口,我们可以看到具体的连接情况:

    image

    之后,我们打开本地的MQTT Client,连接到home/devices/onoff/主题,连接成功后,发送控制代码:

    image

    这里我发送了1,代表打开继电器,也就是开灯操作,可以看到,灯被我们打开了:

    image

    当发送0的时候,代表继电器关闭,灯就关了,如图:

    image

    image

    这时候,我们的串口监视器上,可以看到打印的日志如下:

    image

    如果掉线了,具有掉线重连功能:

    是不是很好用呢?

  • 相关阅读:
    Access Token 机制详解
    Authorization Code 授权原理和实现方法
    Access Token 与 Refresh Token
    简单介绍 Oauth2.0 原理
    进行web开发时应该考虑的架构性因素
    查看linux服务器CPU数量
    Centos7 修改主机名
    Centos6 编译安装Python3.6
    Linux编译安装软件常见问题及排查
    问题列表
  • 原文地址:https://www.cnblogs.com/scy251147/p/12773201.html
Copyright © 2020-2023  润新知