Bootstrap

thingsboard+ESP8266+MQTT实现设备远程上报数据到平台

简介:

这次主要想实现的功能:模拟真实设备上报遥测数据到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的网关实现协议之间的转换然后再进行数据上报,这个后面也会考虑记录一下实现操作,今天就先到这里了,有感兴趣的小伙伴可以一起交流呀。

;