简介:
本次主要想实现功能:thingsboard平台远程控制设备
设备(ESP8266上的灯作为一台设备,模拟控制灯的开关)
指令传输通过thingsboard平台集成的MQTT协议
利用thingsboard仪表盘库的一个控制组件模拟发送指令来控制我们的
灯的开关
前期准备:
- 之前搭建好的thingsboard平台
- NodeMCU开发板
- 开发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和密码都是固定的,不灵活,这里可以实现动态配置,也就是我们经常提到的设备配网,这个后面也会考虑写一期记录一下。还有很多很多,就先记录到这里了,感兴趣的小伙伴可以一起学习交流呀。