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
Diff: MQTTTransport.cpp
- Revision:
- 7:f570eb3f38cd
- Parent:
- 6:34c07e145caa
- Child:
- 8:45f9a920e82c
--- a/MQTTTransport.cpp Wed Feb 26 07:22:34 2014 +0000
+++ b/MQTTTransport.cpp Wed Feb 26 18:59:08 2014 +0000
@@ -21,8 +21,8 @@
// Endpoint Support
#include "MBEDEndpoint.h"
- // string splitter support
- #include "Splitter.h"
+ // splitstring support
+ #include "splitstring.h"
// our transmitt instance
MQTTTransport *instance = NULL;
@@ -36,10 +36,10 @@
PubSubClient _mqtt(MQTT_HOSTNAME,MQTT_HOSTPORT,_mqtt_message_handler);
// default constructor
- MQTTTransport::MQTTTransport(ErrorHandler *error_handler) : Transport(error_handler) {
+ MQTTTransport::MQTTTransport(ErrorHandler *error_handler,void *endpoint) : Transport(error_handler,endpoint) {
this->m_mqtt = NULL;
instance = this;
- this->m_map = new MBEDToIOCResourceMap();
+ this->m_map = new MBEDToIOCResourceMap(error_handler);
}
// default destructor
@@ -65,49 +65,44 @@
// process a MQTT Message
void MQTTTransport::processMessage(char *message_name,char *payload, unsigned int len) {
- char *message_type = NULL;
- char *message_verb = NULL;
- char *message_value = NULL;
- char *message_opt = NULL;
- char *endpoint_name = NULL;
+ char *message_type = "";
+ char *message_verb = "";
+ char *message_value = "";
+ char *message_opt = "";
+
+ bool enable = true;
// get our endpoint
MBEDEndpoint *endpoint = (MBEDEndpoint *)this->getEndpoint();
-
- char buffer[129];
- memset(buffer,0,129);
- memcpy(buffer,payload,len);
+ char *endpoint_name = endpoint->getEndpointName();
// DEBUG
- this->logger()->pause("MQTT Message: %s length=%d endpoint_name=%s",buffer,len,message_name);
-
- // split the string by the delimiter
- this->logger()->pause("DOUG1");
- Splitter *splitter = new Splitter(buffer,':',this->logger());
- this->logger()->pause("DOUG2");
- char** data = splitter->split();
- this->logger()->pause("DOUG3");
- int count = splitter->size(data);
- this->logger()->pause("DOUG4");
-
- // get our endpoint name
- this->logger()->pause("DOUG5");
- endpoint_name = endpoint->getEndpointName();
-
- // format of the MQTT message: message_type:verb|Parameter_X:value|keyword:optional_data
- if (count > 0) message_type = data[0];
- if (count > 1) message_verb = data[1];
- if (count > 2) message_value = data[2];
- if (count > 3) message_opt = data[3];
-
- // DEBUG
- this->logger()->log("Type: %s Name: %s Verb: %s Value: %s",message_type,message_name,message_verb,message_value);
-
+ this->logger()->pause("MQTT Message: %s length=%d endpoint_name=%s",payload,len,message_name);
+
// only respond if its for our node
- if (false && strcmp(endpoint_name,message_name) == 0) {
+ if (enable && strcmp(endpoint_name,message_name) == 0) {
// DEBUG
this->logger()->log("Message: %s bound for %s... processing...",payload,endpoint_name);
-
+
+ // format of the MQTT message: message_type:verb|Parameter_X:value|keyword:optional_data
+ splitstring *tmp = new splitstring(payload);
+ this->logger()->pause("DOUG1");
+ vector<string> data = tmp->split(':');
+ this->logger()->pause("DOUG2");
+ if (data.size() > 0) message_type = (char *)data[0].c_str();
+ this->logger()->pause("DOUG3");
+ if (data.size() > 1) message_verb = (char *)data[1].c_str();
+ this->logger()->pause("DOUG4");
+ if (data.size() > 2) message_value = (char *)data[2].c_str();
+ this->logger()->pause("DOUG5");
+ if (data.size() > 3) message_opt = (char *)data[3].c_str();
+ this->logger()->pause("DOUG6");
+
+ // DEBUG
+ this->logger()->log("Type: %s Name: %s Verb: %s Value: %s",message_type,message_name,message_verb,message_value);
+
+ return;
+
// load endpoints
if (message_type != NULL && strcmp(message_type,"Endpoint") == 0) {
if (message_name != NULL && strcmp(message_name,"all") == 0) {
@@ -175,17 +170,17 @@
}
}
}
+
+ // clean up the array
+ //if (data != NULL) splitter->clear(data);
+
+ // clean up
+ //if (splitter != NULL) delete splitter;
}
else {
// message not bound for our node
this->logger()->log("MQTT Message: %s not for us: %s... ignoring...",payload,endpoint_name);
- }
-
- // clean up the array
- if (data != NULL) splitter->clear(data);
-
- // clean up
- if (splitter != NULL) delete splitter;
+ }
}
void MQTTTransport::sendResourceValue(char *endpoint_name,char *parameter_name,char *value) {
@@ -221,16 +216,19 @@
else {
this->logger()->log("MQTT Subscribe: Topic: %s FAILED",MQTT_IOC_TOPIC);
this->logger()->turnLEDRed();
+ this->m_connected = false;
}
}
else {
this->logger()->log("MQTT Connect: ID: %s FAILED",id);
this->logger()->turnLEDRed();
+ this->m_connected = false;
}
}
else {
this->logger()->log("MQTT Unable to allocate new instance");
this->logger()->turnLEDRed();
+ this->m_connected = false;
}
}
else {