123

Dependencies:   MQTTSN

Sensor/sensor.cpp

Committer:
m_ahsan
Date:
2019-08-06
Revision:
15:8c473836feba

File content as of revision 15:8c473836feba:

#include "sensor.h"
#include "MbedJSONValue.h"

void process_rsc(MbedJSONValue &MSG);

struct Resource RES;
struct regularResource regRES;
struct announceableResource ancRES;
struct announcedResource ancdRES;
struct subordinateResource subRES;
struct announceableSubordinateResource ancsubRES;
struct announcedSubordinateResource ancdsubRES;

struct CreateAE CAE;
struct CreateCIN CIN;
struct CreateSub CSub;
struct respAE RAE;
struct respCnt RCnt;
struct respCin RCin;
struct respSub RSub;

//extern const char* CSE_ID;
extern char* AE_ID;
extern bool lcl;

//////////////////////////////////////////////
//      Func: Create_Req                    //
//      returns a json string               //
//      input parameters Class Request      //
//////////////////////////////////////////////
const char* Create_Req(Request Req)
{
    MbedJSONValue demo, demo2, demo3, demo4;
         
    std::string s;
    switch(Req.Resource_Type){
        case 0:
            break;
        case 1:
            break;
        case 2:
            demo3["api"] = CAE.App_ID;
            demo3["rn"] = CAE.resourceName;
            demo3["rr"] = CAE.requestReachability; 
            demo2["m2m:ae"] = demo3;
        break;
        case 3:
            demo3["rn"] = CAE.resourceName;
            demo2["m2m:cnt"] = demo3;
        break;
        case 4:
            demo3["cnf"] = CIN.contentInfo;
            demo3["con"] = CIN.content;
            demo2["m2m:cin"] = demo3;
        break;
        case 23:
            demo3["rn"] = CSub.resourceName;          
            demo4["net"] = CSub.notificationEventType;
            demo3["enc"] = demo4; 
            demo3["nu"] = CSub.notificationURI;             
            demo3["nct"] = CSub.notificationContentType;      
            demo2["m2m:sub"] = demo3;
        break;
    }
    demo["fr"] = Req.From;
    demo["op"] = Req.Operation;
    demo["pc"] = demo2;
    demo["rqi"] = Req.Request_Identifier;
    demo["to"] = Req.To;
    demo["ty"] = Req.Resource_Type;
    demo["lcl"] = lcl;
    
    //serialize it into a JSON string
    s = demo.serialize();
    printf("\nMSG SIZE: %d\n", s.length());
    printf("Req JSON: %s\r\n", s.c_str());

    return s.c_str();
}
//////////////////////////////////////////////
//      Func: Delete_Req                    //
//      returns a json string               //
//      input parameters Class Request      //
//////////////////////////////////////////////
const char* Delete_Req(Request Req)
{
    MbedJSONValue demo, demo2, demo3, demo4;
         
    std::string s;
   
    demo["fr"] = Req.From;
    demo["op"] = Req.Operation;
    demo["rqi"] = Req.Request_Identifier;
    demo["to"] = Req.To;
    demo["lcl"] = lcl;
    
    //serialize it into a JSON string
    s = demo.serialize();
    printf("\nMSG SIZE: %d\n", s.length());
    printf("Req JSON: %s\r\n", s.c_str());

    return s.c_str();
}
//////////////////////////////////////////////
//      Func: Create_Resp                   //
//      returns a json string               //
//      input parameters Class Response     //
//////////////////////////////////////////////
const char* Create_Resp(Response Resp)
{
    MbedJSONValue demo, demo2, demo3, demo4;
    demo3["ty"] = RES.Resource_Type;
    demo3["ri"] = RES.resourceID;
    demo3["pi"] = RES.parentID;
    demo3["ct"] = RES.creationTime;         //ct     1
    demo3["lt"] = RES.lastModifiedTime;     //lt     1  
    demo3["rn"] = RES.resourceName;
    std::string s;
    printf("RES.Resource_Type = %d",RES.Resource_Type);
    switch(RES.Resource_Type){
        case 0:
            demo3["api"] = RAE.App_ID;
            demo3["rr"] = RAE.requestReachability;
            demo3["aei"] = RAE.AE_ID;
            demo3["poa"] = RAE.pointOfAccess; 
            demo2["m2m:ae"] = demo3;
        break;
        case 1:
        break;
        case 2:
            demo3["api"] = RAE.App_ID;
            demo3["rr"] = RAE.requestReachability;
            demo3["aei"] = RAE.AE_ID;
            demo3["poa"] = RAE.pointOfAccess; 
            demo2["m2m:ae"] = demo3;
        break;
        case 3:
            demo3["st"] = RCnt.stateTag;
            demo3["cni"] = RCnt.CurrentNrOfInstances;
            demo3["cbs"] = RCnt.CurrentByteSize;
            demo2["m2m:cnt"] = demo3;
        break;
        case 4:
            demo3["et"] = ancsubRES.expirationTime;
            demo3["st"] = RCin.stateTag;
            demo3["cnf"] = RCin.contentInfo;
            demo3["cs"] = RCin.contentSize;
            demo3["con"] = RCin.content;
            demo2["m2m:cin"] = demo3;
        break;
        case 23:
            demo3["et"] = ancsubRES.expirationTime;
            demo4["net"] = RSub.notificationEventType;
            demo3["enc"] = demo4;
            demo3["nct"] = RSub.notificationContentType;
            demo3["nu"] = RSub.notificationURI;
            demo2["m2m:sub"] = demo3;
        break;
        
    }
    demo["rsc"] = Resp.responseStatusCode;
    demo["rqi"] = Resp.Request_Identifier;
    demo["pc"] = demo2;
    demo["to"] = Resp.To;
    demo["fr"] = Resp.From;
    demo["lcl"] = lcl;
    
    //serialize it into a JSON string
    s = demo.serialize();
    printf("\nMSG SIZE: %d\n", s.length());
    printf("RESP JSON: %s\r\n", s.c_str());
    return s.c_str();
}

