FIAP (IEEE1888) library

Dependents:   Fetch_IEEE1888_Storage IEEE1888_MULTI_SENSOR_GW

Fork of FiapV2 by Yasushi TAUCHI

fiap.cpp

Committer:
strysd
Date:
2013-03-01
Revision:
18:274f2cbdc18c
Parent:
17:e6298cbdefdc
Child:
19:101d8775b33d

File content as of revision 18:274f2cbdc18c:

#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];
    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++) {
        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++) {
                    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 requestBuffer[50];
    strcpy(_soap_text,_soap_header);
    for (i=0; i < esize; i++) {
        sprintf(requestBuffer,"%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 , requestBuffer);
        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;
}