• ESP8266连接MQTT服务器并实现点灯操作


    因为工创Ⅲ的缘故不得不重新学习原来大一所学的ESP8266和MQTT服务器相关的知识,但是本人记性实在是非常的差,为了重新学习又在网上搜集了很久的知识,这里为了防止以后出现类似的情况,这里就写一篇博客记录一下。

    前置准备

    我们首先需要在windows自带的商店中装上ubuntu虚拟机(用于配置服务器)和MQTTBox软件(用于测试服务器)。Ubuntu有很多种类型,具体选择的型号选择下图所示的这一种:

    Ubuntu下载好了之后,进去进行基础配置。(密码因为奇怪的原因输入的时候不会显示,大家记住自己的密码输的是什么就好!)

    然后下面进行的就是在Ubuntu上安装其配置EMQX服务器的操作,具体操作可以去看:

    官方文档

    配置好了以后,一般只需要记住以下三条常用指令:

    启动emqx服务器

    sudo emqx start
    

    关闭emqx服务器

    sudo emqx stop
    

    在浏览器输入localhost:18083即可访问服务器的Dashboard,密码为默认密码。

    测试

    打开emqx服务器后测试需要使用mqttbox,打开mqttbox,点击上方Create MQTT Client

    protocol选择mqtt/tcp,Host填入服务器所在Ipv4地址,可以使用cmd输入ipconfig获得。第一个ClientName随便填一个即可。

    然后点击save。

    如图,如果上述按钮变为绿色显示connected,说明连接服务器成功,测试成功!

    ESP8266连接并控制其上的LED灯

    控制代码如下(有详细注释):

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
     
    // 设置wifi接入信息(请根据您的WiFi信息进行修改)
    const char* ssid = "************";//WiFi名称
    const char* password = "*********";//WiFi密码
    const char* mqttServer = "***********";//服务器地址
     
    // 如以上MQTT服务器无法正常连接,请前往以下页面寻找解决方案
    // http://www.taichi-maker.com/public-mqtt-broker/
     
    WiFiClient wifiClient;
    PubSubClient mqttClient(wifiClient);
    const byte ledPin = LED_BUILTIN; // 需要控制的led灯
    void setup() {
      Serial.begin(9600);
     
      //设置ESP8266工作模式为无线终端模式
      WiFi.mode(WIFI_STA);
      
      // 连接WiFi
      connectWifi();
      
      // 设置MQTT服务器和端口号
       mqttClient.setServer(mqttServer, 1883);
      // 连接MQTT服务器
        connectMQTTServer();
       mqttClient.setCallback(callback);        // 设置回调,控制led灯
       pinMode(ledPin,OUTPUT);
    }
     
    void loop() { 
      if (mqttClient.connected()) { // 如果开发板成功连接服务器    
        mqttClient.loop();          // 保持客户端心跳
      } else {                  // 如果开发板未能成功连接服务器
        connectMQTTServer();    // 则尝试连接服务器
      }
    }
     
    void connectMQTTServer(){
      // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
      String clientId = "esp8266-" + WiFi.macAddress();
     
      // 连接MQTT服务器
      if (mqttClient.connect(clientId.c_str())) { //设置mqtt主题的id
        //连接成功后就订阅主题
        mqttClient.subscribe("hopeful");//订阅主题
        Serial.print("订阅主题成功!!");
      } else {
        Serial.println(mqttClient.state());
        delay(3000);
      }   
    }
     
    // ESP8266连接wifi
    void connectWifi(){
     
      WiFi.begin(ssid, password);
     
      //等待WiFi连接,成功连接后输出成功信息
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi Connected!");  
      Serial.println(""); 
    }
     
     
     //回调函数
    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++) {
      char receivedChar = (char)payload[i];
      if (payload[length-1] == '1') {  // 收到消息是 '1' 点亮LED灯
          digitalWrite(ledPin,HIGH);
          Serial.print(receivedChar); // 打印mqtt接收到消息
      }
      if (payload[length-1] == '0')    // 收到消息是 '0' 关闭LED灯
       digitalWrite(ledPin, LOW);
      }
      Serial.println();
    }
    

    在上述基础上,我们通过MQTTBOX订阅hopeful主题,并且在主题中输入1或者0,可以发现ESP8266开发板上的LED灯受到控制,证明实验板成功连上服务器,实验成功!

  • 相关阅读:
    (二)ABP+MetroNic--- 用户管理及角色管理的实现
    BootstrapValidator 自定义服务端验证
    ASP.Net Web API 的参数绑定[翻译]
    ABP webapi IDInput传参
    JqueryTable ServerSide Ajax 数据加载及样式设置
    JqueryTable踩过的坑
    Lambda 表达式中 动态解析OrderbyLinQ语句的实现
    jenkins问题整理
    maven profile实现多环境配置
    Spring 发送内嵌图片的邮件 遇到的问题
  • 原文地址:https://www.cnblogs.com/mudrobot/p/15924914.html
Copyright © 2020-2023  润新知