一,ESP8266-01s端代码(只有心跳发送权):
#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; //外网服务器端口
//2319073311
//***
const char *user_logo = "Huang1029"; //设备标识
const char *user_key = "***"; //传输秘钥
WiFiClient client; //声明对象
void Go_WIFI()
{
while(WiFi.status()!=WL_CONNECTED) //连接成功前,LED将快速闪烁
{
bool led_flag = digitalRead(LEDPin1);
digitalWrite(LEDPin1,!led_flag);
delay(100);
}
Serial.print(WiFi.SSID());
Serial.println(" WIFI OK");
}
void Go_Server()
{
Serial.println("Start connecting to a server");
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("Server OK");
}
void RST_Go_WIFI() //断开重连WIFI
{
if(WiFi.status()!=WL_CONNECTED)
{
WiFi.disconnect(); //清除之前的配置,可能因为信号道不同连不上
WiFi.begin(wifi_name,wifi_password); //开始连接路由器
Go_WIFI();
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Initing...");
pinMode(LEDPin1, OUTPUT);
digitalWrite(LEDPin1, 1);
WiFi.mode(WIFI_STA); //设置为STA模式
WiFi.begin(wifi_name,wifi_password); //开始连接路由器
Go_WIFI();
Go_Server();
}
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连接新大陆平台
char users[80];
sprintf(users,"{\"t\":1,\"device\":\"%s\",\"key\":\"%s\",\"ver\":\"v1.1\"}\r\n", user_logo,user_key);
client.print(users);
one = 1;
}
}
unsigned long tx_time=0;
void HeartbeatTx_Data()
{
if(millis() - tx_time < 10000) return;
tx_time = millis();
char txbuff[20];
sprintf(txbuff,"$#AT#");//心跳请求
client.print(txbuff);
}
unsigned long rx_time=0;
void ServerRx_Data()
{
if(millis() - rx_time < 1000) return;
rx_time = millis();
String Jsonbuff="";
while(client.available()>0)//读取服务端发送过来的信息
{
Jsonbuff+=char(client.read());
delay(1);
}
if (Jsonbuff.length() != 0)//如果不是非空字符串,则打印
{
Serial.println(Jsonbuff);//打印云端响应数据,发送到stm32
}
Jsonbuff = "";
}
void loop() {
// put your main code here, to run repeatedly:
Go_NewCloud();
HeartbeatTx_Data();//数据发送权移至stm32,保留心跳发送
ServerRx_Data();//接收服务器信息,并转发到stm32
Stm32Rx_Data();//接收stm32信息,并转发到服务器
}
unsigned long stm32_rx_time=0;
void Stm32Rx_Data()
{
if(millis() - stm32_rx_time < 1000) return;
stm32_rx_time = millis();
String Databuff="";
while(client.available()>0)//读取stm32发送过来的信息
{
Databuff+=char(client.read());
delay(1);
}
if (Databuff.length() != 0)
{
client.print(Databuff);
}
Databuff = "";
}
二,STM32端部分代码(传感器采集数据发送到ESP8266-01s):
//控制数据上云频率,只有当有数据发送到ESP01S时,ESP01S才会发生使其上云
_Bool two_pointer;//切换发送标志位,防止频繁上传
uint32_t esp01s_tx_time=0;
void Esp01s_Tx_Proc()
{
if(uwTick - esp01s_tx_time<10000) return;
esp01s_tx_time = uwTick;
char sendbuff[50];
int length = 0;
if(two_pointer && mylatitude!=0&&mylongitude!=0)//经纬度
{
length = sprintf(sendbuff,"{\"t\": 3,\"datatype\":1,\"datas\": { \"Lat:%f,\"Log\":%f},\"msgid\": 123}",
mylatitude,mylongitude);//无需回车
}
if(!two_pointer && bmp280_temp!=0 && bmp280_ap!=0 && mq135_value!=0)//温度,气压,空气质量
{
length = sprintf(sendbuff,"{\"t\": 3,\"datatype\":1,\"datas\": { \"BmpTemp\":%d,\"BmpPressure\":%d,\"MqAir\":%.1f},\"msgid\": 123}",
(int)bmp280_temp,(int)bmp280_ap,mq135_value);//无需回车
}
HAL_UART_Transmit(&huart3,(uint8_t*)sendbuff,strlen(sendbuff),50);//strlen获取实际长度
}