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 C12832 EthernetInterface StatusReporter LM75B MQTT-ansond endpoint_core endpoint_mqtt mbed-rtos mbed
Revision 69:090e16acccb7, committed 2014-03-04
- 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
--- 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