MBED_DEMOS / Mbed 2 deprecated mbed_mqtt_endpoint_ublox_ethernet

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

Files at this revision

API Documentation at this revision

Comitter:
ansond
Date:
Tue Mar 04 04:48:04 2014 +0000
Parent:
68:00fcf22651e0
Child:
70:144f578e4470
Commit message:
no more splitstring

Changed in this revision

Definitions.h Show annotated file Show diff for this revision Revisions of this file
MQTTTransport.cpp Show annotated file Show diff for this revision Revisions of this file
MQTTTransport.h Show annotated file Show diff for this revision Revisions of this file
splitstring.lib Show diff for this revision Revisions of this file
--- a/Definitions.h	Tue Mar 04 04:34:40 2014 +0000
+++ b/Definitions.h	Tue Mar 04 04:48:04 2014 +0000
@@ -26,7 +26,7 @@
 #include "CommonDefinitions.h"
 
 // Memory Debug Enable/Disable
-#define ENABLE_MEMORY_DEBUG         true                            // false - disable, true - enable
+//#define ENABLE_MEMORY_DEBUG         true                            // false - disable, true - enable
 
 // Our Endpoint Version Annoucement
 #define ENDPOINT_VERSION_ANNOUNCE "\r\nMBED IMPACT(MQTT) Endpoint v1.0"
@@ -93,6 +93,7 @@
 #define MQTT_IOC_ANNOUNCE_TOPIC     "ARM/sensinode/control/all"     // IOC MQTT Topic (since MQTT on MBED cannot seem to handle wildcards)
 #define MQTT_IOC_ALL_ENDPOINT       "all"                           // must be the same as the last element of MATT_IOC_ANNOUNCE_TOPIC
 #define MQTT_IOC_TOPIC_LEN          64                              // max length for the topic string
+#define MQTT_PAYLOAD_SEGMENT_LEN    64                              // max length for a segment of the payload
 #define MQTT_USERNAME               ""                              // IOC MQTT Username
 #define MQTT_PASSWORD               ""                              // IOC MQTT Password
 
--- 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
--- a/MQTTTransport.h	Tue Mar 04 04:34:40 2014 +0000
+++ b/MQTTTransport.h	Tue Mar 04 04:48:04 2014 +0000
@@ -29,7 +29,7 @@
 #include "MBEDToIOCResourceMap.h"
 
 // largest MQTT message that PubSubClient will send
-#define MAX_MQTT_MESSAGE_LENGTH         127
+#define MAX_MQTT_MESSAGE_LENGTH         128
 
 class MQTTTransport : public Transport {
     private:
@@ -42,7 +42,7 @@
         MQTTTransport(ErrorHandler *error_handler,void *endpoint,MBEDToIOCResourceMap *map);
         virtual ~MQTTTransport();
        
-        void processMessage(char *message_name,char *payload, unsigned int len);
+        void processMessage(char *message_name,char *payload, unsigned int payload_length);
     
         virtual bool connect();
         virtual bool disconnect();
--- a/splitstring.lib	Tue Mar 04 04:34:40 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/ansond/code/splitstring/#a9814d9e621b