first commit

This commit is contained in:
2024-04-01 10:31:33 +08:00
commit 9ba62457a9
237 changed files with 40424 additions and 0 deletions

759
src/main.cpp Normal file
View File

@ -0,0 +1,759 @@
#include"Define.h"
#include <GSMMannager.h>
#include <HTTPClient.h>
#include <ArduinoHttpClient.h>
#include<driver/periph_ctrl.h>
#include "SensorOptoSky.h"
#include <SoftwareSerial.h>
#include <Ticker.h>
#include <updatebyme.h>
//#include "MyWebServer.h"
#include "SDmanger.h"
//#include "HttpsOTAUpdate.h"
#include "slave.h"
#include "log.h"
#include <wifidebug.h>
#define LOGGING
//myPort将原来ESP8266对内通讯改为485对内的通讯
// #define MYPORT_TX 45
// #define MYPORT_RX 46
int hassend = 0;
GSMMannger *gsmmanger;
UpDateClassByme *ProgrameUper;
HttpClient *http;
bool ishttpbusy = false;
SensorOptoSky IS1Sensor;
// SoftwareSerial myPort(MYPORT_RX, MYPORT_TX, false);
// HardwareSerial myPort(1);
// swSer(14, 12, false, 256);
// u_char a[]={0x01,0x04,0x00,0x00,0x00,0x06,0x70,0x08};
u_char ret[17];
u_char windret[17];
Ticker ticker;
slave myslave;
String getnetData()
{
int err = http->get("/weather/php/Date.php");
if (err != 0)
{
SerialMon.println(F("Date failed to connect"));
delay(10000);
return "";
}
int status = http->responseStatusCode();
if (!status)
{
delay(10000);
return "";
}
// SerialMon.println(F("Response Headers:"));
while (http->headerAvailable())
{
String headerName = http->readHeaderName();
String headerValue = http->readHeaderValue();
// SerialMon.println("Date: " + headerName + " : " + headerValue);
}
if (http->isResponseChunked())
{
// SerialMon.println(F("Date The response is chunked"));
}
String body = http->responseBody();
http->stop();
return body;
}
bool UpdateData(String path, char *str, size_t lenth, String Contenttype = "")
{
http->beginRequest();
http->post(path);
if (Contenttype != "")
{
http->sendHeader(HTTP_HEADER_CONTENT_TYPE, Contenttype);
/* code */
}
http->sendHeader(HTTP_HEADER_CONTENT_LENGTH, lenth);
http->endRequest();
int err = http->write((const byte *)str, lenth);
delay(1000);
Serial.print("send date size");
Serial.println(err);
/*
for (size_t i = 0; i < lenth; i++)
{
Serial.print("0x");
Serial.print(str[i],HEX);
Serial.print(" ");
if (i%20==0)
{
Serial.println(" ");
}
}
*/
// http->write((const byte*)IS1Sensor.UpData, IS1Sensor.SensorInfo.BandNum*2);
// http->stop();
Serial.println("hear1");
if (err == 0)
{
http->stop();
return false;
}
int status = http->responseStatusCode();
Serial.println("hear3");
if (!status)
{
http->stop();
return false;
}
int length = http->contentLength();
Serial.println("hear4");
if (length == 0)
{
http->stop();
return false;
}
String body = http->responseBody();
Serial.println("body:"+body);
if (body != "ok")
{
http->stop();
return false;
}
http->stop();
return true;
}
void ReuploadData(String path, String webpath, String content = "")
{
vTaskDelay(1);
Vector<String> files;
String vec[20]; //每次处理20个
files.setStorage(vec);
while (!sdcard::ListDir(path.c_str(), files))
{
if (files.size() != 0)
{
Serial.println("find " + String(files.size()) + "file");
for (size_t i = 0; i < files.size(); i++)
{
File nowfile = SD_MMC.open(files.at(i).c_str(), "rb");
size_t size = nowfile.size();
char *arr = new char[size];
nowfile.readBytes(arr, size);
bool flagsucc = UpdateData(webpath, arr, size, content);
if (!flagsucc)
{
return;
/* code */
}
delete[] arr;
sdcard::deleteFolderOrFile(files.at(i).c_str());
vTaskDelay(1);
/* code */
}
}
vTaskDelay(1);
}
if (files.size() != 0)
{
Serial.println("find " + String(files.size()) + "file not enough 20");
for (size_t i = 0; i < files.size(); i++)
{
vTaskDelay(1);
File nowfile = SD_MMC.open(files.at(i).c_str(), "rb");
size_t size = nowfile.size();
char *arr = new char[size];
nowfile.readBytes(arr, size);
Serial.println("run here now");
bool flagsucc = UpdateData(webpath, arr, size, content);
if (!flagsucc)
{
return;
/* code */
}
delete[] arr;
sdcard::deleteFolderOrFile(files.at(i).c_str());
/* code */
}
}
vTaskDelay(1);
}
String fenge(String str, String fen, int index)
{
int weizhi;
String temps[str.length()];
int i = 0;
do
{
weizhi = str.indexOf(fen);
if (weizhi != -1)
{
temps[i] = str.substring(0, weizhi);
str = str.substring(weizhi + fen.length(), str.length());
i++;
}
else
{
if (str.length() > 0)
temps[i] = str;
}
} while (weizhi >= 0);
if (index > i)
return "-1";
return temps[index];
}
void Reuploaddata(void *) //重新上传数据
{
ReuploadData("/down", "/weather/php/SpectralDataUp.php");
ReuploadData("/up", "/weather/php/SpectralDataUp.php");
ReuploadData("/other", "/weather/php/WindsensorUp.php", "application/json");
}
void Reuploaddata() //重新上传数据
{
ReuploadData("/down", "/weather/php/SpectralDataUp.php");
ReuploadData("/up", "/weather/php/SpectralDataUp.php");
ReuploadData("/other", "/weather/php/WindsensorUp.php", "application/json");
}
String Datenow="";
void printbytcp(String str)
{
//tcpserver.SendDataToClinet(str);
Serial.println(str);
str=Datenow+"#######"+str;
int lennn=str.length();
char *temp = new char[lennn];
memcpy(temp, str.c_str(), str.length());
bool flagsucc = UpdateData("/weather/php/log.php", temp, lennn);
vTaskDelay(3000);
delete[] temp;
}
void esp8266_readmeichaung()
{
//读取美创模块
// while (myPort.read() != -1)
// ;
// delay(1000); //等待1s 防止下位机反应不过来
// myPort.println("MLX#");
// delay(10);
// for (int j = 0; j < 8; ++j)
// {
// ret[j] = myPort.read();
// }
// double temprature;
// memcpy(&temprature, ret, 8);
// Serial.println("wendu");
// Serial.println(temprature);
// Serial.println("hello word");
///////////////now///////////////////////////
double temprature = myslave.getMLX();
Serial.println("wendu");
Serial.println(temprature);
Serial.println("hello word");
/////////////////////////////初始化windsensor并测评1<E8AF84>71ᅣ1<EFBF84>77/////////////////////////////////////////////////////////////
// while (myPort.read() != -1)
// ;
// sleep(1);
// myPort.println("WindSensor#");
// delay(210);
// for (int j = 0; j < 17; ++j)
// {
// windret[j] = myPort.read();
// }
// float VV = (windret[3] * 256 + windret[4]) * 1.0 / 100;
// float DD = (windret[5] * 256 + windret[6]) * 1.0 / 10;
// float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100;
// float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100;
// long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]);
// Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
////////////////////////////////now////////////////////////////
myslave.getWehter();
memcpy(windret,myslave.ret,17);
float VV = (windret[3] * 256 + windret[4]) * 1.0 / 100;
float DD = (windret[5] * 256 + windret[6]) * 1.0 / 10;
float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100;
float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100;
long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]);
Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
}
String get_GPS(void)
{
Serial.println("check GPS...");
gsmmanger->modem->sendAT(GF("+CGNSPWR?"));
gsmmanger->modem->waitResponse("OK");
Serial.println("Open GPS...");
gsmmanger->modem->sendAT(GF("+CGNSPWR=1"));
gsmmanger->modem->waitResponse("OK");
gsmmanger->modem->sendAT(GF("+CGNSAID=31,1,1,1"));
gsmmanger->modem->waitResponse("OK");
Serial.println("get GNSS...");
gsmmanger->modem->sendAT(GF("+CGNSINF"));
String gps;
gsmmanger->modem->waitResponse(5000,gps);
// Serial.println(gps);
return gps;
}
String log_path;
String log_data;
void setup()
{
Serial2.begin(115200);
Serial.begin(115200);
sdcard::init_sdcard();
sdcard::testwriet();
sdcard::Mkdir("/up");
sdcard::Mkdir("/down");
sdcard::Mkdir("/other");
sdcard::Mkdir("/gps");
sdcard::Mkdir("/log");
beginWIFI();
// sdcard::mylistDir("/",2);
{
}
// pinMode(21, OUTPUT);
// digitalWrite(21, HIGH);
////////////////////////////////////////////////////////////
// return;
//重启esp8266现在不用
// pinMode(5, OUTPUT);
// digitalWrite(5, LOW);
// delay(500);
// digitalWrite(5, HIGH);
// pinMode(22,OUTPUT);
// digitalWrite(22,HIGH);
// pinMode(23,OUTPUT);
// digitalWrite(23,HIGH);
//将原来通过esp8266读取美创写成函数esp8266_readmeichaung(),方便调试。
// myPort.begin(38400, SWSERIAL_8N1, MYPORT_RX, MYPORT_TX, false);
myslave.init(46,45);
sleep(3);
// esp8266_readmeichaung();
//原来的SIM800改为现在的AIR780E4G模块使用的是串口2。
gsmmanger = new GSMMannger(2, 19, 20);
http = new HttpClient(*gsmmanger->client, "82.156.1.111");
String Date = getnetData();
Serial.println("date is :"+Date);
String tem = fenge(Date," ",0);
log_path = "/log/"+tem+".txt";
log_data = Date+"\r\nSystem starts working.";
write_log(log_path,10,"");
write_log(log_path,10,log_data);
write_log(log_path,10,"AIR780E Init Success.");
vTaskDelay(1000);
gsmmanger->modem->sendAT(GF("+CGPIO=1,11,1")); //点灯
gsmmanger->modem->waitResponse("OK");
String gpsbac = get_GPS();
Serial.println(gpsbac);
write_log(log_path,10,"GPS Init Success.");
vTaskDelay(1000);
//////////////////////////////初始化http模块//////////////////////////////////////////////
// http = new HttpClient(*gsmmanger->client, "82.156.1.111");
ProgrameUper = new UpDateClassByme(http);
IS1Sensor.initSensor();
String StationID = IS1Sensor.SensorInfo.serialnumber;
String SensorID = IS1Sensor.SensorInfo.SensorName;
ProgrameUper->initme(Curentvsion);
ProgrameUper->StationID=StationID;
ProgrameUper->CheckAndUpdate();
write_log(log_path,10,"Http Init Success.");
// ProgrameUper->DownloadFirmwareForurl("");
////////////////////////////上传IS1设备信息//////////////////////////////////////////////
//////////////////////////////初始化IS1///////////////////////////////////////////////////
// String Date=getnetData();
String Upheader = StationID + "##" + SensorID + "##" + String(IS1Sensor.SensorInfo.BandNum) + "##"
+ String(IS1Sensor.SensorInfo.a1,9) + ":" + String(IS1Sensor.SensorInfo.a2,9) + ":" + String(IS1Sensor.SensorInfo.a3,9) + ":" + String(IS1Sensor.SensorInfo.a4,9)+"##"+ProgrameUper->CurrentVersion;
http->beginRequest();
http->post("/weather/php/SensorInfoUp.php");
http->sendHeader(HTTP_HEADER_CONTENT_LENGTH, Upheader.length());
http->endRequest();
http->write((const byte *)Upheader.c_str(), Upheader.length());
http->stop();
ticker.attach(60 * 60, Reuploaddata);
write_log(log_path,10,"IS1 Init Success.");
///////////////////////////////////////////////////////////////////////////////////////
log_data = "System Init Success";
write_log(log_path,10,log_data);
// Serial.println(gsmmanger->GetDataAndTime());
}
String lastdate="";
void loop()
{
String Date = getnetData();
String tem = fenge(Date," ",0);
log_path = "/log/"+tem+".txt";
// //擦除myport缓存
// while (myPort.read() != -1)
// ;
// myPort.println("YULIANG#");
// delay(510); //等待500ms
// String yuliang=myPort.readStringUntil('#');
// delay(1010);
// Serial.println("yuliang "+yuliang);
/////////////////NOW/////////////////////
write_log(log_path,10,"");
write_log(log_path,10,Date);
String yuliang = String(myslave.getYuliang());
delay(1010);
Serial.println("yuliang "+yuliang);
write_log(log_path,10,"getYuliang :"+yuliang);
// //擦除myport缓存
// while (myPort.read() != -1)
// ;
// myPort.println("YLFZ#");
// delay(510); //等待500ms
// String yuliangfz=myPort.readStringUntil('#');
// delay(1010);
// Serial.println("fuzhao "+yuliangfz);
/////////////////NOW/////////////////////
String yuliangfz = String(myslave.getYuliang());
delay(1010);
Serial.println("fuzhao " + yuliangfz);
log_data ="fuzhao :"+yuliangfz;
write_log(log_path,10,log_data);
// while (myPort.read() != -1)
// ;
// myPort.println("WindSensor#"); //发送指令给无参数
// delay(510); //等待500ms
// for (int j = 0; j < 17; ++j)
// {
// windret[j] = myPort.read(); //读取返回倄1<E58084>71ᅣ1<EFBF84>77
// // Serial.println(ret[j],HEX);
// }
// float VV = (windret[3] * 256 + windret[4]) * 1.0 / 100;
// float DD = (windret[5] * 256 + windret[6]) * 1.0 / 10;
// float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100;
// float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100;
// long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]);
// Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
// //////////////////////////////////////////////////////////////////////////////////////
////////////////////////////NOW///////////////////////////
myslave.getWehter();
memcpy(windret,myslave.ret,17);
float VV = (windret[3] * 256 + windret[4]) * 1.0 / 100;
float DD = (windret[5] * 256 + windret[6]) * 1.0 / 10;
float TT = (windret[7] * 256 + windret[8]) * 1.0 / 100;
float HH = (windret[9] * 256 + windret[10]) * 1.0 / 100;
long PP = (windret[13] * 256 + windret[14]) * 256 * 256 + (windret[11] * 256 + windret[12]);
Serial.println("VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
write_log(log_path,10,"VV:" + String(VV) + "DD:" + String(DD) + "TT:" + String(TT) + "HH:" + String(HH) + "PP:" + String(PP));
// //读取美创模块
// delay(1010);
// while (myPort.read() != -1)
// ;
// delay(1000); //等待1s 防止下位机反应不过来
// myPort.println("MLX#");
// delay(10);
// for (int j = 0; j < 8; ++j)
// {
// ret[j] = myPort.read();
// }
// double temprature;
// memcpy(&temprature, ret, 8);
// Serial.println("wendu");
// Serial.println(temprature);
// delay(1000);
////////////////////////////NOW///////////////////////////
String temprature =String(myslave.getMLX());
Serial.println("wendu");
Serial.println(temprature);
log_data ="wendu :"+temprature;
write_log(log_path,10,log_data);
////sim 循环
write_log(log_path,10,"start gsmmanger->loop()");
gsmmanger->loop();
#ifdef DINBIAO
String Datenow1=getnetData();
Datenow =fenge(Datenow1, " ", 0) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 0) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 1) + "_" + fenge(fenge(Datenow1, " ", 1), ":", 2);
IS1Sensor.PrintFunc=printbytcp;
#endif
write_log(log_path,10,"start TakeOneJob()");
IS1Sensor.TakeOneJob(); ////IS1采集一次
String StationID = IS1Sensor.SensorInfo.serialnumber;
String SensorID = IS1Sensor.SensorInfo.SensorName;
///////////////获取时间
// while (myPort.read() != -1)
// ;
// myPort.println("GETGPS#");
// String gpsbac = myPort.readStringUntil('\n');
// Serial.println(gpsbac);
// String statnumberstr = fenge(gpsbac, "#", 1);
// String statnumber = fenge(statnumberstr, "_", 1);
// Serial.println(statnumber);
// String Date;
// if (statnumber.toInt() < 3)
// {
// Date = getnetData();
// }
write_log(log_path,10,"start get_GPS()");
String gpsbac = get_GPS();
Serial.println(gpsbac);
// if (index < 28)
// {
write_log(log_path,10,"start getnetData()");
Date = getnetData();
// }
// String Date;
// Date = getnetData();
// str.substring(0, weizhi);
// else
// {
// String datastr = fenge(gpsbac, "#", 0);
// Date = fenge(datastr, "_", 1);
// if (hassend == 0)
// {
// gpsbac = StationID+"#"+gpsbac;
// int lennn = gpsbac.length();
// char *temp = new char[lennn];
// memcpy(temp, gpsbac.c_str(), gpsbac.length());
// String nameoffile = "/gps/" + fenge(Date, " ", 0) + "_" + fenge(fenge(Date, " ", 1), ":", 0) + "_" + fenge(fenge(Date, " ", 1), ":", 1) + "_" + fenge(fenge(Date, " ", 1), ":", 2) + ".gps";
// bool flagsucc = UpdateData("/weather/php/StationGPSinfo.php", temp, lennn);
// if (!flagsucc)
// {
// // sdcard::WriteStringToFile(nameoffile, temp, lennn);
// }
// else{
// Serial.println("Finish Put StationGPSinfo Data");
// }
// delete[] temp;
// }
// if (hassend >= 0)
// {
// hassend--;
// }
// }
// delay(15000);
// if (fenge(Date, " ", 0)!=lastdate)
// {
// lastdate=fenge(Date, " ", 0);
// while (myPort.read() != -1)
// ;
// myPort.println("ClearYL#");
// ProgrameUper->CheckAndUpdate();
// /* code */
// }
// String Date;
// double temprature;
// String yuliang;
// String yuliangfz;
/////////*获取相关信息*//////////////////////////
String datestring=fenge(Date, " ", 0) + "_" + fenge(fenge(Date, " ", 1), ":", 0) + "_" + fenge(fenge(Date, " ", 1), ":", 1) + "_" + fenge(fenge(Date, " ", 1), ":", 2);
String Upheader = Date + "##" + StationID + "##" + SensorID + "##" + "UP" + "##"+String(IS1Sensor.shutterup)+"##";
String Upname = "/up/" +datestring+ "_" + StationID + "_" + SensorID + "_" + "UP";
String Downheader = Date + "##" + StationID + "##" + SensorID + "##" + "DOWN" + "##"+String(IS1Sensor.shutterdown)+"##";
String Downname = "/down/" + datestring + "_" + StationID + "_" + SensorID + "_" + "DOWN";
String senderID = Date + "##" + StationID + "##" + SensorID + "##" + String(temprature) + "##"+yuliang+"##"+yuliangfz+"##";
String othername = "/other/" +datestring + "_" + StationID + "_" + SensorID + "_" + String(temprature);
// Serial.println(senderID);
// Serial.println( Upheader);
// Serial.println(Upheader.length());
//////////////////////上传up数据//////////////////
write_log(log_path,10,"put up data");
size_t lennn = IS1Sensor.SensorInfo.BandNum * 2 + Upheader.length();
char *temp = new char[IS1Sensor.SensorInfo.BandNum * 2 + Upheader.length()];
memcpy(temp, Upheader.c_str(), Upheader.length());
char *str=(char *)IS1Sensor.UpData;
int lenofis=IS1Sensor.SensorInfo.BandNum * 2 ;
for (size_t i = 0; i < IS1Sensor.SensorInfo.BandNum * 2; i++)
{
//temp[Upheader.length()+i]=str[i];
}
memcpy(temp + Upheader.length(), IS1Sensor.UpData,IS1Sensor.SensorInfo.BandNum * 2);
bool flagsucc = UpdateData("/weather/php/SpectralDataUp.php", temp, lennn);
vTaskDelay(3000);
if (!flagsucc)
{
sdcard::WriteStringToFile(Upname, temp, lennn);
log_data ="Up_data upload failed,save to SD.";
write_log(log_path,10,log_data);
}
else
{
Serial.println("finish Put Up Data");
log_data ="finish Put Up Data.";
write_log(log_path,10,log_data);
}
delete[] temp;
//////////////////////上传Down数据//////////////////
write_log(log_path,10,"put dowm data");
lennn = IS1Sensor.SensorInfo.BandNum * 2 + Downheader.length();
temp = new char[lennn];
memcpy(temp, Downheader.c_str(), Downheader.length());
str=(char *)IS1Sensor.DownData;
lenofis=IS1Sensor.SensorInfo.BandNum * 2 ;
for (size_t i = 0; i < IS1Sensor.SensorInfo.BandNum * 2; i++)
{
// temp[Downheader.length()+i]=str[i];
}
memcpy(temp + Downheader.length(), IS1Sensor.DownData,IS1Sensor.SensorInfo.BandNum * 2);
flagsucc = UpdateData("/weather/php/SpectralDataUp.php", temp, lennn);
vTaskDelay(3000);
if (!flagsucc)
{
sdcard::WriteStringToFile(Downname, temp, lennn);
log_data ="Down_data upload failed,save to SD.";
write_log(log_path,10,log_data);
}else{
Serial.println("finish Put Down Data");
log_data ="finish Put Down Data.";
write_log(log_path,10,log_data);
}
delete[] temp;
//////////////////////上传其他数据//////////////////
lennn = 12 + senderID.length();
temp = new char[lennn];
memcpy(temp, senderID.c_str(), senderID.length());
memcpy(temp + senderID.length(), windret + 3, 12);
flagsucc = UpdateData("/weather/php/WindsensorUp.php", temp, lennn, "application/json");
vTaskDelay(3000);
if (!flagsucc)
{
sdcard::WriteStringToFile(othername, temp, lennn);
log_data ="put Other Data failed,save to SD.";
write_log(log_path,10,log_data);
}else{
Serial.println("finish Put Other Data");
log_data ="finish Put Other Data.";
write_log(log_path,10,log_data);
}
delete[] temp;
//结束并等待一定时间
// http->stop(); delay(100);return;
delay(120000);
#ifdef DINBIAO
abort();
ESP.restart();
#endif
return;
// //////以下位测试代砄1<E7A084>71ᅣ1<EFBF84>77
// delay(3000);
// // int err = http->get("/weather/php/WindsensorUp.php");
// // if (err == 0)
// {
// SerialMon.println(F("failed to connect"));
// delay(10000);
// return;
// }
// int status = http->responseStatusCode();
// SerialMon.print(F("Response status code: "));
// SerialMon.println(status);
// if (!status)
// {
// delay(10000);
// return;
// }
// SerialMon.println(F("Response Headers:"));
// while (http->headerAvailable())
// {
// String headerName = http->readHeaderName();
// String headerValue = http->readHeaderValue();
// SerialMon.println(" " + headerName + " : " + headerValue);
// }
// int length = http->contentLength();
// if (length >= 0)
// {
// SerialMon.print(F("Content length is: "));
// SerialMon.println(length);
// }
// if (http->isResponseChunked())
// {
// SerialMon.println(F("The response is chunked"));
// }
// String body = http->responseBody();
// SerialMon.println(F("Response:"));
// SerialMon.println(body);
// SerialMon.print(F("Body length is: "));
// SerialMon.println(body.length());
// delay(5000);
// // Shutdown
// // http->stop();
}