Esp8266(NodeMcu)接入新大陆物联网平台并且上传温湿度

2023-11-18

Esp8266[NodeMcu]接入新大陆物联网

1、平台注册和产品创建
2、代码协议部分
    2.1 连接请求协议:
    2.2 数据上报部分协议
3、完整代码部分
3.1 效果图:

使用Esp8266接入新大陆物联网平台,这几天找了一下物联网平台,发现这个物联网平台 新大陆物联网就自己试着接入了以下。以下是接入过程的一些记录,使用DTH11上传温度和湿度数据。

开始先来一张,APP显示的界面图:
在这里插入图片描述
1、平台注册和产品创建

这个平台操作起来相对其它平台比较简单,注册我就不说了,这个是官方文档链接自己看看,官方文档。账号注册完成之后,进入开发者中心,开始创建产品。
  在这里插入图片描述
添加设备:
在这里插入图片描述
添加传感器:
在这里插入图片描述

在这里插入图片描述我自己在上传温度和湿度数据,所以我创建了2个传感器,分别对于温度和湿度数据,添加了一个生成应用,这个类似于界面化可以用来显示数据。
2、代码协议部分

首先在官网查看自己需要的协议文档。协议文档下载链接。我是使用的TCP连接的,所以下载了TCP协议文档。如果想要其它连接方式,自行下载文档查看。
在这里插入图片描述在官方文档可以看到连接的相关协议:
在这里插入图片描述2.1 连接请求协议:
在这里插入图片描述连接请求协议代码部分
在这里插入图片描述2.2 数据上报部分协议
在这里插入图片描述
数据上传协议代码:
在这里插入图片描述更多的相关协议自己在官方文档里面查看,我就不在多说了,我想说的一点是,关于上传数据的处理,程序里面使用的一个库函数,ArduinoJson库,这个库可以处理json字符,进行数据序列化和反序列化,可以看我以前的博客介绍。博客链接:https://blog.csdn.net/weixin_45488643/article/details/106818579
3、完整代码部分

最后贴上完整的程序代码。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <SimpleDHT.h>

//平台接入服务器地址ndp.nlecloud.com或IP 117.78.1.201
#define TCP_SERVER_ADDR "ndp.nlecloud.com"
//服务器端口,tcp新大陆物联TCP端口8600,8700,8800
#define TCP_SERVER_PORT "8600"


//WIFI名称,区分大小写,不要写错  
#define DEFAULT_STASSID  "tsy_B5AC58"   //修改为自己WIFI
//WIFI密码
#define DEFAULT_STAPSW   "19980208"


//设置上传速率5s(1s<=upDataTime<=60s)
#define upDataTime 5*1000
//DHT11引脚值
int pinDHT11 = D4;  //温湿度
//      for DHT11,
//      VCC: 5V or 3V
//      GND: GND
//      DATA: 2

//**************************************************//
SimpleDHT11 dht11(pinDHT11);

//**************************************************//



//最大字节数
#define MAX_PACKETSIZE 512
//设置心跳值10s
#define KEEPALIVEATIME 10*1000



//tcp客户端相关初始化,默认即可
WiFiClient TCPclient;
String TcpClient_Buff = "";
unsigned int TcpClient_BuffIndex = 0;
unsigned long TcpClient_preTick = 0;
unsigned long preHeartTick = 0;//心跳
unsigned long preTCPStartTick = 0;//连接
bool preTCPConnected = false;



//相关函数初始化
//连接WIFI
void doWiFiTick();
void startSTA();

//TCP初始化连接
void doTCPClientTick();
void startTCPClient();
void sendtoTCPServer(String p);

//led 控制函数
void turnOnLed();
void turnOffLed();
//继电器
void turnOnLed1();
void turnOffLed1();



/*
  *发送数据到TCP服务器
 */
void sendtoTCPServer(String p){
  
  if (!TCPclient.connected()) 
  {
    Serial.println("Client is not readly");
    return;
  }
  TCPclient.print(p);
  Serial.println("[Send to TCPServer]:String");
  Serial.println(p);
}


