MBED_DEMOS / Mbed 2 deprecated mbed_mqtt_endpoint_nxp

Dependencies:   C12832_lcd EthernetInterface StatusReporter LM75B MQTT-ansond endpoint_core endpoint_mqtt mbed-rtos mbed

Revision:
69:090e16acccb7
Parent:
48:d3663434128d
Child:
70:144f578e4470
--- a/MQTTTransport.cpp	Tue Mar 04 04:34:40 2014 +0000
+++ b/MQTTTransport.cpp	Tue Mar 04 04:48:04 2014 +0000
@@ -23,10 +23,7 @@
  
  // EmulatedResourceFactory support
  #include "EmulatedResourceFactory.h"
- 
- // splitstring support
- #include "splitstring.h"
- 
+  
  // our transmitt instance 
  MQTTTransport *_mqtt_instance =  NULL;
 
@@ -69,34 +66,43 @@
  char *MQTTTransport::getEndpointNameFromTopic(char *topic) {
      if (topic != NULL) {
          memset(this->m_endpoint_name,0,LIGHT_NAME_LEN+1);
-         splitstring *tmp = new splitstring(topic); 
-         vector<string> data = tmp->split('/');    
-         if (data.size() > 0) {
-              char *ep  = (char *)data[data.size()-1].c_str();
-              if (ep != NULL) {
-                   if (strcmp(ep,MQTT_IOC_ALL_ENDPOINT) != 0) {
-                       // just insert the name and let the parser determine if its for us or not...
-                       strncpy(this->m_endpoint_name,ep,strlen(ep));
-                   }
-                   else {
-                       // this is a broadcast message - so we need to process it
-                       MBEDEndpoint *endpoint = (MBEDEndpoint *)this->getEndpoint();
-                       char *endpoint_name = endpoint->getEndpointName();
-                       strcpy(this->m_endpoint_name,endpoint_name);
-                   }
-               } 
+         char trash[MQTT_IOC_TOPIC_LEN+1];
+         char ep[MQTT_IOC_TOPIC_LEN+1];
+         memset(trash,0,MQTT_IOC_TOPIC_LEN+1);
+         memset(ep,0,MQTT_IOC_TOPIC_LEN+1);
+         bool done = false;
+         int length = 0; if (topic != NULL) length = strlen(topic);
+         for(int i=length-1;i>=0 && !done;--i) if (topic[i] == '/') { topic[i] = ' ' ; done = true; }
+         sscanf(topic,"%s%s",trash,ep);
+         if (strlen(ep) > 0) {
+               if (strcmp(ep,MQTT_IOC_ALL_ENDPOINT) != 0) {
+                   // just insert the name and let the parser determine if its for us or not...
+                   strncpy(this->m_endpoint_name,ep,strlen(ep));
+               }
+               else {
+                   // this is a broadcast message - so we need to process it
+                   MBEDEndpoint *endpoint = (MBEDEndpoint *)this->getEndpoint();
+                   char *endpoint_name = endpoint->getEndpointName();
+                   strcpy(this->m_endpoint_name,endpoint_name);
+               }
           }
-          if (tmp != NULL) delete tmp;
           return this->m_endpoint_name;
        }
        return NULL;
  }
  
  // process a MQTT Message
- void MQTTTransport::processMessage(char *message_name,char *payload, unsigned int len) {
-     char *message_type = "";
-     char *message_verb = "";
-     char *message_value = "";
+ void MQTTTransport::processMessage(char *message_name,char *payload, unsigned int payload_length) {
+     char message_type[MQTT_PAYLOAD_SEGMENT_LEN+1];
+     char message_verb[MQTT_PAYLOAD_SEGMENT_LEN+1];
+     char message_value[MQTT_PAYLOAD_SEGMENT_LEN+1];
+     char message_opt[MQTT_PAYLOAD_SEGMENT_LEN+1];
+     
+     // initialize
+     memset(message_type,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
+     memset(message_verb,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
+     memset(message_value,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
+     memset(message_opt,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
       
      // get our endpoint
      MBEDEndpoint *endpoint = (MBEDEndpoint *)this->getEndpoint();
@@ -107,16 +113,19 @@
 
      // only respond if its for our node
      if (strcmp(endpoint_name,message_name) == 0) {                  
-         // format of the MQTT message:   message_type:verb|Parameter_X:value|keyword:optional_data        
-         splitstring *tmp = new splitstring(payload); 
-         vector<string> data = tmp->split(':');    
-         if (data.size() > 0) message_type  = (char *)data[0].c_str();
-         if (data.size() > 1) message_verb  = (char *)data[1].c_str();
-         if (data.size() > 2) message_value = (char *)data[2].c_str();
-               
+         // format of the MQTT message:   message_type:verb|Parameter_X:value|keyword:optional_data  
+         char buffer[MAX_MQTT_MESSAGE_LENGTH+1];
+         memset(buffer,0,MAX_MQTT_MESSAGE_LENGTH+1); 
+         memcpy(buffer,payload,payload_length); 
+         int count = 0; for(int i=0;i<payload_length;++i) if (payload[i] == ':') ++count;
+         for(int i=0;i<payload_length;++i) if (buffer[i] == ':') buffer[i] = ' ';     
+         if (count == 1) sscanf(buffer,"%s %s",message_type,message_verb);
+         if (count == 2) sscanf(buffer,"%s %s",message_type,message_verb,message_value);
+         if (count == 3) sscanf(buffer,"%s %s %s",message_type,message_verb,message_value);
+                        
          // DEBUG
-         //this->logger()->log("Raw Payload: %s",payload);
-         //this->logger()->log("Type: %s Name: %s Verb: %s Value: %s",message_type,message_name,message_verb,message_value);
+         this->logger()->log("Raw Payload: %s",buffer);
+         this->logger()->log("Parsed Payload: Type: [%s] Name: [%s] Verb: [%s] Value: [%s]",message_type,message_name,message_verb,message_value);
                           
          // load endpoints
          if (message_type != NULL && strcmp(message_type,IOC_ENDPOINT_VERB) == 0) {                 // Endpoint
@@ -182,7 +191,7 @@
                          char *mapped_resource = this->mapIOCResourceToEndpointResource((char *)message_verb);
                          if (mapped_resource != NULL) {
                              EmulatedResourceFactory *factory = (EmulatedResourceFactory *)endpoint->getResources(index);
-                             message_value = factory->getResourceValue((char *)mapped_resource);
+                             strcpy(message_value,factory->getResourceValue((char *)mapped_resource));
                              bool success = false; if (message_value != NULL) success = true;
                              
                              // log resource get
@@ -195,9 +204,6 @@
                  }
              }
          }
-         
-         // clean up
-         if (tmp != NULL) delete tmp;
      }
      else {
          // message not bound for our node