前置工作
- 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);// 连接WiFiconnectWifi();// 设置服务端端口号,我这里是默认的 1883mqttClient.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 地址生成客户端 IDString 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
-
烧录结果
-
打开端口监视器,开发板在正常发送测试数据
服务端控制台信息
- 到这里就基本上测试完成
- 如需协议转换可通过软网关或硬网关自行对接测试