Bootstrap

thingsboard+ESP8266+MQTT实现设备远程控制

简介:

本次主要想实现功能:thingsboard平台远程控制设备
设备(ESP8266上的灯作为一台设备,模拟控制灯的开关)
指令传输通过thingsboard平台集成的MQTT协议
利用thingsboard仪表盘库的一个控制组件模拟发送指令来控制我们的
灯的开关

前期准备:

  1. 之前搭建好的thingsboard平台
  2. NodeMCU开发板
  3. 开发NodeMCU的工具:Arduino
    在这里插入图片描述
    在这里插入图片描述

操作过程

1新建一个测试设备

新建一个租户账号进入到我们的thingsboard平台后点击设备管理新建一个设备。
在这里插入图片描述
新建成功后点击设备进入详情页面,点击复制设备访问令牌,这个是后面MQTT访问对应的用户名,可以先保存下来
在这里插入图片描述

2在仪表盘库新建一个开关

后面将用这个开关模拟发送指令控制设备
首先我们先要建一个仪表板,用于放置我们的开关组件。
在这里插入图片描述
新建成功后打开仪表板,点击编辑选择一个开关控制组件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后保存退出,完成。
这里我们可以点击开关,打开调试控制台看它发出的指令
在这里插入图片描述

3编辑相关接收灯开关的指令对应代码烧录到我们的ESP8266开发板上。

这里我使用的是开关工具是:Arduino
开发之前要先确保我们的ESP8266连接上我们的Arduino
这个可以参考太极创客的官网进行相关学习操作,官网地址:
http://www.taichi-maker.com/
在这里插入图片描述
确保连接成功后,就可以编写我们的程序了。
在这里插入图片描述
附上源代码:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
 
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "WIFE名称";
const char* password = "WIFE密码";
const char* mqttServer = "MQTT服务端地址,我们搭建本地thingsboard成功后对应的就是我们网络的ip地址";

// MQTT服务端连接用户名密码
const char* mqttUserName = "设备访问令牌";
const char* mqttPassword = NULL;
 
 
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(), mqttUserName, mqttPassword)) { 
    //连接成功后就订阅主题
    mqttClient.subscribe("v1/devices/me/rpc/request/+");//订阅主题
    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.println("begin callback");
   char s[length];
   for (int i=0;i<length;i++) {
    s[i]=(char)payload[i];
   }
    std::string str;
    str=s;
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, str);
    JsonObject obj = doc.as<JsonObject>();
   
    const char* methodName;
    bool value;
   
    methodName=obj["method"];

    value=obj["params"];
    Serial.println(methodName);
    Serial.println(value);
    
      if(value==1){
      Serial.println("开灯");
      digitalWrite(ledPin,HIGH);
    }else{
      Serial.println("关灯");
      digitalWrite(ledPin, LOW);
    }


}

4需要注意的几个地方:

1首先要确保我们的ESP8266能够连接上WIFE
2确保我们的MQTT订阅成功,即
mqttClient.subscribe(“v1/devices/me/rpc/request/+”);//订阅主题
这个对应thingsboard中文文档里有详细介绍:
在这里插入图片描述
3这里的methodName,value接收的thingsboard点击开关后传递过来的指令,这里自己看情况编写相应代码,楼主这里只是测试,所以写的比较简单。
4mqttUserName这个对应我们设备之前的访问令牌
5如果测试过程中一直失败,可以先用MQTT客户端工具测试看看能不能接收到订阅的消息
在这里插入图片描述

5编写程序完成后点击编译然后上传烧录到我们的开发板中,就可以进行测试了,大功告成!!!

在这里插入图片描述

演示视频

thingsboard模拟发送指令控制esp8266的灯开关

学习总结

本次过程只是简单的模拟了一下设备远程控制,其实里面还有好多的东西我们可以去实现的,有很多可以优化的地方。
例如:可以写一个微信小程序或者app去远程控制我们的设备,
现在程序的wife和密码都是固定的,不灵活,这里可以实现动态配置,也就是我们经常提到的设备配网,这个后面也会考虑写一期记录一下。还有很多很多,就先记录到这里了,感兴趣的小伙伴可以一起学习交流呀。

;