/*
  *初始化和服务器建立连接
*/
void startTCPClient(){
  if(TCPclient.connect(TCP_SERVER_ADDR, atoi(TCP_SERVER_PORT))){
    Serial.print("\nConnected to server:");
    Serial.printf("%s:%d\r\n",TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT));
    DynamicJsonDocument doc(256);
// 替换成自己的
    String Start_put = "{\"t\":\"1\",\"device\":\"QingYeXXXXXXXuRong\",\"Key\":\"6e34a3de19b1475fbc09dd75XXXXXXXXXXXca74916a\",\"ver\":\"v1.1\"}"; //替换成自己的
    deserializeJson(doc, Start_put);  //创建数据
      sendtoTCPServer(Start_put);
    preTCPConnected = true;
    preHeartTick = millis();
    TCPclient.setNoDelay(true);
  }
  else{
    Serial.print("Failed connected to server:");
    Serial.println(TCP_SERVER_ADDR);
    TCPclient.stop();
    preTCPConnected = false;
  }
  preTCPStartTick = millis();
}


/*
  *检查数据,发送心跳
*/
void doTCPClientTick(){
 //检查是否断开,断开后重连
   if(WiFi.status() != WL_CONNECTED) return;

  if (!TCPclient.connected()) {//断开重连

  if(preTCPConnected == true){

    preTCPConnected = false;
    preTCPStartTick = millis();
    Serial.println();
    Serial.println("TCP Client disconnected.");
    TCPclient.stop();
  }
  else if(millis() - preTCPStartTick > 1*1000)//重新连接
    startTCPClient();
  }
  else
  {
    if (TCPclient.available()) {//收数据
      char c =TCPclient.read();
      TcpClient_Buff +=c;
      TcpClient_BuffIndex++;
      TcpClient_preTick = millis();
      
      if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){
        TcpClient_BuffIndex = MAX_PACKETSIZE-2;
        TcpClient_preTick = TcpClient_preTick - 200;
      }
      preHeartTick = millis();
    }
    if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳
      preHeartTick = millis();
      Serial.println("--Keep alive:");
      sendtoTCPServer("$#AT#\r\n");
    }
  }
  
  if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200))
  {//data ready
    TCPclient.flush();
    Serial.println("Buff");
    Serial.println(TcpClient_Buff);

    TcpClient_Buff="";
    TcpClient_BuffIndex = 0;
  }

  //上传数据
  //DTH11上传数据
    if (millis() - preHeartTick >= upDataTime) { //上传数据
      preHeartTick = millis();

      /*****************获取DHT11 温湿度*****************/
      // read without samples.
      byte temperature = 0;
      byte humidity = 0;
      int err = SimpleDHTErrSuccess;
      if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
        Serial.print("Read DHT11 failed, err="); Serial.println(err); delay(1000);
        return;
      }

      /*********************数据上传*******************/
      DynamicJsonDocument doc(1024);
//替换成自己需要的
       String input = "{\"t\":\"3\",\"datatype\":1,\"datas\":{\"Temp\":temperature,\"Hum\":humidity}}"; //替换成自己需要的
       deserializeJson(doc, input);  //创建数据
       //Serial.println(input);
       JsonObject obj = doc.as<JsonObject>();
  
        
       obj["datas"]["Temp"] = temperature;
       obj["datas"]["Hum"] = humidity;
       String output;
       serializeJson(doc, output);
       sendtoTCPServer(output);
       //Serial.println(output);
    }
}

void startSTA(){
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW);

}



/**************************************************************************
                                 WIFI
***************************************************************************/
/*
  WiFiTick
  检查是否需要初始化WiFi
  检查WiFi是否连接上,若连接成功启动TCP Client
  控制指示灯
*/
void doWiFiTick(){
  static bool startSTAFlag = false;
  static bool taskStarted = false;
  static uint32_t lastWiFiCheckTick = 0;

  if (!startSTAFlag) {
    startSTAFlag = true;
    startSTA();
    Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap());
  }

  //未连接1s重连
  if ( WiFi.status() != WL_CONNECTED ) {
    if (millis() - lastWiFiCheckTick > 1000) {
      lastWiFiCheckTick = millis();
    }
  }
  //连接成功建立
  else {
    if (taskStarted == false) {
      taskStarted = true;
      Serial.print("\r\nGet IP Address: ");
      Serial.println(WiFi.localIP());
      startTCPClient();
    }
  }
}
//
void turnOnLed1(){
  Serial.println("Turn ON");
  digitalWrite(LED_Pin,LOW);
}
//继电器
void turnOffLed1(){
  Serial.println("Turn OFF");
    digitalWrite(LED_Pin,HIGH);
}
//打开灯泡
void turnOnLed(){
  Serial.println("Turn ON");
  digitalWrite(LED_Pin_led,LOW);
}
//关闭灯泡
void turnOffLed(){
  Serial.println("Turn OFF");
    digitalWrite(LED_Pin_led,HIGH);
}

