wenbo2005.online

学习记录 / Arduino 与 ESP

ESP8266 与新大陆

Arduino 与 ESP2025-05-13

(一),通过TCP连接新大陆物联网云平台,实现基本的控制板载LED(万能模板)

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

int LEDPin1 = 2;

//设置需要连接的wifi的名称和密码
const char *wifi_name = "MyESP8266";
const char *wifi_password = "12345678";

const char *host = "121.37.241.174";             //新大陆外网服务器IP
const int httpPort = 8600;                           //新大陆外网服务器端口,详细可见《新大陆设备接入协议》

WiFiClient client;                                        //声明对象

(二),相关接入函数

//=====================================================首次WIFI====================================
void Go_WIFI()
{
  while(WiFi.status()!=WL_CONNECTED)            //连接成功前,LED将快速闪烁
  {
    bool led_flag = digitalRead(LEDPin1);
    digitalWrite(LEDPin1,!led_flag);
    delay(100);
  }
  Serial.println("WIFI连接成功");
}

//=====================================================连接服务器====================================

void Go_Server()
{
  Serial.println("开始连接服务器...");
  while(!client.connected())                       //连接成功前,LED将慢闪烁
  {
    client.connect(host,httpPort);               //该函数需要花费一定的时间
    bool led_flag = digitalRead(LEDPin1);
    digitalWrite(LEDPin1,!led_flag);
    delay(500);
  }
  digitalWrite(LEDPin1,0);                         //连接成功后,LED常亮
  Serial.println("连接服务器成功");
}

//=====================================================重连WIFI====================================
void RST_Go_WIFI()                                        //断开重连WIFI
{
  if(WiFi.status()!=WL_CONNECTED)
  {
    WiFi.disconnect();                                     //清除之前的配置,可能因为信号道不同连不上
    WiFi.begin(wifi_name,wifi_password);          //开始连接路由器
    Go_WIFI();
  }
}

//======================================================首次接入新大陆==================================

bool one = 0;
void Go_NewCloud()
{
  if(WiFi.status()!=WL_CONNECTED)
  {
    WiFi.disconnect();                                    //清除之前的配置,可能因为信号道不同连不上
    WiFi.begin(wifi_name,wifi_password);            //开始连接路由器
    Go_WIFI();
  }
  else if(!client.connected())                              //服务器断开重连
  {
    one = 0;
    Go_Server();
    return;
  }
  else if(one == 0)
  {
      //通过TCP连接新大陆平台,详细可见《新大陆设备接入协议》
      client.print("{\"t\":1,\"device\":\"2319073311\",\"key\":\"***\",\"ver\":\"v1.1\"}\r\n");
      one = 1;
  }
}

(三),初始化

void setup() {
  Serial.begin(115200);
  Serial.println("初始化中...");

  pinMode(LEDPin1, OUTPUT);
  digitalWrite(LEDPin1, 1);

  WiFi.mode(WIFI_STA);                                 //设置为STA模式(客户端)
  WiFi.begin(wifi_name,wifi_password);          //开始连接路由器

  Go_WIFI();
  Go_Server();
}

(四),数据处理函数

String Read_Data()                                    //读取服务端发送过来的信息
{
  String data = "";
  while(client.available()>0)
  {
    data+=char(client.read());
    delay(1);
  }
  return data;
}

unsigned long tx_time=0;
void Tx_Data()                                    //数据发送函数,每5秒上传一次
{
  if(millis() - tx_time < 5000) return;
  tx_time = millis();

  char txbuff[50];
  int temp1;
  int temp2;
  temp1 = random(0,50);                 //伪数据温湿度
  temp2 = random(50,100);
  sprintf(txbuff,"{\"t\": 3,\"datatype\":1,\"datas\": { \"Temp\":%d,\"Humi\":%d},\"msgid\": 123}",temp1,temp2);
  client.print(txbuff);
}

unsigned long rx_time=0;
void Rx_Data()                                    //数据接收函数,接收服务器下发的指令
{
  if(millis() - rx_time < 1000) return;
  rx_time = millis();

    String rxbuff;
    rxbuff = Read_Data();
    if (rxbuff.length() != 0)                                         //如果不是非空字符串,则打印
    {
      Serial.println(rxbuff);
    }

    //对于 String 类型,使用 indexOf() 方法来检查子字符串的存在。如果返回值不是 -1,则表示找到了匹配的子字符串

    if (rxbuff.indexOf("LED") != -1 && rxbuff.indexOf("\"data\":1") != -1)                     // 检查字符串中是否包含特定内容
    {
      digitalWrite(LEDPin1, LOW); // 关闭 LED
    }
    else if (rxbuff.indexOf("LED") != -1 && rxbuff.indexOf("\"data\":0") != -1)
    {
      digitalWrite(LEDPin1, HIGH); // 打开 LED
    }
    rxbuff = "";                //清空String
}

(五),基本循环

void loop() {
  Go_NewCloud();            //防止断开
  Tx_Data();                //定时数据上传
  Rx_Data();                //数据接收
}