Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: C027_Support C12832 StatusReporter LM75B MQTT-ansond c027_radios endpoint_core endpoint_mqtt mbed-rtos mbed
Diff: MQTTTransport.cpp
- Revision:
- 69:090e16acccb7
- Parent:
- 48:d3663434128d
- Child:
- 70:144f578e4470
diff -r 00fcf22651e0 -r 090e16acccb7 MQTTTransport.cpp
--- 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