// 初始化,相当于main 函数
void setup() {
  Serial.begin(115200);
  pinMode(LED_Pin_led,OUTPUT);
  pinMode(LED_Pin,OUTPUT);
  digitalWrite(LED_Pin_led,HIGH);
  digitalWrite(LED_Pin,HIGH);
}

//循环
void loop() {
  doWiFiTick();
  doTCPClientTick();
}

代码最后部分,我有一些函数,虽然我没有使用但是可以直接拓展外设。
关于界面部分,大家自行在官网查看也比较简单操作,我就不在说了。
3.1 效果图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Esp8266(NodeMcu)接入新大陆物联网平台并且上传温湿度 的相关文章

  • Docker在云平台上的最佳实践:基于容器技术的DevOps探索

    12月9日 在云栖计算之旅线下沙龙上 阿里云容器服务团队的高级研发工程师秦妤嘉分享了 基于容器技术的DevOps探索 首先介绍了DevOps和CD 接着分析了Docker如何打破传统CD壁垒 最后讲解了怎样从零开始搭建一个持续交付系统 视频
  • 华为OD机试真题- 对称字符串【2023Q2】【JAVA、Python、C++】

    题目描述 对称就是最大的美学 现有一道关于对称字符串的美学 已知 第 1 个字符串 R 第 2 个字符串 BR 第 3 个字符串 RBBR 第 4 个字符串 BRRBRBBR 第 5 个字符串 RBBRBRRBBRRBRBBR 相信你已经发
  • 《高效能程序员的修炼》之译者序

    出版社的冀康一开始来找我谈翻译这本书的时候 我的第一反应是 这兄弟真是不知道我现在有多忙 我每天要处理200多封邮件 在资源有限的情况下经常要同时带6 7个项目 而且每个项目的交付计划都很紧 压力很大 每天起码工作12个小时 有时候还要熬夜
  • python连续输入多行_python-遍历Pandas DataFrame并插入行的最快方法

    我正在构建一个工具 以帮助您每周自动执行来自多个实验室设置的数据审查 每天都会生成一个制表符分隔的文本文件 每行代表每2秒获取的数据 因此共有43200行和许多列 每个文件为75mb 我正在使用pandas readcsv加载七个文本文件
  • Python基础知识笔试

    Python基础知识笔试 单选题 2 5分 20题 1 下列哪个表达式在Python中是非法的 B A x y z 1 B x y z 1 C x y y x D x y 2 python my py v1 v2 命令运行脚本 通过 fro

