lib_Transmission_Serial_example
Dependencies: lib_Transmission
main.cpp
- Committer:
- YSI
- Date:
- 2020-12-10
- Revision:
- 0:5d2c38c99ce6
- Child:
- 3:63567efc8429
File content as of revision 0:5d2c38c99ce6:
#include "main.h" int main(void) { setup(); while(1) Led = transmission.recv(); } void setup(void) { Led = Transmission::RED_DISCONNECTED; uc.mac = transmission.set(true);//, "192.168.1.25", 80); for(string name : { "22:42:9d:a3:be:be ELINS-UC-A K64F YANNIC.SIMON@UNIVERSITE-PARIS-SACLAY.FR", "00:02:f7:f3:01:b8 ELINS-UC-B LPC1768 YANNIC.SIMON@UNIVERSITE-PARIS-SACLAY.FR", "00:80:e1:44:00:3a ELINS-UC-C.visiteur H743ZI2 YANNIC.SIMON@UNIVERSITE-PARIS-SACLAY.FR"}) { stringstream streamnames(name); for(int line = 0; getline(streamnames, name, ' '); line += ((name == uc.mac) || (line > 0))?1:0) { switch(line) { case 1: uc.name = name; break; case 2: uc.spec = name; break; case 3: case 4: case 5: case 6: uc.mail[line-3] = name; break; default: break; } } } if(uc.name.empty()) uc.name = uc.mac; else if(uc.name.find(".") != string::npos) { uc.vlan = uc.name.substr(uc.name.find(".")); uc.name = uc.name.substr(0, uc.name.find(".")); } } void init(void) { set_time(transmission.ntp()); notify("CONNECTION"); } string csv_time(const bool& second) { time_t TimeStamp = time(NULL); if(TimeStamp < 1600000000) set_time(TimeStamp = transmission.ntp("ntp.u-psud.fr")); struct tm * tmTimeStamp = localtime(&TimeStamp); char timeLogs[22] = {0}; strftime(timeLogs, 21, second?"%F;%T;":"%F;%R;", tmTimeStamp); return timeLogs; } string html(enumHTML CONTENT) { map<string, string> BgColor {{"OK", "lime"}, {"WARNING", "orange"}, {"ERROR", "red"}, {"MISSING", "white"}, {"LOST", "black"}}; stringstream buffer; buffer.precision(3); switch(CONTENT) { case HEAD: buffer << "Content-Type: text/html; charset=utf-8\r\nAccess-Control-Allow-Origin: *\r\n\r\n"; break; case OPEN: buffer << "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>" << MBED_PROJECT << " : " << uc.name << "</title>\r\n\t</head>\r\n\t<body style=background-color:dimgray>\r\n\t\t<center>"; break; case CLOSE: buffer << "\r\n\t\t</center>\r\n\t</body>\r\n</html>"; break; case BODY: buffer << "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>" << MBED_PROJECT << " : " << uc.name << "</title>\r\n\t\t<meta http-equiv=refresh content=1>\r\n\t</head>"; buffer << "\r\n\t<body style=background-color:dimgray>\r\n\t\t<center>\r\n\t\t\t<h1>" << MBED_PROJECT << " : " << uc.name << "</h1>"; buffer << "\r\n\t\t\t<h3>" << csv_time() << "</h3>\r\n\t\t\t<a href=request><button type=button>Request</button></a>\r\n\t\t</center>\r\n\t</body>\r\n</html>"; break; case SMTP: buffer << "MIME-Version: 1.0\r\nMessage-Id: <Mbed." << uc.name << "." << time(NULL) << "@UNIVERSITE-PARIS-SACLAY.FR>\r\nContent-Type: multipart/mixed; boundary=\"boundaryUPT0\"\r\n"; buffer << "\r\n--boundaryUPT0\r\nContent-Type: multipart/alternative; boundary=boundaryUPT1\r\n\r\n"; buffer << "\r\n--boundaryUPT1\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n"; buffer << MBED_PROJECT << " : " << uc.name; buffer << "\r\n\r\nReal-time monitoring display (from the local network) : http://" << uc.name << uc.vlan << ".lps.u-psud.fr/"; buffer << "\r\n--boundaryUPT1\r\nContent-Type: text/html; charset=utf-8\r\n\r\n"; buffer << "<html>\r\n\t<body>\r\n\t\t<center>\r\n\t\t\t<h1>" << MBED_PROJECT << " : " << uc.name << "</h1>\r\n\t\t\t<table style=color:white;border-collapse:collapse>"; buffer << "\r\n\t\t\t</table>\r\n\t\t</center>\r\n\t\t<footer><p>Real-time monitoring display (from the local network) : http://" << uc.name << uc.vlan << ".lps.u-psud.fr/</p></footer>\r\n\t</body>\r\n</html>"; buffer << "\r\n--boundaryUPT1\r\n\r\n--boundaryUPT0\r\nContent-Type: text/csv\r\nContent-disposition: attachment; filename="; buffer << "time.csv;\r\n\r\n" << csv_time() << "\r\n--boundaryUPT0\r\n"; break; } return buffer.str(); } string notify(const string& EVENT, const string& STATUS) { string ACK, PROJECT(MBED_PROJECT), HTML(html(SMTP)), SUBJECT("[Alert]" + PROJECT + " " + uc.spec + " : " + EVENT + (STATUS.empty()?"":" - ") + STATUS); for(const string &MAIL : uc.mail) if(!MAIL.empty()) if(!transmission.smtp(MAIL.c_str(), uc.name.c_str(), SUBJECT.c_str(), HTML.c_str())) ACK += " ERROR[ " + MAIL + " ]"; return ACK.empty()?"OK":ACK; } string str_precision(float value) { ostringstream buffer; buffer.precision(3); buffer << value; return buffer.str(); } void processing(string cmd, Transmission::enum_trans_to to) { for (unsigned int i = 0; i < cmd.size(); i++) if ((cmd[i] >= 'a') && (cmd[i] <= 'z')) cmd[i] += 'A' - 'a'; stringstream srecv(cmd), ssend; ssend.precision(3); while(getline(srecv, cmd, ';')) { if(ssend.str().size() > 0) ssend << ' '; if(cmd.empty()); else if(cmd == "*IDN?") { ssend << MBED_PROJECT << ", Mbed OS " << MBED_VERSION << ", Version dated, " << __DATE__ << ", " << __TIME__; } else if(cmd.find("GET /*IDN? HTTP") != string::npos) { ssend << HTTP_RETURN_OK << html(HEAD) << MBED_PROJECT << ", Mbed OS " << MBED_VERSION << ", Version dated, " << __DATE__ << ", " << __TIME__; } else if(cmd.find("GET /REQUEST HTTP") != string::npos) { ssend << HTTP_RETURN_OK << html(HEAD) << html(OPEN) << "\r\n\t\t\t<p>EMAIL REQUEST " << notify("REQUESTE") << "</p>\r\n\t\t\t<a href=/><button type=button>Return</button></a>" << html(CLOSE); } else if(cmd.find("GET / HTTP") != string::npos) { ssend << HTTP_RETURN_OK << html(HEAD) << html(BODY); } else if(cmd.find("GET /FAVICON.ICO HTTP") != string::npos) { ssend << HTTP_RETURN_OK << "Content-type: image/x-icon\r\n\r\n"; for(char c : HTTP_FAVICON) ssend << c; } else if(cmd.find("GET /") != string::npos) { ssend << HTTP_RETURN_NO_CONTENT << html(HEAD); } else if(cmd.find("HEAD /") != string::npos) { ssend << HTTP_RETURN_OK << html(HEAD); } else if(cmd.find("HOST: ") != string::npos) { if(to == Transmission::TCP) to = Transmission::HTTP; } else if(cmd == "MAC?") { ssend << "MAC[" << uc.mac << "], NAME[" << uc.name << "]"; } else if(cmd == "IP?") { ssend << "IP[" << transmission.get() << "]"; } else if(cmd == "ETH?") { ssend << "ETH:" << ((eth.get_connection_status() == NSAPI_STATUS_GLOBAL_UP)?"UP":"DOWN"); } else if(cmd.find("ETH:IP ") != string::npos) { string param(cmd.substr(cmd.find(' ')+1)); string IP(param.substr(0, param.find(':'))); stringstream istr(param.substr(param.find(':')+1)); uint16_t PORT; istr >> PORT; transmission.set(true, IP.c_str(), PORT); } else if(cmd == "ETH:DHCP") { transmission.set(true); } else if(cmd == "ETH:OFF") { transmission.set(false); } else if(cmd == "EMAIL?") { ssend << "EMAIL REQUEST " << notify("REQUESTE"); } else if(cmd.find('?') != string::npos) ssend << "incorrect requeste [" << cmd << "]"; } transmission.send(ssend.str(), to); }