简介:
这次主要想实现的功能:模拟真实设备上报遥测数据到thingsboard平台,进行数据采集工作。
通过esp8266模拟设备,通过MQTT协议发送遥测数据到thingsboard平台
前期准备:
之前搭建好的thingsboard平台
NodeMCU开发板
开发NodeMCU的工具:Arduino
实现过程
1创建一个测试设备
打开我们thingsboard平台设备管理界面,点击新建设备。
点击设备进入详情页面,点击复制设备访问令牌,先保存下来,这个后面用于mqtt连接的用户名
2编写上报数据的逻辑代码烧录到我们的esp8266开发板中
附上源代码:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "WIFE名称";
const char* password = "WIFE密码";
const char* mqttServer = "MQTT服务器ip地址";
// MQTT服务端连接用户名密码
const char* mqttUserName = "设备访问令牌";
const char* mqttPassword = NULL;
Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
int count; // Ticker计数用变量
void setup() {
Serial.begin(9600);
// Ticker定时对象
ticker.attach(1, tickerCount);
//设置ESP8266工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 连接WiFi
connectWifi();
// 设置MQTT服务器和端口号
mqttClient.setServer(mqttServer, 1883);
// 连接MQTT服务器
connectMQTTServer();
}
void loop() {
// 如果开发板未能成功连接服务器,则尝试连接服务器
if (!mqttClient.connected()) {
connectMQTTServer();
}
mqttClient.loop();
// 每隔3秒钟发布一次信息
if (count >= 3){
pubMQTTmsg();
count = 0;
}
}
void tickerCount(){
count++;
}
void connectMQTTServer(){
// 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
String clientId = "esp8266-" + WiFi.macAddress();
// 连接MQTT服务器。此处使用了程序首部定义的用户名和密码来实现MQTT服务端认证
if (mqttClient.connect(clientId.c_str(), mqttUserName, mqttPassword)) {
Serial.println("MQTT Server Connected.");
Serial.print("Server Address: ");
Serial.println(mqttServer);
Serial.print("ClientId: ");
Serial.println(clientId);
} else {
Serial.print("MQTT Server Connect Failed. Client State:");
Serial.println(mqttClient.state());
delay(3000);
}
}
// 发布信息
void pubMQTTmsg(){
static int value;
// 建立发布主题。主题名称以taichi/Pub-为前缀,后面添加设备的MAC地址。
// 这么做是为确保不同用户进行MQTT信息发布时,ESP8266客户端名称各不相同,
String topicString = "v1/devices/me/telemetry";
char publishTopic[topicString.length() + 1];
strcpy(publishTopic, topicString.c_str());
// 建立发布信息。信息内容以Hello World为起始,后面添加发布次数。
String messageString = "{\"count\":"+String(value++)+"}";
//String messageString = "Hello World " + String(value++);
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
// 实现ESP8266向主题发布信息
if(mqttClient.publish(publishTopic, publishMsg)){
Serial.println("Publish Topic:");Serial.println(publishTopic);
Serial.println("Publish message:");Serial.println(publishMsg);
} else {
Serial.println("Message Publish Failed.");
}
}
// 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("");
}
这边模拟发送的遥测数据主要是测试数据上报,定义了一个count属性字段,
每隔三秒加+1,看数据上报到thingsboard是否实时变化。
3程序编写测试通过后点击编译,然后上传就完成了。
需要注意的几个地方:
1这里开发板要保证WIFE能够正常连接,使其通上网络
2发送遥测数据主题为:v1/devices/me/telemetry,这个thingsboard中文文档有详情介绍
3这里的mqttUserName对应设备的访问令牌,不要填写错了。
视频演示:
esp8266模拟设备上报遥测数据到thingsboard
总结
这里实现数据上报的逻辑已经基本完成了,后续可以把上报的报文换成真实的报文属性字段进行测试。如果设备是基于mqtt协议的可以根据这个逻辑实现数据上报到thingsboard平台,如果是其他的协议,也可以通过thingsboard的网关实现协议之间的转换然后再进行数据上报,这个后面也会考虑记录一下实现操作,今天就先到这里了,有感兴趣的小伙伴可以一起交流呀。