赞
踩
本次主要想实现功能:thingsboard平台远程控制设备
设备(ESP8266上的灯作为一台设备,模拟控制灯的开关)
指令传输通过thingsboard平台集成的MQTT协议
利用thingsboard仪表盘库的一个控制组件模拟发送指令来控制我们的
灯的开关
新建一个租户账号进入到我们的thingsboard平台后点击设备管理新建一个设备。
新建成功后点击设备进入详情页面,点击复制设备访问令牌,这个是后面MQTT访问对应的用户名,可以先保存下来
后面将用这个开关模拟发送指令控制设备
首先我们先要建一个仪表板,用于放置我们的开关组件。
新建成功后打开仪表板,点击编辑选择一个开关控制组件
然后保存退出,完成。
这里我们可以点击开关,打开调试控制台看它发出的指令
这里我使用的是开关工具是: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); } }
1首先要确保我们的ESP8266能够连接上WIFE
2确保我们的MQTT订阅成功,即
mqttClient.subscribe(“v1/devices/me/rpc/request/+”);//订阅主题
这个对应thingsboard中文文档里有详细介绍:
3这里的methodName,value接收的thingsboard点击开关后传递过来的指令,这里自己看情况编写相应代码,楼主这里只是测试,所以写的比较简单。
4mqttUserName这个对应我们设备之前的访问令牌
5如果测试过程中一直失败,可以先用MQTT客户端工具测试看看能不能接收到订阅的消息
thingsboard模拟发送指令控制esp8266的灯开关
本次过程只是简单的模拟了一下设备远程控制,其实里面还有好多的东西我们可以去实现的,有很多可以优化的地方。
例如:可以写一个微信小程序或者app去远程控制我们的设备,
现在程序的wife和密码都是固定的,不灵活,这里可以实现动态配置,也就是我们经常提到的设备配网,这个后面也会考虑写一期记录一下。还有很多很多,就先记录到这里了,感兴趣的小伙伴可以一起学习交流呀。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。