1. 简介
采用移远的BC20物联网模块,实现NB-IOT的LWM2M协议透传,接下让我们开启ONENET的NB-IOT物联网开发吧!😀😀😀
2. 实验准备
实验准备包括硬件和软件两部分。
- 移远的BC20物联网模块(外加数据线);
- ST-LINGK下载器
- 四根母母杜邦线
2.2 软件
- Keil 5.31版本;
2.10.LWM2M协议传输ADC到ONENET移动云程序; - 浏览器登录onenet平台。
3. 实验步骤
首先搭建onenet平台,记录对应创建的产品相关参数,以便后期程序端口接入开发。👩👩👩
3.1 搭建onenet监控平台
登录onenet平台,选择控制台🎈
来到控制台首页,选择全部产品服务,采用NB-IOT接入🎈🎈
- 立即添加设备,完善相关信息,点击添加完成设备添加🎈🎈🎈🎈
IMSI:460043331905774 //自己串口查询卡号 IMEI:862177042740673 //自己串口查询卡密
具体可参照:【BC20开发板的NB和GPS的硬件调试】
- 这样就添加产品和设备都完成了,然后点击详情🎈🎈🎈🎈🎈
3.2 为ESP8266-NodeMCU烧入程序
- 硬件连接,ESP8266-NodeMCU硬件连接非常简单,只需将DHT11数据线接入D6引脚就好,具体接线如下
ESP8266-NodeMCU -----> USBtoTLL VCC -----> 3.3V GND -----> GND out -----> D6
2. 程序设计,程序有三部分esp8266_mqtt、OneNet和smartConfig,其中:
文件名 | 功能 |
esp8266_mqtt | 程序初始化调用和主程序调用; |
OneNet | 初始化系统、连接OneNet、云端下发、发布温湿度信息 |
smartConfig | 自动连接、一键配网、延时重启 |
esp8266_mqtt代码如下,只需要修改对应的wifi和onenet的三个参数;
/** The blue LED on the ESP-01 module is connected to GPIO1 1.实现ESP8266通过MQTT协议连接ONENET 2.实现DHT11温湿度数据的获取,串口发送调试,并将数据上发ONENET平台,于平台控件中显示数据 3.实现ONENET平台对ESP8266板载LED亮灭的控制 4.实现可以通过WIFI_DEBUG选择是使用一键配网功能还是使用代码中写入的无线账号密码连接,该功能主要考虑程序的通用性 @author 234vor参考https://blog.csdn.net/weixin_43278295/article/details/114900553 @date 2021/10/30 */ #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include <Ticker.h> #include <dht11.h> #define WIFI_DEBUG 1 //1:使用一键配网,其它值则使用默认无线账号密码 #define DHT11PIN 12 //设置DHT引脚为Pin 12(D6) #define ONENET_DISCONNECTED 1 //已经断开 #define ONENET_CONNECTED 2 //已经连接上 #define ONENET_RECONNECT 3 //重连成功 #define VER "ESP8266_MQTT_V1.0" //版本号 #define AP_SSID "J09 502" //需要修改你的wifi名字 #define AP_PSW "qwertyuiop111"//需要修改你的wifi密码 /*OneNet*/ PubSubClient mqttClient; const char* mqttServer = "183.230.40.39";//mqtt服务器 const uint16_t mqttPort = 6002; //端口号 #define onenet_productId "466002" //需要修改产品ID #define onenet_deviceId "804892296" //需要修改设备ID #define onenet_apiKey "EQbaLsJlXRaIG8gD7w5Dsc6i3hc=" //需要修改API_KEY int state; Ticker delayTimer; WiFiClient espClient; dht11 DHT11; /* 初始化ONENET通信 */ void initOneNetMqtt() { mqttClient.setServer(mqttServer, mqttPort); mqttClient.setClient(espClient); mqttClient.setCallback(callback); } /* 初始化 */ void setup() { initSystem(); initOneNetMqtt(); } /* 主函数 */ void loop() { ESP.wdtFeed(); DHT11.read(DHT11PIN); state = connectToOneNetMqtt(); Serial.println(WiFi.status()); if (state == ONENET_RECONNECT) { mqttClient.loop(); } else if (state == ONENET_CONNECTED) { printf("temp:%d \r\n", DHT11.temperature); printf("humi:%d \r\n", DHT11.humidity); Temp_pubMQTTmsg(DHT11.temperature); Humi_pubMQTTmsg(DHT11.humidity); mqttClient.loop(); } delay(2000); }
OneNet代码如下
/** * The blue LED on the ESP-01 module is connected to GPIO1 初始化系统、连接OneNet、云端下发、发布温湿度信息 */ /* 初始化系统 */ void initSystem() { int cnt = 0; Serial.begin (115200); Serial.println("\r\n\r\nStart ESP8266 MQTT"); Serial.print("Firmware Version:"); Serial.println(VER); Serial.print("SDK Version:"); pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); Serial.println(ESP.getSdkVersion()); ESP.wdtEnable(5000); if (WIFI_DEBUG == 1) //开启一键配网模式 { if (!autoConfig()) { Serial.println("Start smartConfig"); smartConfig(); } } else { WiFi.begin(AP_SSID, AP_PSW); while (WiFi.status() != WL_CONNECTED) { delay(500); cnt++; Serial.print("."); if (cnt >= 40) { cnt = 0; //重启系统 delayRestart(1); } } } Serial.print("WIFI Connect \r\n"); } /* 连接OneNet */ int connectToOneNetMqtt() { int cnt = 0; while (!mqttClient.connected()) { ESP.wdtFeed(); cnt++; Serial.println("Connect to OneNet MQTT..."); if (mqttClient.connect(onenet_deviceId, onenet_productId, onenet_apiKey)) { Serial.println("connect success!"); return ONENET_RECONNECT; } else { Serial.print("connect fail!"); Serial.println(" try again in 5 seconds"); delayNs(5); } if (cnt >= 10) { //只做10次连接到OneNet,连接不上重启8266 cnt = 0; delayRestart(1); } } return ONENET_CONNECTED; } /* 云端下发 */ void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); if ((char)payload[0] == '1') { digitalWrite(LED_BUILTIN, LOW); } else { digitalWrite(LED_BUILTIN, HIGH); } } /* 发布温度信息 */ void Temp_pubMQTTmsg(uint32_t data) { long lastMsg = 0; char msg[50]; char tmp[28]; char d[3]; snprintf(tmp, sizeof(tmp), "{\"Temp\":%d}", data); uint16_t streamLen = strlen(tmp); d[0] = '\x03'; d[1] = (streamLen >> 8); d[2] = (streamLen & 0xFF); snprintf(msg, sizeof(msg), "%c%c%c%s", d[0], d[1], d[2], tmp); mqttClient.publish("$dp", (uint8_t*)msg, streamLen + 3, false); } /* 发布湿度信息 */ void Humi_pubMQTTmsg(uint32_t data) { long lastMsg = 0; char msg[50]; char tmp[28]; char d[3]; snprintf(tmp, sizeof(tmp), "{\"Humi\":%d}", data); uint16_t streamLen = strlen(tmp); d[0] = '\x03'; d[1] = (streamLen >> 8); d[2] = (streamLen & 0xFF); snprintf(msg, sizeof(msg), "%c%c%c%s", d[0], d[1], d[2], tmp); mqttClient.publish("$dp", (uint8_t*)msg, streamLen + 3, false); }
smartConfig 代码如下
/** * The blue LED on the ESP-01 module is connected to GPIO1 自动连接、一键配网、延时重启 */ /* 自动连接 */ bool autoConfig() { delay(2000); for (int i = 0; i < 20; i++) { Serial.println("Setup start"); //启动STA模式,并连接到wifi网络 WiFi.begin(AP_SSID, AP_PSW); Serial.print(String("Connecting to ") + AP_SSID); if (WiFi.status() == WL_CONNECTED) { Serial.println("AutoConfig Success"); Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str()); Serial.printf("PSW:%s\r\n", WiFi.psk().c_str()); WiFi.printDiag(Serial); return true; } else { Serial.print("AutoConfig Waiting......"); Serial.println(WiFi.status()); delay(5000); } } Serial.println("AutoConfig Faild!" ); return false; } /* 一键配网 */ void smartConfig() { WiFi.mode(WIFI_STA); Serial.println("\r\nWait for Smartconfig"); WiFi.beginSmartConfig(); while (1) { Serial.print("."); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); if (WiFi.smartConfigDone()) { Serial.println("SmartConfig Success"); Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str()); Serial.printf("PSW:%s\r\n", WiFi.psk().c_str()); WiFi.setAutoConnect(true); // 设置自动连接 break; } delay(2000); // 这个地方一定要加延时,否则极易崩溃重启 } } /* 延时N秒 */ void delayNs(uint8_t m) { for (uint8_t index = 0; index < m; index ++) { delay(1000); ESP.wdtFeed(); } } /* 延时重启 */ void delayRestart(float t) { Serial.print("Restart after "); Serial.print(t); Serial.println("s"); delayTimer.attach(t, []() { Serial.println("\r\nRestart now!"); ESP.restart(); }); }
选择NodeMCU1.0,端口选对应的,其他默认,最后点击上传;
上传成功,点击串口监视器
Arduino串口打印显示,onenet平台显示设备在线,点击详情,选择数据流展示可见温湿度数据
记录这两个变量名称,Humi是湿度,Temp是温度,后面两者有交互
Humi Temp
3.3 onenet平台交互显示开发
- 选择数据模板,添加humi数据流模板
添加Temp数据流模板
选择触发器管理,添加触发器
选择应用管理,添加应用
然后双击lab,进行应用控制设计
进行以上操作后点击右上角保存和发布,然后选择应用管理刷新,就可以看见温湿度的动态变化🎉🎉🎉
4. 总结
本文是一个难度中等的物联网项目,实现ESP8266一键配网功能、MQTT协议连接ONENET、DHT11温湿度数据的获取、数据上发ONENET平台、ESP8266板载LED亮灭的控制、温度限幅触发器提示
在以后的博文中我们将学会用ESP8266做常用的物联网开发,从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。