mqtt specific components for the impact mbed endpoint library

Dependents:   mbed_mqtt_endpoint_ublox_ethernet mbed_mqtt_endpoint_ublox_cellular mbed_mqtt_endpoint_nxp

Revision:
6:2db2c7e75ad9
Child:
7:8a4a61202b36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCEndpoint.cpp	Thu Mar 27 18:14:05 2014 +0000
@@ -0,0 +1,146 @@
+/* Copyright C2013 Doug Anson, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files the "Software", to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ // class support
+ #include "IOCEndpoint.h"
+ 
+ // MBED instance support
+ #include "MBEDEndpoint.h"
+ 
+ // default constructor
+ IOCEndpoint::IOCEndpoint(ErrorHandler *error_handler,void *endpoint) {
+     this->m_error_handler = error_handler;
+     this->m_endpoint = endpoint;
+ }
+ 
+ // default destructor
+ IOCEndpoint::~IOCEndpoint() {
+ }
+ 
+ // build out the IOC Payload
+ char *IOCEndpoint::buildPayload(char *data,int data_length,Light *light) {
+     char tmp[TEMP_BUFFER_LEN+1];
+     
+     // MBED Endpoint
+     MBEDEndpoint *endpoint = (MBEDEndpoint *)this->m_endpoint;
+      
+     // construct the payload for Load/Updates
+     ResourceFactory *factory = light->getResourceFactory();
+     
+     // start the buffer
+     strcat(data,"{");
+     
+     // loop through the resources and build a JSON representation for the payload
+     for(int i=0;i<factory->numResources();++i) {
+         // get the ith resource
+         Resource *resource = factory->getResource(i);
+         if (resource != NULL) {
+             // add to the JSON payload
+             char *name = endpoint->getMap()->endpointNameToIOCName(resource->getName());
+             char *value = resource->getValue();
+             
+             // make sure that we have a positive IOC resource match for the NSP resource 
+             if (name != NULL && strlen(name) > 0) {
+                 // Handle LOCATION a special way
+                 if (strcmp(name,"LOCATION") != 0) {
+                     // standard name,value for IOC
+                     sprintf(tmp, "\"%s\":\"%s\",",name,value); 
+                  }
+                 else {
+                     // IOC expects "Point(X,Y)" for LOCATION
+                     sprintf(tmp, "\"%s\":\"Point(%s)\",",name,value); 
+                 }   
+                 strcat(data,tmp);
+            
+                 // Handle /dev/addldata 
+                 char *dev_addldata = endpoint->getMap()->endpointNameToIOCName("/dev/addldata");
+                 if (dev_addldata != NULL && strcmp(name,dev_addldata) == 0 && light != NULL && light->getIOCID() > 0) {
+                     char buf[IOC_IOC_ID_LEN+1]; memset(buf,0,IOC_IOC_ID_LEN+1); sprintf(buf,"%d",light->getIOCID());
+                     sprintf(tmp,"\"%s\":\"id:%s\",",name,buf);
+                     strcat(data,tmp);
+                 }
+             }
+         }
+     }
+     
+     // Special Case: STARTDATETIME
+     strcat(data,ENDPOINT_STARTTIME);
+     
+     // Special Case: ENDDATETIME
+     strcat(data,ENDPOINT_STOPTIME);
+                
+     // Special Case: NAME
+     sprintf(tmp,"\"NAME\":\"%s\",",light->getName());
+     strcat(data,tmp);
+          
+     // Special Case: TIMEZONEOFFSET
+     strcat(data,ENDPOINT_TIMEZONE);
+          
+     // close
+     strcat(data,"}");
+     
+     // DEBUG
+     //this->logger()->log("Loading Payload: %s",data);
+     
+     // return the payload
+     return data;
+ }
+  
+ // save the IOC ID for a Light node
+ void IOCEndpoint::saveLightID(Light *light,char *json) {
+     if (json != NULL) {          
+         //this->logger()->log("RESULT: %s",json);
+         
+         // look for "id":
+         char *check = "\"id\":";
+         char *pos1 = strstr(json,check);
+         if (pos1 != NULL) {
+             char *pos2 = strstr(pos1,","); 
+             if (pos1 != NULL && pos2 != NULL && pos2 > pos1) {
+                 pos1 += strlen(check);
+                 int length = pos2 - pos1;  
+                 char str_ioc_id[IOC_IOC_ID_LEN+1];
+                 memset(str_ioc_id,0,IOC_IOC_ID_LEN+1);
+                 strncpy(str_ioc_id,pos1,length);
+                 
+                 // DEBUG
+                 //this->logger()->log("IOC ID found: %s",str_ioc_id);
+                 
+                 // parse into int  
+                 int ioc_id = 0;             
+                 sscanf(str_ioc_id,"%d",&ioc_id);
+                          
+                 // save the IOC ID
+                 if (ioc_id > 0) light->setIOCID(ioc_id);
+             }
+             else {
+                 // cannot find the ID tag in the result JSON
+                 this->logger()->log("Cannot find the IOC ID in the JSON result");
+                 this->logger()->log("JSON: %s",json);
+             }
+         }
+         else {
+             // cannot find the ID tag in the result JSON
+             this->logger()->log("Cannot find the IOC ID in the JSON result");
+             this->logger()->log("JSON: %s",json);
+        }
+     }
+ }
+ 
+ // get our error handler
+ ErrorHandler *IOCEndpoint::logger() { return this->m_error_handler; }
\ No newline at end of file