FIAP (IEEE1888) library
Dependents: Fetch_IEEE1888_Storage IEEE1888_MULTI_SENSOR_GW
Fork of FiapV2 by
fiap.cpp
- Committer:
- strysd
- Date:
- 2013-03-02
- Revision:
- 19:101d8775b33d
- Parent:
- 18:274f2cbdc18c
File content as of revision 19:101d8775b33d:
#include "fiap.h" #include "mbed.h" #include "stdio.h" #if USE_FETCH #include "spdomparser.hpp" #include "spxmlnode.hpp" #include "spxmlhandle.hpp" #endif void FIAP::setMode(bool _use_fetch) { strcpy(_soap_header,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); strcat(_soap_header,"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"); strcat(_soap_header,"<soapenv:Body><ns2:"); strcpy(_soap_action,"http://soap.fiap.org/"); if (_use_fetch) { strcat(_soap_header,"queryRQ"); strcat(_soap_action,"query"); strcpy(_soap_footer,"</header>"); } else { strcat(_soap_header,"dataRQ"); strcat(_soap_action,"data"); strcpy(_soap_footer,"</body>"); } strcat(_soap_header," xmlns:ns2=\"http://soap.fiap.org/\">"); strcat(_soap_header,"<transport xmlns=\"http://gutp.jp/fiap/2009/11/\">"); strcat(_soap_footer,"</transport></ns2:"); if (_use_fetch) { strcat(_soap_header,"<header>"); strcat(_soap_footer,"queryRQ>"); } else { strcat(_soap_header,"<body>"); strcat(_soap_footer,"dataRQ>"); } strcat(_soap_footer,"</soapenv:Body>"); strcat(_soap_footer,"</soapenv:Envelope>"); strcat(_soap_footer,"\r\n\r\n"); return; } char* FIAP::HTTPStatusText(HTTPResult r) { if (r==HTTP_OK) { return "Success \n"; } if (r==HTTP_PROCESSING) { return "Processing \n"; } if (r==HTTP_PARSE) { return "URI Parse error \n"; } if (r==HTTP_DNS) { return "Could not resolve name\n"; } if (r==HTTP_PRTCL) { return "Protocol error\n"; } if (r==HTTP_NOTFOUND) { return "HTTP 404 Error\n"; } if (r==HTTP_REFUSED) { return "HTTP 403 Error \n"; } if (r==HTTP_ERROR) { return "HTTP xxx error \n "; } if (r==HTTP_TIMEOUT) { return "Connection timeout\n"; } if (r==HTTP_CONN) { return "Connection error\n"; } if (r==HTTP_CLOSED) { return "Connection error\n"; } return "Unknown Network Error\n"; } void FIAP::myprintf(char text[2000]) { if (debug_mode)printf(text); } FIAP::FIAP() { debug_mode = false; _use_fetch = false; setMode(_use_fetch); } FIAP::FIAP(char Storage[]) { debug_mode = false; _use_fetch = false; setMode(_use_fetch); strcpy(_fiap_storage,Storage); } FIAP::FIAP(char Storage[], bool _use_fetch) { debug_mode = false; setMode(_use_fetch); strcpy(_fiap_storage,Storage); } void FIAP::setStorage(char Storage[]) { strcpy(_fiap_storage,Storage); return; } #if USE_FETCH int FIAP::fetch_last_data(struct fiap_element* v /*, unsigned int esize*/) { HTTPClient http; int i,ii,j,ll,k1,k2; char rstr[800]; int yy,mo,dd,hh,mm,ss;//date, time char zone[10];//timezone char p_id[100]; char p_val[50]; char p_time[50]; char uuid[37]; strcpy( _soap_text, _soap_header); strcat( _soap_text , "<query id=\""); sprintf(uuid,"%04x%04x-%04x-%04x-%04x-%04x%04x%04x", rand()%0x10000, rand()%0x10000, rand()%0x10000, rand()%1000|0x4000, rand()%0x1000|0x8000, rand()%0x10000, rand()%10000, (rand()+1)%0x10000); strcat( _soap_text , uuid); strcat( _soap_text , "\" type=\"storage\">"); /* for (i=0; i < esize; i++) {*/ i = 0; strcat(_soap_text , "<key id=\""); strcat(_soap_text , v[i].cid); strcat(_soap_text , "\" attrName=\"time\" select=\"maximum\"/>"); /* }*/ strcat(_soap_text , "</query>"); strcat(_soap_text , _soap_footer); if (debug_mode) { printf(_fiap_storage); printf("\r\n"); printf(_soap_text); printf("<<< Request(end)\n"); } //HTTPText InData("text/html", 800); //InData.set(_soap_text); HTTPText InData(_soap_text); HTTPText stream(rstr,800); //stream.readNext((byte*)outBuffer,1500); myprintf("post.start \n\r"); HTTPResult r = http.postXML(_fiap_storage,_soap_action,InData,&stream); myprintf("post.end \n\r"); if (debug_mode) { printf("****\n\r"); printf(rstr); printf("\n\r****\n\r"); } myprintf(HTTPStatusText(r)); if (r != HTTP_OK) { return -1; } SP_XmlNodeList * points; SP_XmlNodeList * trans_point; if (strlen(rstr) <= 0) { myprintf("can not get data\n\r"); return -1; } myprintf("\n\r data Get Ok\n\r"); SP_XmlDomParser parser; parser.append(rstr,strlen(rstr)); //stream.readNext((byte*)outBuffer,4096); SP_XmlHandle rootHandle(parser.getDocument()->getRootElement()); SP_XmlHandle transport = rootHandle.getChild(0).getChild(0).getChild(0); SP_XmlElementNode * fiapError = transport.getChild("header").getChild("error").toElement(); if(debug_mode)printf ("%s \n",transport.toElement()->getName()); if(fiapError != NULL) { myprintf("XmlElementNode error\n\r"); return -1; } SP_XmlElementNode * trans_element = transport.toElement(); trans_point=(SP_XmlNodeList *)trans_element->getChildren() ; k1=trans_point->getLength(); if(debug_mode)printf("Trans Child has Element of No %d \n\r",k1); SP_XmlElementNode * values; for(k2=0; k2<k1; k2++) { values =transport.getChild(k2).toElement(); if(debug_mode){ printf(values->getName()); printf("\n\r"); } if(strstr((values->getName()),"body") !=NULL) { myprintf("find body \n\r"); points=(SP_XmlNodeList *)values->getChildren() ; j=points->getLength(); if(debug_mode)printf("GetValues of No %d \n\r",j); SP_XmlElementNode *data_point_node,*data_value_node; SP_XmlCDataNode *data_value_cnode; for (i=0; i<j; i++) { SP_XmlHandle data_handle(points->get(i));//Point data_point_node=data_handle.toElement(); //data_value_node=data_handle.getChild("value").toElement(); //data_value_cnode=data_handle.getChild("value").getChild(0).toCData(); data_value_node=data_handle.getChild(0).toElement(); data_value_cnode=data_handle.getChild(0).getChild(0).toCData(); sprintf(p_id ,"%s",data_point_node->getAttrValue("id")); sprintf(p_val,"%s",data_value_cnode->getText()); sprintf(p_time,"%s",data_value_node->getAttrValue("time")); if(debug_mode){ printf("PointID=%s \r\n",p_id); printf("date=%s \r\n",p_time); printf("data=%s \r\n",p_val); } /* for (ii=0; ii<esize; ii++) {*/ ii = 0; if (strcmp(v[ii].cid, p_id)==0) { ll=sscanf(p_time,"%d-%d-%dT%d:%d:%d.000%s", &yy,&mo,&dd,&hh,&mm,&ss,zone); if(debug_mode)printf("date convert no %d (%d/%d/%d %d:%d:%d %s) \r\n", ll,yy,mo,dd,hh,mm,ss,zone); //TODO timezone struct fiap_element my_element = { v[ii].cid, p_val, yy, mo, dd, hh, mm, ss, NULL}; v[ii] = my_element; } /* }*/ } } } return 0; } #endif //USE_FETCH int FIAP::post(struct fiap_element* v, unsigned int esize) { HTTPClient http; int i; char rstr[1200]; char p_time[50]; strcpy(_soap_text,_soap_header); for (i=0; i < esize; i++) { sprintf(p_time,"%04d-%02d-%02dT%02d:%02d:%02d.0000000", v[i].year,v[i].month,v[i].day, v[i].hour,v[i].minute,v[i].second); strcat(_soap_text , "<point id=\""); strcat(_soap_text , v[i].cid); strcat(_soap_text , "\">"); strcat(_soap_text , "<value time=\""); strcat(_soap_text , p_time); strcat(_soap_text , v[i].timezone); strcat(_soap_text , "\">"); strcat(_soap_text , v[i].value); strcat(_soap_text , "</value>"); strcat(_soap_text , "</point>"); } strcat(_soap_text , _soap_footer); if(debug_mode){ printf(_soap_text); printf("<<< Request(end)\n"); } // http.setRequestHeader("Content-Type","text/xml; charset=UTF-8"); // http.setRequestHeader("SOAPAction","\"http://soap.fiap.org/data\""); // InData=new HTTPText(); HTTPText InData(_soap_text); HTTPText OutData(rstr,1200); HTTPResult r = http.postXML(_fiap_storage,_soap_action,InData,&OutData); myprintf(HTTPStatusText(r)); if (r != HTTP_OK) { return -1; } if(debug_mode){ printf("****\n\r"); printf(rstr); printf("\n\r****\n\r"); } return 0; }