MBED_DEMOS / Mbed 2 deprecated mbed_mqtt_endpoint_nxp

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

Committer:
ansond
Date:
Sun Mar 09 18:52:07 2014 +0000
Revision:
89:6e7dd4cba216
Parent:
72:ffd155ec8b93
Child:
93:e3b732068ae9
updates

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 0:ae2a45502448 1 /* Copyright C2013 Doug Anson, MIT License
ansond 0:ae2a45502448 2 *
ansond 0:ae2a45502448 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
ansond 0:ae2a45502448 4 * and associated documentation files the "Software", to deal in the Software without restriction,
ansond 0:ae2a45502448 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
ansond 0:ae2a45502448 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
ansond 0:ae2a45502448 7 * furnished to do so, subject to the following conditions:
ansond 0:ae2a45502448 8 *
ansond 0:ae2a45502448 9 * The above copyright notice and this permission notice shall be included in all copies or
ansond 0:ae2a45502448 10 * substantial portions of the Software.
ansond 0:ae2a45502448 11 *
ansond 0:ae2a45502448 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
ansond 0:ae2a45502448 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
ansond 0:ae2a45502448 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
ansond 0:ae2a45502448 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ansond 0:ae2a45502448 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ansond 0:ae2a45502448 17 */
ansond 0:ae2a45502448 18
ansond 0:ae2a45502448 19 #include "MQTTTransport.h"
ansond 0:ae2a45502448 20
ansond 4:11f00b499106 21 // Endpoint Support
ansond 0:ae2a45502448 22 #include "MBEDEndpoint.h"
ansond 0:ae2a45502448 23
ansond 8:45f9a920e82c 24 // EmulatedResourceFactory support
ansond 8:45f9a920e82c 25 #include "EmulatedResourceFactory.h"
ansond 69:090e16acccb7 26
ansond 0:ae2a45502448 27 // our transmitt instance
ansond 15:e44d75d95b38 28 MQTTTransport *_mqtt_instance = NULL;
ansond 0:ae2a45502448 29
ansond 0:ae2a45502448 30 // MQTT callback to handle received messages
ansond 0:ae2a45502448 31 void _mqtt_message_handler(char *topic,char *payload,unsigned int length) {
ansond 15:e44d75d95b38 32 if (_mqtt_instance != NULL) _mqtt_instance->processMessage(_mqtt_instance->getEndpointNameFromTopic(topic),payload,length);
ansond 0:ae2a45502448 33 }
ansond 0:ae2a45502448 34
ansond 0:ae2a45502448 35 // our MQTT client endpoint
ansond 0:ae2a45502448 36 PubSubClient _mqtt(MQTT_HOSTNAME,MQTT_HOSTPORT,_mqtt_message_handler);
ansond 0:ae2a45502448 37
ansond 0:ae2a45502448 38 // default constructor
ansond 15:e44d75d95b38 39 MQTTTransport::MQTTTransport(ErrorHandler *error_handler,void *endpoint,MBEDToIOCResourceMap *map) : Transport(error_handler,endpoint) {
ansond 0:ae2a45502448 40 this->m_mqtt = NULL;
ansond 15:e44d75d95b38 41 _mqtt_instance = this;
ansond 15:e44d75d95b38 42 this->m_map = map;
ansond 8:45f9a920e82c 43 this->initTopic();
ansond 0:ae2a45502448 44 }
ansond 0:ae2a45502448 45
ansond 0:ae2a45502448 46 // default destructor
ansond 0:ae2a45502448 47 MQTTTransport::~MQTTTransport() {
ansond 0:ae2a45502448 48 this->disconnect();
ansond 0:ae2a45502448 49 }
ansond 0:ae2a45502448 50
ansond 8:45f9a920e82c 51 // init our topic
ansond 8:45f9a920e82c 52 void MQTTTransport::initTopic() {
ansond 8:45f9a920e82c 53 MBEDEndpoint *endpoint = (MBEDEndpoint *)this->getEndpoint();
ansond 8:45f9a920e82c 54 char *endpoint_name = endpoint->getEndpointName();
ansond 8:45f9a920e82c 55 memset(this->m_topic,0,MQTT_IOC_TOPIC_LEN+1);
ansond 8:45f9a920e82c 56 sprintf(this->m_topic,MQTT_IOC_TOPIC,endpoint_name);
ansond 8:45f9a920e82c 57 }
ansond 8:45f9a920e82c 58
ansond 8:45f9a920e82c 59 // get our topic
ansond 8:45f9a920e82c 60 char *MQTTTransport::getTopic() { return this->m_topic; }
ansond 8:45f9a920e82c 61
ansond 15:e44d75d95b38 62 // get the IOC <--> MBED resource map
ansond 15:e44d75d95b38 63 MBEDToIOCResourceMap *MQTTTransport::getMap() { return this->m_map; }
ansond 15:e44d75d95b38 64
ansond 6:34c07e145caa 65 // pull the endpoint name from the MQTT topic
ansond 6:34c07e145caa 66 char *MQTTTransport::getEndpointNameFromTopic(char *topic) {
ansond 48:d3663434128d 67 if (topic != NULL) {
ansond 48:d3663434128d 68 memset(this->m_endpoint_name,0,LIGHT_NAME_LEN+1);
ansond 69:090e16acccb7 69 char trash[MQTT_IOC_TOPIC_LEN+1];
ansond 69:090e16acccb7 70 char ep[MQTT_IOC_TOPIC_LEN+1];
ansond 69:090e16acccb7 71 memset(trash,0,MQTT_IOC_TOPIC_LEN+1);
ansond 69:090e16acccb7 72 memset(ep,0,MQTT_IOC_TOPIC_LEN+1);
ansond 69:090e16acccb7 73 bool done = false;
ansond 69:090e16acccb7 74 int length = 0; if (topic != NULL) length = strlen(topic);
ansond 69:090e16acccb7 75 for(int i=length-1;i>=0 && !done;--i) if (topic[i] == '/') { topic[i] = ' ' ; done = true; }
ansond 69:090e16acccb7 76 sscanf(topic,"%s%s",trash,ep);
ansond 69:090e16acccb7 77 if (strlen(ep) > 0) {
ansond 69:090e16acccb7 78 if (strcmp(ep,MQTT_IOC_ALL_ENDPOINT) != 0) {
ansond 69:090e16acccb7 79 // just insert the name and let the parser determine if its for us or not...
ansond 69:090e16acccb7 80 strncpy(this->m_endpoint_name,ep,strlen(ep));
ansond 69:090e16acccb7 81 }
ansond 69:090e16acccb7 82 else {
ansond 69:090e16acccb7 83 // this is a broadcast message - so we need to process it
ansond 69:090e16acccb7 84 MBEDEndpoint *endpoint = (MBEDEndpoint *)this->getEndpoint();
ansond 69:090e16acccb7 85 char *endpoint_name = endpoint->getEndpointName();
ansond 69:090e16acccb7 86 strcpy(this->m_endpoint_name,endpoint_name);
ansond 69:090e16acccb7 87 }
ansond 48:d3663434128d 88 }
ansond 89:6e7dd4cba216 89 //this->logger()->log("MQTT Topic (discovered): %s Original: %s",this->m_endpoint_name,topic);
ansond 48:d3663434128d 90 return this->m_endpoint_name;
ansond 48:d3663434128d 91 }
ansond 89:6e7dd4cba216 92 //this->logger()->log("MQTT Topic (discovered): NULL Original: %s",topic);
ansond 48:d3663434128d 93 return NULL;
ansond 6:34c07e145caa 94 }
ansond 6:34c07e145caa 95
ansond 0:ae2a45502448 96 // process a MQTT Message
ansond 69:090e16acccb7 97 void MQTTTransport::processMessage(char *message_name,char *payload, unsigned int payload_length) {
ansond 69:090e16acccb7 98 char message_type[MQTT_PAYLOAD_SEGMENT_LEN+1];
ansond 69:090e16acccb7 99 char message_verb[MQTT_PAYLOAD_SEGMENT_LEN+1];
ansond 69:090e16acccb7 100 char message_value[MQTT_PAYLOAD_SEGMENT_LEN+1];
ansond 69:090e16acccb7 101 char message_opt[MQTT_PAYLOAD_SEGMENT_LEN+1];
ansond 69:090e16acccb7 102
ansond 69:090e16acccb7 103 // initialize
ansond 69:090e16acccb7 104 memset(message_type,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
ansond 69:090e16acccb7 105 memset(message_verb,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
ansond 69:090e16acccb7 106 memset(message_value,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
ansond 69:090e16acccb7 107 memset(message_opt,0,MQTT_PAYLOAD_SEGMENT_LEN+1);
ansond 23:793b2898522e 108
ansond 6:34c07e145caa 109 // get our endpoint
ansond 0:ae2a45502448 110 MBEDEndpoint *endpoint = (MBEDEndpoint *)this->getEndpoint();
ansond 7:f570eb3f38cd 111 char *endpoint_name = endpoint->getEndpointName();
ansond 6:34c07e145caa 112
ansond 0:ae2a45502448 113 // DEBUG
ansond 8:45f9a920e82c 114 //this->logger()->log("Endpoint:[%s] Target: [%s]",endpoint_name,message_name);
ansond 7:f570eb3f38cd 115
ansond 3:3db076b9d380 116 // only respond if its for our node
ansond 8:45f9a920e82c 117 if (strcmp(endpoint_name,message_name) == 0) {
ansond 69:090e16acccb7 118 // format of the MQTT message: message_type:verb|Parameter_X:value|keyword:optional_data
ansond 69:090e16acccb7 119 char buffer[MAX_MQTT_MESSAGE_LENGTH+1];
ansond 69:090e16acccb7 120 memset(buffer,0,MAX_MQTT_MESSAGE_LENGTH+1);
ansond 69:090e16acccb7 121 memcpy(buffer,payload,payload_length);
ansond 69:090e16acccb7 122 int count = 0; for(int i=0;i<payload_length;++i) if (payload[i] == ':') ++count;
ansond 72:ffd155ec8b93 123 for(int i=0;i<payload_length;++i) {
ansond 72:ffd155ec8b93 124 if (buffer[i] == ':') {
ansond 72:ffd155ec8b93 125 if (i < (payload_length-1)) buffer[i] = ' ';
ansond 72:ffd155ec8b93 126 else buffer[i] = '\0';
ansond 72:ffd155ec8b93 127 }
ansond 72:ffd155ec8b93 128 }
ansond 69:090e16acccb7 129 if (count == 1) sscanf(buffer,"%s %s",message_type,message_verb);
ansond 70:144f578e4470 130 if (count == 2) sscanf(buffer,"%s %s %s",message_type,message_verb,message_value);
ansond 71:221500a073df 131 if (count == 3) sscanf(buffer,"%s %s %s %s",message_type,message_verb,message_value,message_opt);
ansond 69:090e16acccb7 132
ansond 7:f570eb3f38cd 133 // DEBUG
ansond 72:ffd155ec8b93 134 //this->logger()->log("Raw Payload: %s, length: %d",payload,payload_length);
ansond 72:ffd155ec8b93 135 //this->logger()->log("Buffer: %s, length: %d",buffer,strlen(buffer));
ansond 72:ffd155ec8b93 136 //this->logger()->log("Parsed Payload: Type: [%s] Name: [%s] Verb: [%s] Value: [%s]",message_type,message_name,message_verb,message_value);
ansond 8:45f9a920e82c 137
ansond 3:3db076b9d380 138 // load endpoints
ansond 15:e44d75d95b38 139 if (message_type != NULL && strcmp(message_type,IOC_ENDPOINT_VERB) == 0) { // Endpoint
ansond 15:e44d75d95b38 140 if (message_verb != NULL && strcmp(message_verb,IOC_REQUEST_LOAD_ALL_VERB) == 0) { // load
ansond 15:e44d75d95b38 141 if (message_value != NULL && strcmp(message_value,IOC_ENDPOINT_ALL_VERB) == 0) { // all
ansond 15:e44d75d95b38 142 // load up our endpoints
ansond 15:e44d75d95b38 143 endpoint->loadEndpoints();
ansond 0:ae2a45502448 144 }
ansond 0:ae2a45502448 145 }
ansond 15:e44d75d95b38 146
ansond 15:e44d75d95b38 147 else if (message_verb != NULL && strcmp(message_verb,IOC_REQUEST_UPDATE_ALL_VERB) == 0) { // update
ansond 15:e44d75d95b38 148 if (message_value != NULL && strcmp(message_value,IOC_ENDPOINT_ALL_VERB) == 0) { // all
ansond 15:e44d75d95b38 149 // update our endpoints
ansond 23:793b2898522e 150 endpoint->updateEndpoints();
ansond 15:e44d75d95b38 151 }
ansond 15:e44d75d95b38 152 else {
ansond 15:e44d75d95b38 153 // update just our endpoint
ansond 15:e44d75d95b38 154 int index = -1;
ansond 15:e44d75d95b38 155 if (message_name != NULL) {
ansond 15:e44d75d95b38 156 index = endpoint->indexOfLight((char *)message_name);
ansond 15:e44d75d95b38 157 if (index >= 0) {
ansond 15:e44d75d95b38 158 if (message_verb != NULL && strcmp(message_verb,IOC_REQUEST_UPDATE_ALL_VERB) == 0) {
ansond 15:e44d75d95b38 159 // update our endpoint
ansond 23:793b2898522e 160 endpoint->updateEndpoints(index);
ansond 15:e44d75d95b38 161 }
ansond 3:3db076b9d380 162 }
ansond 3:3db076b9d380 163 }
ansond 3:3db076b9d380 164 }
ansond 3:3db076b9d380 165 }
ansond 0:ae2a45502448 166 }
ansond 3:3db076b9d380 167
ansond 3:3db076b9d380 168 // change a resource value
ansond 13:25448d92c205 169 if (message_type != NULL && strcmp(message_type,IOC_CHANGE_VERB) == 0) {
ansond 8:45f9a920e82c 170 if (message_name != NULL) {
ansond 3:3db076b9d380 171 // destined for our lights?
ansond 3:3db076b9d380 172 int index = endpoint->indexOfLight((char *)message_name);
ansond 3:3db076b9d380 173 if (index >= 0) {
ansond 3:3db076b9d380 174 if (message_verb != NULL) {
ansond 3:3db076b9d380 175 // map the parameter to one of ours
ansond 14:0a6497a380a4 176 char *mapped_resource = this->mapIOCResourceToEndpointResource((char *)message_verb);
ansond 3:3db076b9d380 177 if (mapped_resource != NULL) {
ansond 3:3db076b9d380 178 if (message_value != NULL) {
ansond 8:45f9a920e82c 179 EmulatedResourceFactory *factory = (EmulatedResourceFactory *)endpoint->getResources(index);
ansond 8:45f9a920e82c 180 bool success = factory->setResourceValue(mapped_resource,message_value);
ansond 8:45f9a920e82c 181
ansond 8:45f9a920e82c 182 // end the resource value back over MQTT
ansond 8:45f9a920e82c 183 this->sendResult(message_name,message_verb,message_value,success);
ansond 3:3db076b9d380 184 }
ansond 3:3db076b9d380 185 }
ansond 3:3db076b9d380 186 }
ansond 3:3db076b9d380 187 }
ansond 3:3db076b9d380 188 }
ansond 3:3db076b9d380 189 }
ansond 3:3db076b9d380 190
ansond 3:3db076b9d380 191 // get a resource value
ansond 13:25448d92c205 192 if (message_type != NULL && strcmp(message_type,IOC_REQUEST_VALUE_VERB) == 0) {
ansond 3:3db076b9d380 193 if (message_name != NULL) {
ansond 3:3db076b9d380 194 // destined for our lights?
ansond 3:3db076b9d380 195 int index = endpoint->indexOfLight((char *)message_name);
ansond 3:3db076b9d380 196 if (index >= 0) {
ansond 3:3db076b9d380 197 if (message_verb != NULL) {
ansond 3:3db076b9d380 198 // map the parameter to one of ours
ansond 13:25448d92c205 199 char *mapped_resource = this->mapIOCResourceToEndpointResource((char *)message_verb);
ansond 3:3db076b9d380 200 if (mapped_resource != NULL) {
ansond 8:45f9a920e82c 201 EmulatedResourceFactory *factory = (EmulatedResourceFactory *)endpoint->getResources(index);
ansond 69:090e16acccb7 202 strcpy(message_value,factory->getResourceValue((char *)mapped_resource));
ansond 8:45f9a920e82c 203 bool success = false; if (message_value != NULL) success = true;
ansond 8:45f9a920e82c 204
ansond 8:45f9a920e82c 205 // log resource get
ansond 8:45f9a920e82c 206 if (success) this->logger()->log("Resource: %s (%s) Value: %s",message_verb,mapped_resource,message_value);
ansond 3:3db076b9d380 207
ansond 3:3db076b9d380 208 // end the resource value back over MQTT
ansond 8:45f9a920e82c 209 this->sendResult(message_name,message_verb,message_value,success);
ansond 3:3db076b9d380 210 }
ansond 3:3db076b9d380 211 }
ansond 3:3db076b9d380 212 }
ansond 0:ae2a45502448 213 }
ansond 0:ae2a45502448 214 }
ansond 0:ae2a45502448 215 }
ansond 3:3db076b9d380 216 else {
ansond 3:3db076b9d380 217 // message not bound for our node
ansond 3:3db076b9d380 218 this->logger()->log("MQTT Message: %s not for us: %s... ignoring...",payload,endpoint_name);
ansond 7:f570eb3f38cd 219 }
ansond 0:ae2a45502448 220 }
ansond 0:ae2a45502448 221
ansond 8:45f9a920e82c 222 // send result back to MQTT
ansond 8:45f9a920e82c 223 void MQTTTransport::sendResult(char *endpoint_name,char *resource_name,char *value,bool success) {
ansond 8:45f9a920e82c 224 if (this->m_connected == true) {
ansond 8:45f9a920e82c 225 // send the response back to MQTT
ansond 8:45f9a920e82c 226 this->logger()->log("Sending Response back to MQTT...");
ansond 8:45f9a920e82c 227 char message[MAX_MQTT_MESSAGE_LENGTH+1];
ansond 8:45f9a920e82c 228 memset(message,0,MAX_MQTT_MESSAGE_LENGTH+1);
ansond 13:25448d92c205 229 char *str_success = IOC_RESPONSE_OK; if (!success) str_success = IOC_RESPONSE_FAILED;
ansond 13:25448d92c205 230 sprintf(message,IOC_RESPONSE_TEMPLATE,IOC_RESPONSE_VERB,endpoint_name,resource_name,value,str_success);
ansond 8:45f9a920e82c 231 bool sent = this->m_mqtt->publish(this->getTopic(),message,strlen(message));
ansond 8:45f9a920e82c 232 if (sent) {
ansond 8:45f9a920e82c 233 this->logger()->log("Result sent successfully");
ansond 36:210f3956038c 234 this->logger()->blinkTransportTxLED();
ansond 8:45f9a920e82c 235 }
ansond 8:45f9a920e82c 236 else {
ansond 8:45f9a920e82c 237 this->logger()->log("Result send FAILED");
ansond 8:45f9a920e82c 238 }
ansond 8:45f9a920e82c 239 }
ansond 8:45f9a920e82c 240 else {
ansond 8:45f9a920e82c 241 // unable to send the response
ansond 8:45f9a920e82c 242 this->logger()->log("Unable to send response back to MQTT. Not connected.");
ansond 8:45f9a920e82c 243 }
ansond 0:ae2a45502448 244 }
ansond 0:ae2a45502448 245
ansond 15:e44d75d95b38 246 char *MQTTTransport::mapIOCResourceToEndpointResource(char *ioc_name) { return this->getMap()->iocNameToEndpointName(ioc_name); }
ansond 0:ae2a45502448 247
ansond 0:ae2a45502448 248 char *MQTTTransport::makeID(char *id_template,char *buffer) {
ansond 0:ae2a45502448 249 srand(time(0));
ansond 0:ae2a45502448 250 srand(rand());
ansond 0:ae2a45502448 251 sprintf(buffer,id_template,rand()%MQTT_MAXID_VALUE);
ansond 0:ae2a45502448 252 return buffer;
ansond 0:ae2a45502448 253 }
ansond 0:ae2a45502448 254
ansond 0:ae2a45502448 255 // connect up MQTT
ansond 0:ae2a45502448 256 bool MQTTTransport::connect() {
ansond 0:ae2a45502448 257 char mqtt_id[MQTT_ENDPOINT_IDLEN+1];
ansond 0:ae2a45502448 258 memset(mqtt_id,0,(MQTT_ENDPOINT_IDLEN+1));
ansond 0:ae2a45502448 259 if (this->m_connected == false) {
ansond 0:ae2a45502448 260 this->logger()->log("MQTT Init: %s:%d...",MQTT_HOSTNAME,MQTT_HOSTPORT);
ansond 0:ae2a45502448 261 this->m_mqtt = &_mqtt;
ansond 0:ae2a45502448 262 if (this->m_mqtt != NULL) {
ansond 0:ae2a45502448 263 char *id = this->makeID(MQTT_ENDPOINT_ID,mqtt_id);
ansond 0:ae2a45502448 264 this->logger()->log("MQTT Connect: ID: %s...",id);
ansond 0:ae2a45502448 265 if (this->m_mqtt->connect(id)) {
ansond 8:45f9a920e82c 266 this->logger()->log("MQTT Subscribe: Topic: %s...",this->getTopic());
ansond 8:45f9a920e82c 267 if (this->m_mqtt->subscribe(this->getTopic())) {
ansond 22:f1002e5993c5 268 if (this->m_mqtt->subscribe(MQTT_IOC_ANNOUNCE_TOPIC)) {
ansond 22:f1002e5993c5 269 this->logger()->log("MQTT CONNECTED.");
ansond 22:f1002e5993c5 270 this->m_connected = true;
ansond 22:f1002e5993c5 271 }
ansond 22:f1002e5993c5 272 else {
ansond 22:f1002e5993c5 273 this->logger()->log("MQTT Subscribe: Topic(ANNOUNCE): %s FAILED",this->getTopic());
ansond 22:f1002e5993c5 274 this->logger()->turnLEDRed();
ansond 22:f1002e5993c5 275 this->m_connected = false;
ansond 22:f1002e5993c5 276 }
ansond 0:ae2a45502448 277 }
ansond 0:ae2a45502448 278 else {
ansond 8:45f9a920e82c 279 this->logger()->log("MQTT Subscribe: Topic: %s FAILED",this->getTopic());
ansond 0:ae2a45502448 280 this->logger()->turnLEDRed();
ansond 7:f570eb3f38cd 281 this->m_connected = false;
ansond 0:ae2a45502448 282 }
ansond 0:ae2a45502448 283 }
ansond 0:ae2a45502448 284 else {
ansond 0:ae2a45502448 285 this->logger()->log("MQTT Connect: ID: %s FAILED",id);
ansond 0:ae2a45502448 286 this->logger()->turnLEDRed();
ansond 7:f570eb3f38cd 287 this->m_connected = false;
ansond 0:ae2a45502448 288 }
ansond 0:ae2a45502448 289 }
ansond 0:ae2a45502448 290 else {
ansond 0:ae2a45502448 291 this->logger()->log("MQTT Unable to allocate new instance");
ansond 0:ae2a45502448 292 this->logger()->turnLEDRed();
ansond 7:f570eb3f38cd 293 this->m_connected = false;
ansond 0:ae2a45502448 294 }
ansond 0:ae2a45502448 295 }
ansond 0:ae2a45502448 296 else {
ansond 0:ae2a45502448 297 this->logger()->log("MQTT already connected (OK)");
ansond 0:ae2a45502448 298 }
ansond 0:ae2a45502448 299 return this->m_connected;
ansond 0:ae2a45502448 300 }
ansond 0:ae2a45502448 301
ansond 0:ae2a45502448 302 // disconnect from MQTT
ansond 0:ae2a45502448 303 bool MQTTTransport::disconnect() {
ansond 0:ae2a45502448 304 if (this->m_mqtt != NULL) {
ansond 8:45f9a920e82c 305 this->logger()->log("MQTT Unsubscribing from: %s...",this->getTopic());
ansond 8:45f9a920e82c 306 this->m_mqtt->unsubscribe(this->getTopic());
ansond 22:f1002e5993c5 307 this->m_mqtt->unsubscribe(MQTT_IOC_ANNOUNCE_TOPIC);
ansond 0:ae2a45502448 308 this->logger()->log("MQTT Disconnecting...");
ansond 0:ae2a45502448 309 this->m_mqtt->disconnect();
ansond 0:ae2a45502448 310 }
ansond 0:ae2a45502448 311 else {
ansond 0:ae2a45502448 312 this->logger()->log("MQTT already disconnected (OK)");
ansond 0:ae2a45502448 313 }
ansond 0:ae2a45502448 314 this->m_connected = false;
ansond 0:ae2a45502448 315 return true;
ansond 0:ae2a45502448 316 }
ansond 0:ae2a45502448 317
ansond 0:ae2a45502448 318 // check transport and process stuff
ansond 0:ae2a45502448 319 void MQTTTransport::checkAndProcess() {
ansond 0:ae2a45502448 320 if (this->m_mqtt != NULL && this->m_connected == true) {
ansond 0:ae2a45502448 321 this->m_mqtt->loop();
ansond 36:210f3956038c 322 this->logger()->blinkTransportRxLED();
ansond 0:ae2a45502448 323 }
ansond 0:ae2a45502448 324 }