const char* Notify_Resp(Response Resp)
{
    MbedJSONValue demo;
    std::string s;
    demo["rsc"] = Resp.responseStatusCode;
    demo["rqi"] = Resp.Request_Identifier;
    demo["fr"] = Resp.From;
    demo["to"] = Resp.To;
    demo["lcl"] = lcl;
    //serialize it into a JSON string
    s = demo.serialize();
    printf("\nMSG SIZE: %d\n", s.length());
    printf("RESP JSON: %s\r\n", s.c_str());
    return s.c_str();
}

void process_msg(const char* Buffer)
{
    MbedJSONValue MSG;

    parse(MSG, Buffer); 

    ////////////////////////Local Parameter (Additional parameter)//////////////////////
    if(MSG.hasMember("lcl"))
    {
        local = MSG["lcl"].get<bool>();
        printf("Local: %s\r\n", local? "true" : "false");
    }
     
    ////////////////////////resource Type Parameter (Mendatory parameter)//////////////////////
    if(MSG.hasMember("rsc"))
    {
        rsc = MSG["rsc"].get<int>();
        printf("Response Status Code: %d\r\n", rsc);
        Response_Type();
        printf("Response Status: %s\r\n", response.c_str());
        process_rsc(MSG);
        return;
    }
    
    ////////////////////////From parameter (Mendatory parameter[optional for Create AE])//////////
    if(MSG.hasMember("fr"))
    {
       From = MSG["fr"].get<std::string>();
       printf("From: %s\r\n", From.c_str());
    }
    else     {
    //add Response Status Code for no mendatory parameter BAD_REQUEST 
    return;  }
    
    ////////////////////////Operation Parameter (Mendatory parameter)//////////////////////
    if(MSG.hasMember("op"))
    {
       op = MSG["op"].get<int>();
       printf("Operation: %d\r\n", op);
       Operation_Type();
       printf("Operation: %s\r\n", operation.c_str());
       /* Process Notification*/
       if(op == 5)
       {
            MbedJSONValue &MSG_1 = MSG["pc"]["m2m:sgn"];
            sur = MSG_1["sur"].get<std::string>();
            printf("Subscription Reference: %s\r\n", sur.c_str());
            MbedJSONValue &MSG_2 = MSG_1["m2m:sgn"]["nev"];
            net = MSG_2["net"].get<int>();
            printf("NotificationEventType: %d\r\n", net); 
            MbedJSONValue &MSG_3 = MSG_2["nev"]["rep"]["cin"];
            con = MSG_3["con"].get<std::string>();
            printf("Content: %s\r\n", con.c_str());
            cnf = MSG_3["cnf"].get<std::string>(); 
            printf("Content Info: %s\r\n", cnf.c_str());
            to = MSG["to"].get<std::string>();
            printf("To: %s\r\n", to.c_str());     
            rqi = MSG["rqi"].get<std::string>();
            printf("Request Identifier: %s\r\n", rqi.c_str());   
            MSG.~MbedJSONValue();
            MSG_1.~MbedJSONValue();
            MSG_2.~MbedJSONValue();
            MSG_3.~MbedJSONValue();
            return;
       }
    }
    else     {
    //add response code for no mendatory parameter
    return;  }
    
    ////////////////////////To Parameter (Mendatory parameter)//////////////////////
    if(MSG.hasMember("to"))
    {
       to = MSG["to"].get<std::string>();
       printf("To: %s\r\n", to.c_str());
    }
    else     {
    //add response code for no mendatory parameter
    return;  } 
         
    ////////////////////////Request Identifier (Mendatory parameter)//////////////////////
    if(MSG.hasMember("rqi"))
    {
       rqi = MSG["rqi"].get<std::string>();
       printf("Request Identifier: %s\r\n", rqi.c_str());
    }
    else     {
    //add response code for no mendatory parameter
    return;   }        
    
    ////////////////////////resource Type Parameter (Mendatory parameter)//////////////////////
    if(MSG.hasMember("ty"))
    {
       ty = MSG["ty"].get<int>();
       printf("ResourceType: %d\r\n", ty);
       resource_type();
       printf("ResourceType: %s\r\n", resourceType.c_str());
    }
    else     {
    //add response code for no mendatory parameter
    return;   }
    
    ////////////////////////Response Status Code
    if(MSG.hasMember("rsc"))
    {
       rsc = MSG["rsc"].get<int>();
       printf("Response Status Code: %d\r\n", rsc);
       Response_Type();
       printf("Response Status: %s\r\n", response.c_str());
    }
    MbedJSONValue &MSG_1 = MSG["pc"][content]; //content value depends on the resource type e.g. m2m:ae for resource type 2
    
    //////////////////////// Resource specific attributes CSE-ID
    if(MSG_1.hasMember("csi"))
    {
       csi = MSG_1["csi"].get<std::string>();
       printf("CSI: %s\r\n", csi.c_str());
    }
       
    //////////////////////// Resource specific attributes Point of Access
    if(MSG_1.hasMember("poa"))
    {
       poa = MSG_1["poa"].get<std::string>();
       printf("POA: %s\r\n", poa.c_str());
    }  
     
    /////////////////////// Resource specific attributes CSE Type
    if(MSG_1.hasMember("cst"))
    {
       cst = MSG_1["cst"].get<int>();
       printf("CSE Type: %d\r\n", cst);
       CSE_Type();
       printf("CSE Type: %s\r\n", cseType.c_str());
    }
       
    /////////////////////// Resource specific attributes RequestReachability
    if(MSG_1.hasMember("rr"))
    {
       RequestReachability = MSG_1["rr"].get<bool>();
       printf("RR: %s\r\n", RequestReachability? "true" : "false");
    }
       
    /////////////////////// Resource specific attributes App-ID
    if(MSG_1.hasMember("api"))
    {
       api = MSG_1["api"].get<std::string>();
       printf("App-ID: %s\r\n", api.c_str());
    } 
    /////////////////////// Resource specific attributes resourceName
    if(MSG_1.hasMember("rn"))
    {
        rn = MSG_1["rn"].get<std::string>();
        printf("resourceName : %s\r\n", rn.c_str());
    } 
    /////////////////////// Resource specific attributes Content
    if(MSG_1.hasMember("con"))
    {
        con = MSG_1["con"].get<std::string>();
        printf("Content: %s\r\n", con.c_str());
    } 
    /////////////////////// Resource specific attributes ContentInfo
    if(MSG_1.hasMember("cnf"))
    {
        cnf = MSG_1["cnf"].get<std::string>();
        printf("Content Info: %s\r\n", cnf.c_str());
    }  
    /////////////////////// Resource specific attributes NotificationURI nu
    if(MSG_1.hasMember("nu"))
    {
        nu = MSG_1["nu"].get<std::string>();
        printf("Notification URI: %s\r\n", nu.c_str());
    } 
    /////////////////////// Resource specific attributes NotificationContentType
    if(MSG_1.hasMember("nct"))
    {
        nct = MSG_1["nct"].get<int>();
        printf("NotificationContentType: %d\r\n", nct);
        MbedJSONValue &MSG_2 = MSG_1["m2m:sub"]["enc"];
        if(MSG_2.hasMember("net"))
        {
            net = MSG_2["net"].get<int>();  
            printf("NotificationEventType: %d\r\n", net);  
        }
        MSG_2.~MbedJSONValue();
    }   
    
    MSG.~MbedJSONValue();
    MSG_1.~MbedJSONValue();
    return;
}

