采用移远的BC20物联网模块,实现NB-IOT的LWM2M协议透传,接下让我们开启ONENET的NB-IOT物联网开发吧!😀😀😀
LwM2M协议是OMA组织制定的轻量化的M2M协议,主要面向基于蜂窝的窄带物联网(Narrow Band Internet of Things, NB-IoT)场景下物联网应用,聚焦于低功耗广覆盖(LPWA)物联网(IoT)市场,是一种可在全球范围内广泛应用的新兴技术。具有覆盖广、连接多、速率低、成本低、功耗低、架构优等特点。
LwM2M协议适用于轻量级的协议适用于各种物联网设备,LwM2M定义了三个逻辑实体:
LwM2M Server 服务器;
LwM2M Client 客户端,负责执行服务器的命令和上报执行结果;
LwM2M 引导服务器 Bootstrap Server,负责配置LwM2M客户端。
LwM2M协议架构及协议栈如下图所示:
实验准备包括硬件和软件两部分。
你要实现用ESP 8266+ONENET物联网你需要准备以下材料
首先搭建onenet平台,记录对应创建的产品相关参数,以便后期程序端口接入开发。👩👩👩
IMSI:460043331905774
//自己串口查询卡号
IMEI:862177042740673
//自己串口查询卡密
具体可参照:【BC20开发板的NB和GPS的硬件调试】
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
#include
#include
#include
#include
#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
选择数据模板,添加humi数据流模板
添加Temp数据流模板
选择触发器管理,添加触发器
选择应用管理,添加应用
然后双击lab,进行应用控制设计
进行以上操作后点击右上角保存和发布,然后选择应用管理刷新,就可以看见温湿度的动态变化🎉🎉🎉
我自己在尝试其他的拓展,显示效果如下