(一),通过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(); //数据接收
}