void process_rsc(MbedJSONValue &MSG)
{
    if(MSG.hasMember("rqi"))
    {
       rqi = MSG["rqi"].get<std::string>();
       printf("Request Identifier: %s\r\n", rqi.c_str());
    }
    else     {
    //add response code for no mendatory parameter
    return;   }  
    if(MSG.hasMember("to"))
    {
       to = MSG["to"].get<std::string>();
       printf("To: %s\r\n", to.c_str());
    }
    else     {
    //add response code for no mendatory parameter
    return;   } 
    if(MSG.hasMember("fr"))
    {
       From = MSG["fr"].get<std::string>();
       printf("From: %s\r\n", From.c_str());
    }
    else     {
    //add response code for no mendatory parameter
    return;   }
    
    MbedJSONValue &MSG_1 = MSG["pc"][content];
    
    if(MSG_1.hasMember("ty"))
    {
        ty = MSG_1["ty"].get<int>();
        printf("ResourceType in response: %d\r\n", ty);
        //resource_type();
        //printf("ResourceType in response: %s\r\n", resourceType.c_str());
    }
    else     {
    //add response code for no mendatory parameter
    return;   }
    
    if(MSG_1.hasMember("rr"))
    {
       RequestReachability = MSG_1["rr"].get<bool>();
       printf("RR: %s\r\n", RequestReachability? "true" : "false");
    } 
    if(MSG_1.hasMember("aei"))
    {
       aei = MSG_1["aei"].get<std::string>();
       printf("AE_ID: %s\r\n", aei.c_str());
    }         
    if(MSG_1.hasMember("poa"))
    {
       poa = MSG_1["poa"].get<std::string>();
       printf("POA: %s\r\n", poa.c_str());
    } 
    if(MSG_1.hasMember("rn"))
    {
       rn = MSG_1["rn"].get<std::string>();
       printf("Resource Name: %s\r\n", rn.c_str());
    }
    if(MSG_1.hasMember("api"))
    {
       api = MSG_1["api"].get<std::string>();
       printf("App-ID: %s\r\n", api.c_str());
    } 
    /////////////////////// Resource specific attributes Content
    if(MSG_1.hasMember("con"))
    {
        con = MSG_1["con"].get<std::string>();
        printf("Content: %s\r\n", con.c_str());
    } 
    /////////////////////// Resource specific attributes ContentInfo
    if(MSG_1.hasMember("cnf"))
    {
        cnf = MSG_1["cnf"].get<std::string>();
        printf("Content Info: %s\r\n", cnf.c_str());
    }  
    
    return;
}