前置工作
- Thingsboard平台
- ESP 8266 NodeMCU 开发板
- IDE: Arduino 或 VScode 均可
服务端具体对接流程
-
系统管理员账号通过 Thingsboard 控制面板创建租户等信息并以租户账号登录
-
实体 —> 设备维护具体设备信息
-
创建完成后通过管理凭据修改或直接复制访问令牌
设备端逻辑
- 测试源码,来源于网络并进行简单修改
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
// 设置 wifi 接入信息
const char* wifiName = "Your WiFi name";
const char* password = "Your WiFi password";
// 服务端地址
const char* mqttServerHost = "10.11.11.102";
// 服务端复制的令牌凭证
const char* mqttUserName = "xxxxx";
// thingsboard 默认只验证 username,密码为空
const char* mqttPassword = NULL;
Ticker ticker;
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
int count;
void setup() {
Serial.begin(9600);
// Ticker 定时对象
ticker.attach(1, tickerCount);
//设置 ESP8266 工作模式为无线终端模式
WiFi.mode(WIFI_STA);
// 连接WiFi
connectWifi();
// 设置服务端端口号,我这里是默认的 1883
mqttClient.setServer(mqttServer, 1883);
// 连接服务器
connectMQTTServer();
}
void loop() {
if (!mqttClient.connected()) {
connectMQTTServer();
}
mqttClient.loop();
// 每隔3秒钟发布一次信息
if (count >= 3) {
pubMQTTmsg();
count = 0;
}
}
void tickerCount() {
count++;
}
void connectMQTTServer() {
// 根据 ESP8266 的 MAC 地址生成客户端 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 ThingsBoard 为起始,后面为测试的发布次数
String messageString = "{\"Hello ThingsBoard\":" + String(value++) + "}";
char publishMsg[messageString.length() + 1];
strcpy(publishMsg, messageString.c_str());
// 实现 ESP8266 向主题发布信息
if (mqttClient.publish(publishTopic, publishMsg)) {
Serial.print("Publish Topic:");
Serial.println(publishTopic);
Serial.print("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.println("WiFi connecting......");
}
Serial.println(">>>>>>>>>>>>>> WiFi Connected!");
}
-
指定消息发布主题:v1/devices/me/telemetry,其他主题请查阅官方文档
-
如果部分库找不到,请百度解决
-
IDE 配置开发板相关信息及对应串口
-
编译并烧录至 ESP8266
-
烧录结果
-
打开端口监视器,开发板在正常发送测试数据
服务端控制台信息
- 到这里就基本上测试完成
- 如需协议转换可通过软网关或硬网关自行对接测试