diff --git a/PFFIAPUploadAgent.cpp b/PFFIAPUploadAgent.cpp deleted file mode 100644 index dba193d..0000000 --- a/PFFIAPUploadAgent.cpp +++ /dev/null @@ -1,244 +0,0 @@ -// -// IEEE1888 / FIAP Uploader Library for Arduino -// -// 2011/09/19 ver.1 H.Inoue & H.Ochiai -// 2011/10/15 ver.1.1 H.Ochiai (updated to use PGM for const strings: 572byte SRAM freed) -// 2016/02/10 ver.1.2 Hiromasa Ihara(forked) -// - -// --------- PFFIAPUploadAgent.cpp (begin) --------- -#include "PFFIAPUploadAgent.h" -#include - -#ifndef ESP8266 -#include -#include -#else -#include -#endif - -#include // TCPクライアント用 -#ifdef __AVR__ -#include -#endif - -#define DEBUG 0 - -#if DEBUG -#define print(a) print(a);Serial.print(a) -#define println(a) println(a);Serial.println(a) -#endif - -// void void FIAPUploadAgent::begin( ... ); -// Initialize the FIAPUploadAgent instance -// with specifying server information and PointSetID (=PointID prefix) -void FIAPUploadAgent::begin( - String server_host, - String server_path, - unsigned short server_port, - String fiap_id_prefix){ - - this->server_host=server_host; - this->server_path=server_path; - this->server_port=server_port; - this->fiap_id_prefix=fiap_id_prefix; -} - -// Messages (Stored in the program memory) -- HTTP Header Part -PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER01[] = "POST "; -PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER02[] = " HTTP/1.1"; -PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER03[] = "Content-Type: text/xml charset=UTF-8"; -PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER04[] = "User-Agent: PFFIAPUploadAgent (Arduino HCU)"; -PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER05[] = "Host: "; -PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER06[] = "SOAPAction: \"http://soap.fiap.org/data\""; -PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER07[] = "Content-Length: "; - -// Messages (Stored in the program memory) -- HTTP Body Part -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY01[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY02[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY04[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY05[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY06[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY07[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY10[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY12[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY14[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY15[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY17[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY18[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY19[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY20[] = ""; -PROGMEM const char FIAPUploadAgent_Post_HTTPBODY21[] = ""; - -// int FIAPUploadAgent::post(struct fiap_element* v, byte esize); -// Upload the data stored in (struct fiap_element[]). -// esize is the number of the array elements. -// Return values -// FIAP_UPLOAD_OK 0 -// FIAP_UPLOAD_CONNFAIL 1 // Connection faild (Socket I/O error) -// FIAP_UPLOAD_DNSERR 2 // DNS error -// FIAP_UPLOAD_HTTPERR 3 // HTTP Server error (The response was not "200 OK") -// FIAP_UPLOAD_FIAPERR 4 // FIAP Server error -int FIAPUploadAgent::post(struct fiap_element* v, byte esize){ - - int rescode = 0; // HTTP response code - int clen = 0; // content length - struct fiap_element *v0; - char count; - unsigned char c; - -#ifndef ESP8266 - EthernetClient client; -#else - WiFiClient client; -#endif - - // TCP接続開始 - if (!client.connect(server_host.c_str(), server_port)) { - // TCP接続失敗 - return(FIAP_UPLOAD_CONNFAIL); - } - - // TCP接続成功 - // コンテンツサイズ計算 - v0 = v; - clen = 320; // sum of literal strings - for (count = 0; count < esize; count++) { - clen += strlen(fiap_id_prefix.c_str()); - clen += strlen(v0->cid); - clen += strlen(v0->value); // + 3; - clen += 75; - v0++; - } // Serial.print("len="); Serial.println(clen); - - // sending message buffer - char sbuf[55]; - - // send HTTP header - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER01); - client.print(sbuf); // "POST " - client.print(server_path.c_str()); - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER02); - client.println(sbuf); // " HTTP/1.1" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER03); - client.println(sbuf); // "Content-Type: text/xml; charset=UTF-8" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER04); - client.println(sbuf); // "User-Agent: PFFIAPUploadAgent (Arduino HCU)" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER05); - client.print(sbuf); // "Host: " - client.println(server_host.c_str()); - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER06); - client.println(sbuf); // "SOAPAction: \"http://soap.fiap.org/data\"" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER07); - client.print(sbuf); // "Content-Length: " - client.println(clen); - client.println(); - - // send HTTP body - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY01); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY02); - client.print(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY04); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY05); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY06); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY07); - client.println(sbuf); // "" - - - v0=v; - for (count = 0; count < esize; count++) { - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY10); - client.print(sbuf); // "cid); - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY11); - client.println(sbuf); // "\">" - - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY12); - client.print(sbuf); // "" - client.print(v0->value); - - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY14); - client.println(sbuf); // "" - - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY15); - client.println(sbuf); // "" - v0++; - } - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY17); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY18); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY19); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY20); - client.println(sbuf); // "" - strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY21); - client.println(sbuf); // "" - client.println(); - - // parse HTTP response - count = 0; - while (client.connected()) { - // Serial.print("C"); - if (client.available()) { - c = client.read(); -#if DEBUG - Serial.write((char)c); -#endif - if (count == 1 && (c >= '0' && c <= '9')) { // parse HTTP response code - rescode = rescode * 10 + (c - '0'); - continue; - } - if (c == ' ') { // 応答コードの切れ目検出 - count++; - } - if (count == 2 || c == '\n') { // end of HTTP response code - break; // 応答ヘッダの2行目以降は見ない - } - } - } - if (!client.connected()) { // unexpected disconnect - client.stop(); - return(FIAP_UPLOAD_HTTPERR); - } - - // disconnect HTTP - while (client.connected() && client.available()) { - c = client.read(); // 応答を最後まで受信 -#if DEBUG - Serial.write((char)c); -#endif - } - client.stop(); - if (rescode == 200) { - return(FIAP_UPLOAD_OK); - } - return(FIAP_UPLOAD_HTTPERR); -} - -// Messages (Stored in the program memory) -- Time Format Part -PROGMEM const char FIAPUploadAgent_Post_TimeFormat[] = "%04d-%02d-%02dT%02d:%02d:%02d%s\0"; - -// [private method] char* FIAPUploadAgent::element_time_to_str(struct fiap_element* e); -// struct fiap_element に指定された時刻から "2011-08-26T10:28:00+00:00" の表記を得る -char* FIAPUploadAgent::element_time_to_str(struct fiap_element* e) -{ - static char fiap_time[28]; - char str_timeformat[35]; - strcpy_P(str_timeformat,FIAPUploadAgent_Post_TimeFormat); - sprintf(fiap_time,str_timeformat,e->year,e->month,e->day,e->hour,e->minute,e->second,e->timezone); - return fiap_time; -} -// --------- PFFIAPUploadAgent.cpp (end) --------- diff --git a/PFFIAPUploadAgent.h b/PFFIAPUploadAgent.h index 734c5a7..43949a9 100644 --- a/PFFIAPUploadAgent.h +++ b/PFFIAPUploadAgent.h @@ -1,52 +1,234 @@ -// -// 2011/09/19 ver.1 H.Inoue & H.Ochiai -// - -// --------- FIAPUploadAgent.h (begin) --------- -#ifndef __FIAPUploadAgent__ -#define __FIAPUploadAgent__ - -// return code of post method -#define FIAP_UPLOAD_OK 0 // Succeeded -#define FIAP_UPLOAD_CONNFAIL 1 // Connection faild (Socket I/O error) -#define FIAP_UPLOAD_DNSERR 2 // DNS error -#define FIAP_UPLOAD_HTTPERR 3 // HTTP Server error (The response was not "200 OK") -#define FIAP_UPLOAD_FIAPERR 4 // FIAP Server error - -#include - -// point element -struct fiap_element { - const char* cid; // ポイントIDのポストフィックス - char* value; // 値(文字列) - unsigned short year; // 年 - byte month; // 月 1 - 12 - byte day; // 日 1 - 31 - byte hour; // 時 0 - 23 - byte minute; // 分 0 - 59 - byte second; // 秒 0 - 59 - char* timezone; // タイムゾーン表記 "+09:00" -}; - -// class definition -class FIAPUploadAgent { -public: - void begin( - String server_host, - String server_path, - unsigned short server_port, - String fiap_id_prefix); - int post(struct fiap_element* v, byte esize); - -private: - char *element_time_to_str(struct fiap_element* e); - -private: - String server_host; - String server_path; - unsigned short server_port; - String fiap_id_prefix; -}; - -#endif // #ifndef FIAPUploadAgent -// --------- FIAPUploadAgent.h (end) --------- +// +// 2011/09/19 ver.1 H.Inoue & H.Ochiai +// 2017/04/14 ver.1.2.2 Makoto Uju & Hiromasa Ihara forked and removed ethernetclient +// + +// --------- FIAPUploadAgent.h (begin) --------- +#ifndef __FIAPUploadAgent__ +#define __FIAPUploadAgent__ + +#define FIAP_RESPONSE_TIMEOUT 500000 // 500ms + +// return code of post method +#define FIAP_UPLOAD_OK 0 // Succeeded +#define FIAP_UPLOAD_CONNFAIL 1 // Connection faild (Socket I/O error) +#define FIAP_UPLOAD_DNSERR 2 // DNS error +#define FIAP_UPLOAD_HTTPERR 3 // HTTP Server error (The response was not "200 OK") +#define FIAP_UPLOAD_FIAPERR 4 // FIAP Server error +#define FIAP_UPLOAD_HTTPTOERR 5 // HTTP Timeout error + +#define DEBUG 0 + +#if DEBUG +#define debug_print(msg) Serial.print(msg) +#define debug_println(msg) Serial.println(msg) +#else +#define debug_print(msg) do{}while(0) +#define debug_println(msg) do{}while(0) +#endif + +#define print(a) print(a); debug_print(a) +#define println(a) println(a); debug_println(a) + +#include +#ifdef __AVR__ +#include +#endif + +#include "PFFIAPUploadAgent.h" +#include "_protocol_literals.h" + +#include "TimeLib.h" +#include "LocalTimeLib.h" + + +// point element +struct fiap_element { + const char* cid; // ポイントIDのポストフィックス + char* value; // 値(文字列) + time_t time; + TimeZone* timezone; // タイムゾーン +}; + +// class definition +template +class FIAPUploadAgent { +public: + void begin( + String server_host, + String server_path, + unsigned short server_port, + String fiap_id_prefix) { + this->server_host=server_host; + this->server_path=server_path; + this->server_port=server_port; + this->fiap_id_prefix=fiap_id_prefix; + } + int post(struct fiap_element* v, byte esize) { + int rescode = 0; // HTTP response code + int clen = 0; // content length + struct fiap_element *v0; + char count; + unsigned int receive_loop_count; + unsigned char c; + + // TCP接続開始 + if (!client.connect(server_host.c_str(), server_port)) { + // TCP接続失敗 + return(FIAP_UPLOAD_CONNFAIL); + } + + // TCP接続成功 + // コンテンツサイズ計算 + v0 = v; + clen = 294; // sum of literal strings + for (count = 0; count < esize; count++) { + clen += strlen(fiap_id_prefix.c_str()); + clen += strlen(v0->cid); + clen += strlen(v0->value); + clen += 69; + v0++; + } // Serial.print("len="); Serial.println(clen); + + // sending message buffer + char sbuf[55]; + + // send HTTP header + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER01); + client.print(sbuf); // "POST " + client.print(server_path.c_str()); + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER02); + client.println(sbuf); // " HTTP/1.1" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER03); + client.println(sbuf); // "Content-Type: text/xml; charset=UTF-8" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER04); + client.println(sbuf); // "User-Agent: PFFIAPUploadAgent (Arduino HCU)" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER05); + client.print(sbuf); // "Host: " + client.println(server_host.c_str()); + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER06); + client.println(sbuf); // "SOAPAction: \"http://soap.fiap.org/data\"" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPHEADER07); + client.print(sbuf); // "Content-Length: " + client.println(clen); + client.println(); + + // send HTTP body + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY01); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY02); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY04); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY05); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY06); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY07); + client.print(sbuf); // "" + + + v0=v; + for (count = 0; count < esize; count++) { + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY10); + client.print(sbuf); // "cid); + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY11); + client.print(sbuf); // "\">" + + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY12); + client.print(sbuf); // "" + client.print(v0->value); + + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY14); + client.print(sbuf); // "" + + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY15); + client.print(sbuf); // "" + v0++; + } + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY17); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY18); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY19); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY20); + client.print(sbuf); // "" + strcpy_P(sbuf,FIAPUploadAgent_Post_HTTPBODY21); + client.print(sbuf); // "" + // client.println(); + + // parse HTTP response + count = 0; + receive_loop_count = 0; + while (client.connected()) { + // Serial.print("C"); + if (client.available()) { + c = client.read(); // Serial.print(c); + debug_print(c); + + if (count == 1 && isDigit(c)) { // parse HTTP response code + rescode = rescode * 10 + (c - '0'); + continue; + } + if (c == ' ') { // 応答コードの切れ目検出 + count++; + } + if (count == 2 || c == '\n') { // end of HTTP response code + break; // 応答ヘッダの2行目以降は見ない + } + } + receive_loop_count++; + if(receive_loop_count >= FIAP_RESPONSE_TIMEOUT) { + client.stop(); + return(FIAP_UPLOAD_HTTPTOERR); + } + delayMicroseconds(1); + } + if (!client.connected()) { // unexpected disconnect + client.stop(); + return(FIAP_UPLOAD_HTTPERR); + } + + // disconnect HTTP + while (client.connected() && client.available()) { + c = client.read(); // Serial.print(c); // 応答を最後まで受信 + debug_print(c); + } + client.stop(); + if (rescode == 200) { + return(FIAP_UPLOAD_OK); + } + return(FIAP_UPLOAD_HTTPERR); + } + +private: + char *element_time_to_str(struct fiap_element* e) { + TimeElements* tm; + + static char fiap_time[28]; + char str_timeformat[33]; + + tm = localtime(e->time); + strcpy_P(str_timeformat,FIAPUploadAgent_Post_TimeFormat); + sprintf(fiap_time, str_timeformat, tm->Year + 1970, tm->Month, tm->Day, tm->Hour, tm->Minute, tm->Second, e->timezone->iso_string); + + return fiap_time; + } + +private: + String server_host; + String server_path; + unsigned short server_port; + String fiap_id_prefix; + ClientT client; +}; + +#endif // #ifndef FIAPUploadAgent +// --------- FIAPUploadAgent.h (end) --------- diff --git a/_protocol_literals.h b/_protocol_literals.h new file mode 100644 index 0000000..dbebec4 --- /dev/null +++ b/_protocol_literals.h @@ -0,0 +1,30 @@ +// Messages (Stored in the program memory) -- HTTP Header Part +PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER01[] = "POST "; +PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER02[] = " HTTP/1.1"; +PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER03[] = "Content-Type: text/xml charset=UTF-8"; +PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER04[] = "User-Agent: PFFIAPUploadAgent (Arduino HCU)"; +PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER05[] = "Host: "; +PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER06[] = "SOAPAction: \"http://soap.fiap.org/data\""; +PROGMEM const char FIAPUploadAgent_Post_HTTPHEADER07[] = "Content-Length: "; + +// Messages (Stored in the program memory) -- HTTP Body Part +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY01[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY02[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY04[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY05[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY06[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY07[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY10[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY12[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY14[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY15[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY17[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY18[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY19[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY20[] = ""; +PROGMEM const char FIAPUploadAgent_Post_HTTPBODY21[] = ""; + +PROGMEM const char FIAPUploadAgent_Post_TimeFormat[] = "%04d-%02d-%02dT%02d:%02d:%02d%s\0";