Had to fork with a different name, because of some incompatibility issues.

Dependencies:   MQTT

Committer:
lamell
Date:
Sat Mar 21 15:36:30 2020 -0400
Revision:
25:f4727705353b
Parent:
23:1523bdaba8c8
Child:
27:3806829a0247
Fixed some connectivity issues. Problem turned out to be the laptop sharing internet connections.
The system works well.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sathipal 0:f86732d81998 1 /*******************************************************************************
sathipal 0:f86732d81998 2 * Copyright (c) 2015 IBM Corp.
sathipal 0:f86732d81998 3 *
sathipal 0:f86732d81998 4 * All rights reserved. This program and the accompanying materials
sathipal 0:f86732d81998 5 * are made available under the terms of the Eclipse Public License v1.0
sathipal 0:f86732d81998 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
sathipal 0:f86732d81998 7 *
sathipal 0:f86732d81998 8 * The Eclipse Public License is available at
sathipal 0:f86732d81998 9 * http://www.eclipse.org/legal/epl-v10.html
sathipal 0:f86732d81998 10 * and the Eclipse Distribution License is available at
sathipal 0:f86732d81998 11 * http://www.eclipse.org/org/documents/edl-v10.php.
sathipal 0:f86732d81998 12 *
sathipal 0:f86732d81998 13 * Contributors:
sathipal 0:f86732d81998 14 * Sathisumar Palaniappan - initial implementation
sathipal 3:3d91bf839b49 15 * Sathisumar Palaniappan - added reconnect logic and isConnected() method
lokeshhk 5:ea9f483e0294 16 * Lokesh K Haralakatta - Port to mbed OS 5 support
lokeshhk 5:ea9f483e0294 17 * Lokesh K Haralakatta - Added SSL/TLS Support
sathipal 0:f86732d81998 18 *******************************************************************************/
sathipal 0:f86732d81998 19 #include "MQTTClient.h"
sathipal 0:f86732d81998 20 #include "DeviceClient.h"
sathipal 0:f86732d81998 21
sathipal 3:3d91bf839b49 22 // need a wrapper since K64F and LPC1768 wont have the same name for mii read methods
lamell 12:ac091f717e40 23 #if defined(TARGET_UBLOX_C027) || defined(TARGET_K64F) || defined(TARGET_DISCO_F746NG)
sathipal 3:3d91bf839b49 24
sathipal 3:3d91bf839b49 25 static uint32_t linkStatus(void)
sathipal 3:3d91bf839b49 26 {
sathipal 3:3d91bf839b49 27 return (1);
sathipal 3:3d91bf839b49 28 }
sathipal 3:3d91bf839b49 29 #elif defined(TARGET_LPC1768)
sathipal 3:3d91bf839b49 30 #include "lpc_phy.h"
sathipal 3:3d91bf839b49 31
sathipal 3:3d91bf839b49 32 static uint32_t linkStatus(void)
sathipal 3:3d91bf839b49 33 {
sathipal 3:3d91bf839b49 34 return (lpc_mii_read_data() & 1);
sathipal 3:3d91bf839b49 35 }
sathipal 3:3d91bf839b49 36 #endif
lamell 12:ac091f717e40 37
sathipal 0:f86732d81998 38 using namespace IoTF;
sathipal 0:f86732d81998 39
sathipal 0:f86732d81998 40 CommandHandler handler = NULL;
sathipal 0:f86732d81998 41 void msgArrived(MQTT::MessageData& md);
sathipal 0:f86732d81998 42
sathipal 0:f86732d81998 43 /**
sathipal 0:f86732d81998 44 * A client, used by device, that handles connections with the IBM Internet of Things Foundation.
sathipal 0:f86732d81998 45 * This class allows device to publish events and receive commands to/from IBM IoT Foundation wtih simple function calls.
sathipal 0:f86732d81998 46 */
sathipal 2:199ddea804cd 47 DeviceClient::DeviceClient():org(NULL),deviceType(NULL),deviceId(NULL),
lokeshhk 5:ea9f483e0294 48 authMethod(NULL),authToken(NULL),mqttNetwork(NULL),mqttClient(NULL),connected(false),port(0)
sathipal 2:199ddea804cd 49 {
lokeshhk 5:ea9f483e0294 50 LOG("Constructor#1 called::\r\n");
sathipal 0:f86732d81998 51 }
sathipal 0:f86732d81998 52
lokeshhk 5:ea9f483e0294 53 DeviceClient::DeviceClient(char *orgId, char *typeId, char *id, int port):org(orgId),deviceType(typeId),
lokeshhk 5:ea9f483e0294 54 deviceId(id),authMethod(NULL),authToken(NULL),connected(false), port(port)
sathipal 2:199ddea804cd 55 {
lokeshhk 5:ea9f483e0294 56 LOG("Constructor#2 called:: org=%s, type=%s, id=%s\r\n", (org==NULL)?"NULL":org,
sathipal 0:f86732d81998 57 (deviceType==NULL)?"NULL":deviceType, (deviceId==NULL)?"NULL":deviceId);
lamell 25:f4727705353b 58
sathipal 0:f86732d81998 59 if(strcmp(this->org, QUICKSTART) != 0) {
lokeshhk 5:ea9f483e0294 60 WARN("Registered flow must provide valid token\r\n");
sathipal 0:f86732d81998 61 }
lokeshhk 5:ea9f483e0294 62
lokeshhk 5:ea9f483e0294 63 mqttNetwork = new MQTTNetwork();
lokeshhk 5:ea9f483e0294 64 mqttClient = new MQTT::Client<MQTTNetwork, Countdown>(*mqttNetwork);
lokeshhk 5:ea9f483e0294 65
sathipal 0:f86732d81998 66 }
sathipal 0:f86732d81998 67
lokeshhk 5:ea9f483e0294 68 DeviceClient::DeviceClient(char *orgId, char *typeId,char *id, char *method, char *token, int port):org(orgId),
lokeshhk 5:ea9f483e0294 69 deviceType(typeId),deviceId(id),authMethod(method),authToken(token),connected(false), port(port)
sathipal 2:199ddea804cd 70 {
sathipal 0:f86732d81998 71 // Don't print token for security reasons
lokeshhk 5:ea9f483e0294 72 LOG("Constructor#3 called:: org=%s, type=%s, id=%s\r\n", (org==NULL)?"NULL":org,
sathipal 0:f86732d81998 73 (deviceType==NULL)?"NULL":deviceType, (deviceId==NULL)?"NULL":deviceId);
lamell 25:f4727705353b 74
lokeshhk 5:ea9f483e0294 75 mqttNetwork = new MQTTNetwork();
lokeshhk 5:ea9f483e0294 76 mqttClient = new MQTT::Client<MQTTNetwork, Countdown>(*mqttNetwork);
sathipal 0:f86732d81998 77 }
sathipal 0:f86732d81998 78
sathipal 0:f86732d81998 79 /**
sathipal 0:f86732d81998 80 * Connect to the IBM Internet of Things Foundation
lokeshhk 5:ea9f483e0294 81 */
sathipal 0:f86732d81998 82 bool DeviceClient::connect()
lokeshhk 5:ea9f483e0294 83 {
sathipal 0:f86732d81998 84 char *organizationName, *typeId, *id;
lokeshhk 5:ea9f483e0294 85 bool rc = false;
sathipal 0:f86732d81998 86 // Check if any organization is set
lokeshhk 5:ea9f483e0294 87 if(this->org == NULL || (strcmp("", this->org) == 0))
sathipal 3:3d91bf839b49 88 {
lamell 18:ce12e2072cbb 89 organizationName = (char*)QUICKSTART;
sathipal 0:f86732d81998 90 } else {
sathipal 0:f86732d81998 91 organizationName = this->org;
sathipal 0:f86732d81998 92 }
lokeshhk 5:ea9f483e0294 93
sathipal 0:f86732d81998 94 // Check if device type is already mentioned
lokeshhk 5:ea9f483e0294 95 if(this->deviceType == NULL || (strcmp("", this->deviceType) == 0))
sathipal 3:3d91bf839b49 96 {
lamell 18:ce12e2072cbb 97 typeId = (char*)"iotsample-mbed";
sathipal 0:f86732d81998 98 } else {
sathipal 0:f86732d81998 99 typeId = this->deviceType;
sathipal 0:f86732d81998 100 }
lokeshhk 5:ea9f483e0294 101
sathipal 0:f86732d81998 102 char hostname[strlen(organizationName) + strlen(IBM_IOT_MESSAGING) + 1];
sathipal 0:f86732d81998 103 sprintf(hostname, "%s%s", organizationName, IBM_IOT_MESSAGING);
lokeshhk 5:ea9f483e0294 104
lamell 18:ce12e2072cbb 105 //NetworkInterface* net = mqttNetwork->getEth();
lamell 25:f4727705353b 106 NetworkInterface* net = mqttNetwork->network;
lamell 25:f4727705353b 107 //EthernetInterface net = mqttNetwork->network;
lamell 18:ce12e2072cbb 108
lokeshhk 5:ea9f483e0294 109 const char* ip = net->get_ip_address();
sathipal 0:f86732d81998 110
sathipal 0:f86732d81998 111 // Get devices MAC address if deviceId is not set already
lokeshhk 5:ea9f483e0294 112 if(this->deviceId == NULL || (strcmp("", this->deviceId) == 0))
sathipal 3:3d91bf839b49 113 {
sathipal 0:f86732d81998 114 char tmpBuf[50];
sathipal 0:f86732d81998 115 id = getMac(tmpBuf, sizeof(tmpBuf));
sathipal 0:f86732d81998 116 } else {
sathipal 0:f86732d81998 117 id = this->deviceId;
sathipal 0:f86732d81998 118 }
lokeshhk 5:ea9f483e0294 119
sathipal 0:f86732d81998 120 // Construct clientId - d:org:type:id
sathipal 0:f86732d81998 121 char clientId[strlen(organizationName) + strlen(typeId) + strlen(id) + 5];
sathipal 0:f86732d81998 122 sprintf(clientId, "d:%s:%s:%s", organizationName, typeId, id);
lokeshhk 5:ea9f483e0294 123
sathipal 0:f86732d81998 124 // Initialize MQTT Connect
sathipal 0:f86732d81998 125 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
sathipal 0:f86732d81998 126 data.MQTTVersion = 4;
sathipal 0:f86732d81998 127 data.clientID.cstring = clientId;
lokeshhk 5:ea9f483e0294 128
sathipal 0:f86732d81998 129 int quickstartMode = (strcmp(organizationName, QUICKSTART) == 0);
lokeshhk 5:ea9f483e0294 130
lokeshhk 5:ea9f483e0294 131 if (!quickstartMode)
lokeshhk 5:ea9f483e0294 132 {
lamell 18:ce12e2072cbb 133 data.username.cstring = (char*)"use-token-auth";
sathipal 0:f86732d81998 134 data.password.cstring = this->authToken;
lokeshhk 5:ea9f483e0294 135
lokeshhk 5:ea9f483e0294 136 //Check and initialize appropriate port
lokeshhk 5:ea9f483e0294 137 if(port == 1883)
lokeshhk 5:ea9f483e0294 138 port = MQTT_TLS_PORT;
sathipal 0:f86732d81998 139 }
lokeshhk 5:ea9f483e0294 140
lokeshhk 5:ea9f483e0294 141 logData(net, hostname, clientId);
lokeshhk 5:ea9f483e0294 142
lamell 25:f4727705353b 143 SocketAddress addr;
lamell 25:f4727705353b 144 mqttNetwork->network->gethostbyname("www.google.com", &addr);
lamell 25:f4727705353b 145
lamell 25:f4727705353b 146 LOG("%d: %s\r\n",mqttNetwork->network->set_dhcp(true),
lamell 25:f4727705353b 147 addr.get_ip_address());
lamell 25:f4727705353b 148
lokeshhk 5:ea9f483e0294 149 if(ip){
lokeshhk 5:ea9f483e0294 150 rc = tryConnect(hostname, data);
lokeshhk 5:ea9f483e0294 151 // By default subscribe to commands if we are in registered flow
lokeshhk 5:ea9f483e0294 152 if(rc == true && !quickstartMode)
lokeshhk 5:ea9f483e0294 153 {
lokeshhk 5:ea9f483e0294 154 subscribeToCommands();
lokeshhk 5:ea9f483e0294 155 }
lokeshhk 5:ea9f483e0294 156 if(rc == true)
lokeshhk 5:ea9f483e0294 157 {
lokeshhk 5:ea9f483e0294 158 connected = true;
lamell 25:f4727705353b 159 LOG("Device Client Connected to %s:%d\r\n",hostname,port);
lokeshhk 5:ea9f483e0294 160 }
sathipal 3:3d91bf839b49 161 }
lokeshhk 5:ea9f483e0294 162 else
lokeshhk 5:ea9f483e0294 163 LOG("No IP Assigned to Network Interface...\r\n");
lamell 25:f4727705353b 164
sathipal 0:f86732d81998 165 return rc;
sathipal 0:f86732d81998 166 }
sathipal 0:f86732d81998 167
sathipal 3:3d91bf839b49 168 /**
sathipal 3:3d91bf839b49 169 * Reconnect when the connection is lost. This method disconnects the active connection if any
lokeshhk 5:ea9f483e0294 170 * and tries to initiate a fresh connection.
sathipal 3:3d91bf839b49 171 * This method uses the Ethernet Link status wherever applicable while reconnecting. i.e, tries to
sathipal 3:3d91bf839b49 172 * initiate the connection only when the Ethernet cable is plugged in.
sathipal 3:3d91bf839b49 173 */
lokeshhk 5:ea9f483e0294 174 bool DeviceClient::reConnect()
sathipal 3:3d91bf839b49 175 {
lokeshhk 5:ea9f483e0294 176 LOG("DeviceClient::reConnect() entry and connected = %s\r\n",(connected == true)?"true":"false");
sathipal 3:3d91bf839b49 177 if(connected == true)
sathipal 3:3d91bf839b49 178 {
sathipal 3:3d91bf839b49 179 disconnect();
sathipal 3:3d91bf839b49 180 }
sathipal 3:3d91bf839b49 181
sathipal 3:3d91bf839b49 182 if(linkStatus())
sathipal 3:3d91bf839b49 183 {
lamell 18:ce12e2072cbb 184 //NetworkInterface* net = mqttNetwork->getEth();
lamell 25:f4727705353b 185 NetworkInterface* net = mqttNetwork->network;
lamell 25:f4727705353b 186 //EthernetInterface net = mqttNetwork->network;
lamell 25:f4727705353b 187
lokeshhk 5:ea9f483e0294 188 if(net->connect() == 0)
sathipal 3:3d91bf839b49 189 {
sathipal 3:3d91bf839b49 190 bool status = connect();
lokeshhk 5:ea9f483e0294 191 if(status == false)
sathipal 3:3d91bf839b49 192 {
lokeshhk 5:ea9f483e0294 193 net->disconnect();
sathipal 3:3d91bf839b49 194 }
sathipal 3:3d91bf839b49 195 return status;
sathipal 3:3d91bf839b49 196 }
sathipal 3:3d91bf839b49 197 }
sathipal 3:3d91bf839b49 198 return false;
sathipal 3:3d91bf839b49 199 }
sathipal 3:3d91bf839b49 200
lokeshhk 5:ea9f483e0294 201 bool DeviceClient::tryConnect(char *hostname, MQTTPacket_connectData &data)
sathipal 2:199ddea804cd 202 {
sathipal 0:f86732d81998 203 int rc = -1;
sathipal 0:f86732d81998 204 int retryAttempt = 0;
lokeshhk 5:ea9f483e0294 205 do {
lamell 25:f4727705353b 206 LOG("%d\r\n",rc = mqttNetwork->connect(hostname, port));
lokeshhk 5:ea9f483e0294 207 if (rc != 0)
sathipal 3:3d91bf839b49 208 {
lokeshhk 5:ea9f483e0294 209 WARN("mqttNetwork connect returned: %d\r\n", rc);
sathipal 0:f86732d81998 210 }
sathipal 0:f86732d81998 211
lokeshhk 5:ea9f483e0294 212 // MQTT connect
lamell 25:f4727705353b 213 LOG("%d\r\n",rc = mqttClient->connect(data));
lamell 25:f4727705353b 214 if (rc == 0 && (rc) != 0)
sathipal 3:3d91bf839b49 215 {
lokeshhk 5:ea9f483e0294 216 WARN("MQTT connect returned %d\r\n", rc);
sathipal 0:f86732d81998 217 if (rc == MQTT_NOT_AUTHORIZED || rc == MQTT_BAD_USERNAME_OR_PASSWORD)
sathipal 0:f86732d81998 218 return false; // don't reattempt to connect if credentials are wrong
sathipal 0:f86732d81998 219 } else if (rc == MQTT_CONNECTION_ACCEPTED) {
sathipal 0:f86732d81998 220 return true;
sathipal 0:f86732d81998 221 }
lokeshhk 5:ea9f483e0294 222
sathipal 0:f86732d81998 223 int timeout = getConnTimeout(++retryAttempt);
lokeshhk 5:ea9f483e0294 224
lokeshhk 5:ea9f483e0294 225 WARN("Retry attempt number %d waiting %d\r\n", retryAttempt, timeout);
lokeshhk 5:ea9f483e0294 226
sathipal 2:199ddea804cd 227 // enough retry is done - return to application
lamell 7:b14763b63562 228 if (retryAttempt == 5){
lamell 7:b14763b63562 229
lamell 7:b14763b63562 230 //Here's my modification. If not connected, RESET the board.
lamell 7:b14763b63562 231 NVIC_SystemReset();
sathipal 2:199ddea804cd 232 return false;
lamell 7:b14763b63562 233 } else {
lamell 25:f4727705353b 234 wait(timeout);
lamell 7:b14763b63562 235 }
sathipal 0:f86732d81998 236 } while(true);
sathipal 0:f86732d81998 237 }
sathipal 0:f86732d81998 238
lamell 25:f4727705353b 239 void DeviceClient::logData(NetworkInterface* net, char *hostname, char *clientId)
lamell 25:f4727705353b 240 //void DeviceClient::logData(EthernetInterface net, char *hostname, char *clientId)
sathipal 2:199ddea804cd 241 {
lokeshhk 5:ea9f483e0294 242 // Network debug statements
lokeshhk 5:ea9f483e0294 243 LOG("=====================================\r\n");
lokeshhk 5:ea9f483e0294 244 LOG("Connection Config Details:\r\n");
lokeshhk 5:ea9f483e0294 245 LOG("IP ADDRESS: %s\r\n", net->get_ip_address());
lokeshhk 5:ea9f483e0294 246 LOG("MAC ADDRESS: %s\r\n", net->get_mac_address());
lokeshhk 5:ea9f483e0294 247 LOG("Gateway: %s\r\n", net->get_gateway());
lokeshhk 5:ea9f483e0294 248 LOG("Network Mask: %s\r\n", net->get_netmask());
lokeshhk 5:ea9f483e0294 249 LOG("Server Hostname: %s\r\n", hostname);
lokeshhk 5:ea9f483e0294 250 LOG("Server Port: %d\r\n", port);
lokeshhk 5:ea9f483e0294 251 LOG("Client ID: %s\r\n", clientId);
lamell 25:f4727705353b 252 LOG("=====================================\r\n");
sathipal 0:f86732d81998 253 }
sathipal 0:f86732d81998 254
sathipal 0:f86732d81998 255 int DeviceClient::getConnTimeout(int attemptNumber)
sathipal 0:f86732d81998 256 {
sathipal 0:f86732d81998 257 // Try to increase the timeout every time
sathipal 0:f86732d81998 258 return (attemptNumber * attemptNumber * 5);
sathipal 0:f86732d81998 259 }
sathipal 0:f86732d81998 260
lamell 8:cb2c98efdca8 261
sathipal 3:3d91bf839b49 262 /**
sathipal 3:3d91bf839b49 263 * Returns the connection status, connected or disconnected.
sathipal 3:3d91bf839b49 264 */
sathipal 3:3d91bf839b49 265 bool DeviceClient::isConnected() {
lokeshhk 5:ea9f483e0294 266 return mqttClient->isConnected();
sathipal 3:3d91bf839b49 267 }
sathipal 0:f86732d81998 268
sathipal 0:f86732d81998 269 /**
lokeshhk 5:ea9f483e0294 270 * Publish data to the IBM Internet of Things Foundation. Note that data is published
lokeshhk 5:ea9f483e0294 271 * by default at Quality of Service (QoS) 0, which means that a successful send
sathipal 0:f86732d81998 272 * does not guarantee receipt even if the publish has been successful.
sathipal 0:f86732d81998 273 */
sathipal 0:f86732d81998 274 bool DeviceClient::publishEvent(char *eventName, char *data, MQTT::QoS qos)
sathipal 0:f86732d81998 275 {
lokeshhk 5:ea9f483e0294 276 if(!mqttClient->isConnected())
sathipal 3:3d91bf839b49 277 {
lokeshhk 5:ea9f483e0294 278 WARN("Client is not connected \r\n");
sathipal 0:f86732d81998 279 return false;
sathipal 0:f86732d81998 280 }
lokeshhk 5:ea9f483e0294 281
sathipal 0:f86732d81998 282 MQTT::Message message;
sathipal 0:f86732d81998 283 /* Topic format must be iot-2/evt/<eventName>/fmt/json (let us stick to json format for now)
sathipal 0:f86732d81998 284 *
sathipal 0:f86732d81998 285 * So length must be 10 + strlen(eventName) + 9 + 1
sathipal 0:f86732d81998 286 * iot-2/evt/ = 10
sathipal 0:f86732d81998 287 * /fmt/json = 9
sathipal 0:f86732d81998 288 * NULL char = 1
sathipal 0:f86732d81998 289 */
lokeshhk 5:ea9f483e0294 290
sathipal 0:f86732d81998 291 char topic[10 + strlen(eventName) + 9 + 1];
sathipal 0:f86732d81998 292 sprintf(topic, "%s%s%s", "iot-2/evt/", eventName, "/fmt/json");
lokeshhk 5:ea9f483e0294 293
sathipal 0:f86732d81998 294 message.qos = qos;
sathipal 0:f86732d81998 295 message.retained = false;
sathipal 0:f86732d81998 296 message.dup = false;
sathipal 0:f86732d81998 297 message.payload = (void*)data;
sathipal 0:f86732d81998 298 message.payloadlen = strlen(data);
lokeshhk 5:ea9f483e0294 299
lokeshhk 5:ea9f483e0294 300 LOG("Publishing %s\r\n", data);
lokeshhk 5:ea9f483e0294 301 int rc = mqttClient->publish(topic, message);
sathipal 0:f86732d81998 302 return rc == 0;
sathipal 0:f86732d81998 303 }
sathipal 0:f86732d81998 304
lokeshhk 5:ea9f483e0294 305 void DeviceClient::setCommandCallback(CommandHandler callbackFunc)
sathipal 2:199ddea804cd 306 {
sathipal 0:f86732d81998 307 handler = callbackFunc;
sathipal 0:f86732d81998 308 }
sathipal 0:f86732d81998 309 /**
sathipal 0:f86732d81998 310 * Subscribe to commands from the application. This will be executed only for
sathipal 0:f86732d81998 311 * registered flow (quickstart flow does not support command publish)
sathipal 0:f86732d81998 312 */
lokeshhk 5:ea9f483e0294 313 int DeviceClient::subscribeToCommands()
sathipal 2:199ddea804cd 314 {
sathipal 0:f86732d81998 315 int rc = 0;
sathipal 0:f86732d81998 316 // iot-2/cmd/+/fmt/+
lokeshhk 5:ea9f483e0294 317 if ((rc = mqttClient->subscribe("iot-2/cmd/+/fmt/+", MQTT::QOS2, msgArrived)) != 0)
lokeshhk 5:ea9f483e0294 318 WARN("rc from MQTT subscribe is %d\r\n", rc);
sathipal 0:f86732d81998 319 return rc;
sathipal 0:f86732d81998 320 }
sathipal 0:f86732d81998 321
sathipal 0:f86732d81998 322 /**
lokeshhk 5:ea9f483e0294 323 * Callback method to be registered with MQTT::Client. MQTT::Client calls whenever
sathipal 0:f86732d81998 324 * any command is published to the topic subscribed earlier.
sathipal 0:f86732d81998 325 */
sathipal 0:f86732d81998 326 void msgArrived(MQTT::MessageData& md)
sathipal 0:f86732d81998 327 {
sathipal 0:f86732d81998 328 // check whether callback is registered by the client code
lokeshhk 5:ea9f483e0294 329 if(handler == NULL)
sathipal 3:3d91bf839b49 330 {
sathipal 0:f86732d81998 331 return;
sathipal 0:f86732d81998 332 }
lokeshhk 5:ea9f483e0294 333
sathipal 0:f86732d81998 334 MQTT::Message &message = md.message;
sathipal 0:f86732d81998 335 char topic[md.topicName.lenstring.len + 1];
lokeshhk 5:ea9f483e0294 336
sathipal 0:f86732d81998 337 sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data);
lokeshhk 5:ea9f483e0294 338
lamell 10:665cfb0da4c5 339 LOG("Message arrived on topic %s: Length: %ul. Payload: %s\r\n", topic, message.payloadlen, message.payload);
lamell 25:f4727705353b 340
sathipal 0:f86732d81998 341 // Command topic: iot-2/cmd/blink/fmt/json - cmd is the string between cmd/ and /fmt/
sathipal 0:f86732d81998 342 char* start = strstr(topic, "/cmd/") + 5;
sathipal 0:f86732d81998 343 int len = strstr(topic, "/fmt/") - start;
sathipal 0:f86732d81998 344
sathipal 0:f86732d81998 345 char name[len + 1];
lokeshhk 5:ea9f483e0294 346
sathipal 0:f86732d81998 347 memcpy(name, start, len);
sathipal 0:f86732d81998 348 name[len] = NULL;
lokeshhk 5:ea9f483e0294 349
sathipal 0:f86732d81998 350 start = strstr(topic, "/fmt/") + 5;
lokeshhk 5:ea9f483e0294 351
sathipal 0:f86732d81998 352 char format[20]; // ToDO: need to find the length of the format
sathipal 0:f86732d81998 353 strcpy(format, start);
lokeshhk 5:ea9f483e0294 354
sathipal 0:f86732d81998 355 char payload[message.payloadlen + 1];
sathipal 0:f86732d81998 356 sprintf(payload, "%.*s", message.payloadlen, (char*)message.payload);
lokeshhk 5:ea9f483e0294 357
sathipal 0:f86732d81998 358 IoTF::Command cmd(name, format, payload);
sathipal 0:f86732d81998 359 (*handler)(cmd);
sathipal 0:f86732d81998 360 }
sathipal 0:f86732d81998 361
sathipal 3:3d91bf839b49 362 /**
sathipal 3:3d91bf839b49 363 * Disconnects the connection in order.
sathipal 3:3d91bf839b49 364 */
lokeshhk 5:ea9f483e0294 365 bool DeviceClient::disconnect()
sathipal 2:199ddea804cd 366 {
sathipal 3:3d91bf839b49 367 int rc = 0;
lokeshhk 5:ea9f483e0294 368 if(mqttClient->isConnected())
sathipal 3:3d91bf839b49 369 {
lokeshhk 5:ea9f483e0294 370 rc = mqttClient->disconnect();
sathipal 0:f86732d81998 371 }
lokeshhk 5:ea9f483e0294 372
lamell 18:ce12e2072cbb 373 //NetworkInterface* net = mqttNetwork->getEth();
lamell 25:f4727705353b 374 NetworkInterface* net = mqttNetwork->network;
lamell 25:f4727705353b 375 //EthernetInterface net = mqttNetwork->network;
lamell 25:f4727705353b 376
lokeshhk 5:ea9f483e0294 377 mqttNetwork->disconnect();
lokeshhk 5:ea9f483e0294 378 net->disconnect();
sathipal 3:3d91bf839b49 379 connected = false;
sathipal 3:3d91bf839b49 380 return rc == 0;
sathipal 0:f86732d81998 381 }
sathipal 0:f86732d81998 382
sathipal 0:f86732d81998 383 // Yield to allow MQTT client to process the command
lokeshhk 5:ea9f483e0294 384 void DeviceClient::yield(int ms)
sathipal 2:199ddea804cd 385 {
lokeshhk 5:ea9f483e0294 386 if(mqttClient->isConnected())
sathipal 3:3d91bf839b49 387 {
lokeshhk 5:ea9f483e0294 388 mqttClient->yield(ms);
sathipal 0:f86732d81998 389 }
sathipal 0:f86732d81998 390 }
sathipal 0:f86732d81998 391
sathipal 2:199ddea804cd 392 // Obtain DeviceId address
lokeshhk 5:ea9f483e0294 393 char* DeviceClient::getDeviceId(char* buf, int buflen)
lokeshhk 5:ea9f483e0294 394 {
lokeshhk 5:ea9f483e0294 395 if(this->deviceId == NULL || (strcmp("", this->deviceId) == 0))
sathipal 3:3d91bf839b49 396 {
sathipal 2:199ddea804cd 397 return getMac(buf, buflen);
sathipal 2:199ddea804cd 398 } else {
sathipal 2:199ddea804cd 399 return strncpy(buf, this->deviceId, buflen);
sathipal 2:199ddea804cd 400 }
sathipal 2:199ddea804cd 401 }
sathipal 0:f86732d81998 402 // Obtain MAC address
lokeshhk 5:ea9f483e0294 403 char* DeviceClient::getMac(char* buf, int buflen)
lokeshhk 5:ea9f483e0294 404 {
lamell 18:ce12e2072cbb 405 //NetworkInterface* net = mqttNetwork->getEth();
lamell 25:f4727705353b 406 NetworkInterface* net = mqttNetwork->network;
lamell 25:f4727705353b 407 //EthernetInterface net = mqttNetwork->network;
lamell 25:f4727705353b 408
lokeshhk 5:ea9f483e0294 409 strncpy(buf, net->get_mac_address(), buflen);
sathipal 0:f86732d81998 410
sathipal 0:f86732d81998 411 char* pos; // Remove colons from mac address
sathipal 0:f86732d81998 412 while ((pos = strchr(buf, ':')) != NULL)
sathipal 0:f86732d81998 413 memmove(pos, pos + 1, strlen(pos) + 1);
sathipal 0:f86732d81998 414 return buf;
lokeshhk 5:ea9f483e0294 415 }
lamell 8:cb2c98efdca8 416
lamell 8:cb2c98efdca8 417 char* DeviceClient::ipaddress() {
lamell 8:cb2c98efdca8 418 //char iplocal[25];
lamell 8:cb2c98efdca8 419
lamell 18:ce12e2072cbb 420 //NetworkInterface* net = mqttNetwork->getEth();
lamell 25:f4727705353b 421 NetworkInterface* net = mqttNetwork->network;
lamell 25:f4727705353b 422 //EthernetInterface net = mqttNetwork->network;
lamell 25:f4727705353b 423
lamell 25:f4727705353b 424 const char* ip = net->get_ip_address();
lamell 8:cb2c98efdca8 425
lamell 8:cb2c98efdca8 426 //strcpy(iplocal,ip);
lamell 8:cb2c98efdca8 427 //return iplocal;
lamell 8:cb2c98efdca8 428 return (char*)net->get_ip_address();
lamell 8:cb2c98efdca8 429 }
lamell 10:665cfb0da4c5 430
lamell 10:665cfb0da4c5 431 //NetworkInterface* DeviceClient::eth() {
lamell 10:665cfb0da4c5 432 // NetworkInterface* net = mqttNetwork->getEth();
lamell 10:665cfb0da4c5 433 // return (NetworkInterface*)net;
lamell 10:665cfb0da4c5 434 //}