随机推荐

  • JavaScript 基础

    JavaScript 基础 JavaScript 是一门编程语言 可为网站添加交互功能 例如 游戏 动态样式 动画以及在按下按钮或收到表单数据时做出的响应等 本文介绍了 JavaScript 的精彩之处和主要用途 JavaScript 到底
  • Python中的列表和元组

    Python中的列表和元组 1 列表和元组 2 Python 中的列表和元组都支持负数索引 3 列表和元组都支持切片操作 4 列表和元组都可以随意嵌套 5 两者也可以通过 list 和 tuple 函数相互转换 6 列表和元组常用的内置函数
  • easyexcel和poi对比_POI 和 EasyExcel

    POI 和 easyExcel 讲解 转自狂神老师 仅作为个人笔记使用 一 POI 常用进程 1 将用户信息导出为excel表格 导出数据 2 将Excel表中的信息录入到网站数据库 习题上传 开发中经常会设计到excel的处理 如导出Ex
  • 五、深入理解JDK1.7中HashMap哈希冲突解决方案

    导读 前面文章一 深入理解 Java集合初篇 中我们对Java的集合体系进行一个简单的分析介绍 上两篇文章二 Jdk1 7和1 8中HashMap数据结构及源码分析 三 JDK1 7和1 8HashMap数据结构及源码分析 续 中我们分别对
  • Windows+VS2019用vcpkg编译colmap以及用Cmake编译colmap源码

    Windows VS2019用vcpkg编译colmap以及用Cmake编译colmap源码 Window下官方建议用vcpkg安装 这里我已经安装好了VS2019以及cuda11 7 1 安装vcpkg git clone https g
  • cocos mac android,cocos2dx mac android.mk

    LOCAL PATH call my dir include CLEAR VARS call import add path LOCAL PATH cocos2d call import add path LOCAL PATH cocos2
  • 深度学习论文阅读列表

    deep learning paper read lists 同步更新与github https github com chenmeiya deep learning paper read lists Learning invariace
  • Qt Creator 3.5.1(Qt4.8.4库+MinGW4.4)下不能调试问题解决(Debugging has failed)

    Qt Creator 3 5 1 Qt4 8 4库 MinGW4 4 下使用minGW4 4默认的GDB调试会不成功 提示如下 Debugging starts Debugging has failed Debugging has fini
  • 轻量级AI语言模型,直接轻松运行在你家电脑上

    最近在研究AI语言模型和AI绘画模型 无意间发现了这个轻量级模型 只需要拿到这两个文件 AI exe gpt4all lora quantized bin 双击AI exe就能直接使用 方便快捷 简直不要太爽 上面工作准备好之后 win R
  • PCL常用小知识

    转自 SimpleTriangle 时间计算 pcl中计算程序运行时间有很多函数 其中利用控制台的时间计算是 首先必须包含头文件 include
  • makeinfo: command not found解决方法

    sudo apt get install texinfo
  • Codeforces Round #751 (Div. 2) D. Frog Traveler(BFS)

    题解 因为我们最多把所有的点跳一遍么 所以直接BFS模拟一下就行了 注意现在跳的点不能是以前已经跳过的点 并且只能越跳越高 否则没有意义 这样就保证了时间复杂度是线性的 AC代码 include
  • 蓝桥杯跑步锻炼

    问题描述 小蓝每天都锻炼身体 正常情况下 小蓝每天跑 1 千米 如果某天是周一或者月初 1 日 为了 激励自己 小蓝要跑 2 千米 如果同时是周一或月初 小蓝也是跑 2 千米 小蓝跑步已经坚持了很长时间 从 2000 年 1 月 1 日周六
  • 【Java】使用Mybatis调用SQL Server存储过程

    前言 在软件开发过程中 经常会使用到存储过程 本篇文章用于讲解示例如何使用SpringBoot Mybatis的方式调用SQL Server数据库的存储过程并且得到存储过程的回参 一 存储过程的入参 这是存储过程的入参 用于后续Mybati
  • csgo fps不稳定和服务器,win10玩csgofps不稳定怎么办

    在使用win10系统的时候 很多用户们去玩csgo这款游戏 但是有些用户们却发现在玩耍游戏的时候 游戏帧数非常的不稳定 时高时低 其实导致游戏帧数不稳定的因素有很多 看看解决的方法吧 win10玩csgofps不稳定怎么办 1 关闭游戏的多
  • 基于YOLOv8模型的烟火目标检测系统(PyTorch+Pyside6+YOLOv8模型)

    摘要 基于YOLOv8模型的烟火目标检测系统可用于日常生活中检测与定位烟火目标 利用深度学习算法可实现图片 视频 摄像头等方式的目标检测 另外本系统还支持图片 视频等格式的结果可视化与结果导出 本系统采用YOLOv8目标检测算法训练数据集
  • JVM工具之jstat

    JVM工具之jstat查询GC统计信息分析 JVM工具之jstat查询GC统计信息分析jstat基本使用语法jstat class 加载类统计jstat compiler 编译统计jstat gc 垃圾回收统计jstat gccapacit
  • AVFoundation 框架小结

    AVFoundation 小结 概述 AVFoundation 是 Objective C 中创建及编辑视听媒体文件的几个框架之一 其提供了检查 创建 编辑或重新编码媒体文件的接口 也使得从设备获取的视频实时数据可操纵 但是 通常情况 简单
  • 在js中修改html、body的样式

    一 原始定义 先在css中定义 body html 宽高为300px body html width 300px height 300px 二 js操作 以修改宽度为例 获取body html节点style 主要是这里html 一开始不清楚
  • Esp8266(NodeMcu)接入新大陆物联网平台并且上传温湿度

    Esp8266 NodeMcu 接入新大陆物联网 1 平台注册和产品创建 2 代码协议部分 2 1 连接请求协议 2 2 数据上报部分协议 3 完整代码部分 3 1 效果图 使用Esp8266接入新大陆物联网平台 这几天找了一下物联网平台