Esp8266[NodeMcu]接入新大陸物聯網
使用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 效果圖:
最後,希望小夥伴,隨手給個贊唄。