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

Dependencies:   MQTT

Committer:
lamell
Date:
Thu Mar 28 23:27:19 2019 +0000
Revision:
12:ac091f717e40
Parent:
10:665cfb0da4c5
Child:
18:ce12e2072cbb
Added check for DISCO-F746NG

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);
lokeshhk 5:ea9f483e0294 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);
lokeshhk 5:ea9f483e0294 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 {
sathipal 0:f86732d81998 89 organizationName = 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 {
sathipal 0:f86732d81998 97 typeId = "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
lokeshhk 5:ea9f483e0294 105 NetworkInterface* net = mqttNetwork->getEth();
lokeshhk 5:ea9f483e0294 106 const char* ip = net->get_ip_address();
sathipal 0:f86732d81998 107
sathipal 0:f86732d81998 108 // Get devices MAC address if deviceId is not set already
lokeshhk 5:ea9f483e0294 109 if(this->deviceId == NULL || (strcmp("", this->deviceId) == 0))
sathipal 3:3d91bf839b49 110 {
sathipal 0:f86732d81998 111 char tmpBuf[50];
sathipal 0:f86732d81998 112 id = getMac(tmpBuf, sizeof(tmpBuf));
sathipal 0:f86732d81998 113 } else {
sathipal 0:f86732d81998 114 id = this->deviceId;
sathipal 0:f86732d81998 115 }
lokeshhk 5:ea9f483e0294 116
sathipal 0:f86732d81998 117 // Construct clientId - d:org:type:id
sathipal 0:f86732d81998 118 char clientId[strlen(organizationName) + strlen(typeId) + strlen(id) + 5];
sathipal 0:f86732d81998 119 sprintf(clientId, "d:%s:%s:%s", organizationName, typeId, id);
lokeshhk 5:ea9f483e0294 120
sathipal 0:f86732d81998 121 // Initialize MQTT Connect
sathipal 0:f86732d81998 122 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
sathipal 0:f86732d81998 123 data.MQTTVersion = 4;
sathipal 0:f86732d81998 124 data.clientID.cstring = clientId;
lokeshhk 5:ea9f483e0294 125
sathipal 0:f86732d81998 126 int quickstartMode = (strcmp(organizationName, QUICKSTART) == 0);
lokeshhk 5:ea9f483e0294 127
lokeshhk 5:ea9f483e0294 128 if (!quickstartMode)
lokeshhk 5:ea9f483e0294 129 {
sathipal 0:f86732d81998 130 data.username.cstring = "use-token-auth";
sathipal 0:f86732d81998 131 data.password.cstring = this->authToken;
lokeshhk 5:ea9f483e0294 132
lokeshhk 5:ea9f483e0294 133 //Check and initialize appropriate port
lokeshhk 5:ea9f483e0294 134 if(port == 1883)
lokeshhk 5:ea9f483e0294 135 port = MQTT_TLS_PORT;
sathipal 0:f86732d81998 136 }
lokeshhk 5:ea9f483e0294 137
lokeshhk 5:ea9f483e0294 138 logData(net, hostname, clientId);
lokeshhk 5:ea9f483e0294 139
lokeshhk 5:ea9f483e0294 140 if(ip){
lokeshhk 5:ea9f483e0294 141 rc = tryConnect(hostname, data);
lokeshhk 5:ea9f483e0294 142 // By default subscribe to commands if we are in registered flow
lokeshhk 5:ea9f483e0294 143 if(rc == true && !quickstartMode)
lokeshhk 5:ea9f483e0294 144 {
lokeshhk 5:ea9f483e0294 145 subscribeToCommands();
lokeshhk 5:ea9f483e0294 146 }
lokeshhk 5:ea9f483e0294 147 if(rc == true)
lokeshhk 5:ea9f483e0294 148 {
lokeshhk 5:ea9f483e0294 149 connected = true;
lokeshhk 5:ea9f483e0294 150 LOG("Device Client Connected to %s:%d\r\n",hostname,port);
lokeshhk 5:ea9f483e0294 151 }
sathipal 3:3d91bf839b49 152 }
lokeshhk 5:ea9f483e0294 153 else
lokeshhk 5:ea9f483e0294 154 LOG("No IP Assigned to Network Interface...\r\n");
lokeshhk 5:ea9f483e0294 155
sathipal 0:f86732d81998 156 return rc;
sathipal 0:f86732d81998 157 }
sathipal 0:f86732d81998 158
sathipal 3:3d91bf839b49 159 /**
sathipal 3:3d91bf839b49 160 * Reconnect when the connection is lost. This method disconnects the active connection if any
lokeshhk 5:ea9f483e0294 161 * and tries to initiate a fresh connection.
sathipal 3:3d91bf839b49 162 * This method uses the Ethernet Link status wherever applicable while reconnecting. i.e, tries to
sathipal 3:3d91bf839b49 163 * initiate the connection only when the Ethernet cable is plugged in.
sathipal 3:3d91bf839b49 164 */
lokeshhk 5:ea9f483e0294 165 bool DeviceClient::reConnect()
sathipal 3:3d91bf839b49 166 {
lokeshhk 5:ea9f483e0294 167 LOG("DeviceClient::reConnect() entry and connected = %s\r\n",(connected == true)?"true":"false");
sathipal 3:3d91bf839b49 168 if(connected == true)
sathipal 3:3d91bf839b49 169 {
sathipal 3:3d91bf839b49 170 disconnect();
sathipal 3:3d91bf839b49 171 }
sathipal 3:3d91bf839b49 172
sathipal 3:3d91bf839b49 173 if(linkStatus())
sathipal 3:3d91bf839b49 174 {
lokeshhk 5:ea9f483e0294 175 NetworkInterface* net = mqttNetwork->getEth();
lokeshhk 5:ea9f483e0294 176 if(net->connect() == 0)
sathipal 3:3d91bf839b49 177 {
sathipal 3:3d91bf839b49 178 bool status = connect();
lokeshhk 5:ea9f483e0294 179 if(status == false)
sathipal 3:3d91bf839b49 180 {
lokeshhk 5:ea9f483e0294 181 net->disconnect();
sathipal 3:3d91bf839b49 182 }
sathipal 3:3d91bf839b49 183 return status;
sathipal 3:3d91bf839b49 184 }
sathipal 3:3d91bf839b49 185 }
sathipal 3:3d91bf839b49 186 return false;
sathipal 3:3d91bf839b49 187 }
sathipal 3:3d91bf839b49 188
lokeshhk 5:ea9f483e0294 189 bool DeviceClient::tryConnect(char *hostname, MQTTPacket_connectData &data)
sathipal 2:199ddea804cd 190 {
sathipal 0:f86732d81998 191 int rc = -1;
sathipal 0:f86732d81998 192 int retryAttempt = 0;
lokeshhk 5:ea9f483e0294 193 do {
lokeshhk 5:ea9f483e0294 194 rc = mqttNetwork->connect(hostname, port);
lokeshhk 5:ea9f483e0294 195 if (rc != 0)
sathipal 3:3d91bf839b49 196 {
lokeshhk 5:ea9f483e0294 197 WARN("mqttNetwork connect returned: %d\r\n", rc);
sathipal 0:f86732d81998 198 }
sathipal 0:f86732d81998 199
lokeshhk 5:ea9f483e0294 200 // MQTT connect
lokeshhk 5:ea9f483e0294 201 if (rc == 0 && (rc = mqttClient->connect(data)) != 0)
sathipal 3:3d91bf839b49 202 {
lokeshhk 5:ea9f483e0294 203 WARN("MQTT connect returned %d\r\n", rc);
sathipal 0:f86732d81998 204 if (rc == MQTT_NOT_AUTHORIZED || rc == MQTT_BAD_USERNAME_OR_PASSWORD)
sathipal 0:f86732d81998 205 return false; // don't reattempt to connect if credentials are wrong
sathipal 0:f86732d81998 206 } else if (rc == MQTT_CONNECTION_ACCEPTED) {
sathipal 0:f86732d81998 207 return true;
sathipal 0:f86732d81998 208 }
lokeshhk 5:ea9f483e0294 209
sathipal 0:f86732d81998 210 int timeout = getConnTimeout(++retryAttempt);
lokeshhk 5:ea9f483e0294 211
lokeshhk 5:ea9f483e0294 212 WARN("Retry attempt number %d waiting %d\r\n", retryAttempt, timeout);
lokeshhk 5:ea9f483e0294 213
sathipal 2:199ddea804cd 214 // enough retry is done - return to application
lamell 7:b14763b63562 215 if (retryAttempt == 5){
lamell 7:b14763b63562 216
lamell 7:b14763b63562 217 //Here's my modification. If not connected, RESET the board.
lamell 7:b14763b63562 218 NVIC_SystemReset();
sathipal 2:199ddea804cd 219 return false;
lamell 7:b14763b63562 220 } else {
sathipal 0:f86732d81998 221 wait(timeout);
lamell 7:b14763b63562 222 }
sathipal 0:f86732d81998 223 } while(true);
sathipal 0:f86732d81998 224 }
sathipal 0:f86732d81998 225
lokeshhk 5:ea9f483e0294 226 void DeviceClient::logData(NetworkInterface* net, char *hostname, char *clientId)
sathipal 2:199ddea804cd 227 {
lokeshhk 5:ea9f483e0294 228 // Network debug statements
lokeshhk 5:ea9f483e0294 229 LOG("=====================================\r\n");
lokeshhk 5:ea9f483e0294 230 LOG("Connection Config Details:\r\n");
lokeshhk 5:ea9f483e0294 231 LOG("IP ADDRESS: %s\r\n", net->get_ip_address());
lokeshhk 5:ea9f483e0294 232 LOG("MAC ADDRESS: %s\r\n", net->get_mac_address());
lokeshhk 5:ea9f483e0294 233 LOG("Gateway: %s\r\n", net->get_gateway());
lokeshhk 5:ea9f483e0294 234 LOG("Network Mask: %s\r\n", net->get_netmask());
lokeshhk 5:ea9f483e0294 235 LOG("Server Hostname: %s\r\n", hostname);
lokeshhk 5:ea9f483e0294 236 LOG("Server Port: %d\r\n", port);
lokeshhk 5:ea9f483e0294 237 LOG("Client ID: %s\r\n", clientId);
lokeshhk 5:ea9f483e0294 238 LOG("=====================================\r\n");
sathipal 0:f86732d81998 239 }
sathipal 0:f86732d81998 240
sathipal 0:f86732d81998 241 int DeviceClient::getConnTimeout(int attemptNumber)
sathipal 0:f86732d81998 242 {
sathipal 0:f86732d81998 243 // Try to increase the timeout every time
sathipal 0:f86732d81998 244 return (attemptNumber * attemptNumber * 5);
sathipal 0:f86732d81998 245 }
sathipal 0:f86732d81998 246
lamell 8:cb2c98efdca8 247
sathipal 3:3d91bf839b49 248 /**
sathipal 3:3d91bf839b49 249 * Returns the connection status, connected or disconnected.
sathipal 3:3d91bf839b49 250 */
sathipal 3:3d91bf839b49 251 bool DeviceClient::isConnected() {
lokeshhk 5:ea9f483e0294 252 return mqttClient->isConnected();
sathipal 3:3d91bf839b49 253 }
sathipal 0:f86732d81998 254
sathipal 0:f86732d81998 255 /**
lokeshhk 5:ea9f483e0294 256 * Publish data to the IBM Internet of Things Foundation. Note that data is published
lokeshhk 5:ea9f483e0294 257 * by default at Quality of Service (QoS) 0, which means that a successful send
sathipal 0:f86732d81998 258 * does not guarantee receipt even if the publish has been successful.
sathipal 0:f86732d81998 259 */
sathipal 0:f86732d81998 260 bool DeviceClient::publishEvent(char *eventName, char *data, MQTT::QoS qos)
sathipal 0:f86732d81998 261 {
lokeshhk 5:ea9f483e0294 262 if(!mqttClient->isConnected())
sathipal 3:3d91bf839b49 263 {
lokeshhk 5:ea9f483e0294 264 WARN("Client is not connected \r\n");
sathipal 0:f86732d81998 265 return false;
sathipal 0:f86732d81998 266 }
lokeshhk 5:ea9f483e0294 267
sathipal 0:f86732d81998 268 MQTT::Message message;
sathipal 0:f86732d81998 269 /* Topic format must be iot-2/evt/<eventName>/fmt/json (let us stick to json format for now)
sathipal 0:f86732d81998 270 *
sathipal 0:f86732d81998 271 * So length must be 10 + strlen(eventName) + 9 + 1
sathipal 0:f86732d81998 272 * iot-2/evt/ = 10
sathipal 0:f86732d81998 273 * /fmt/json = 9
sathipal 0:f86732d81998 274 * NULL char = 1
sathipal 0:f86732d81998 275 */
lokeshhk 5:ea9f483e0294 276
sathipal 0:f86732d81998 277 char topic[10 + strlen(eventName) + 9 + 1];
sathipal 0:f86732d81998 278 sprintf(topic, "%s%s%s", "iot-2/evt/", eventName, "/fmt/json");
lokeshhk 5:ea9f483e0294 279
sathipal 0:f86732d81998 280 message.qos = qos;
sathipal 0:f86732d81998 281 message.retained = false;
sathipal 0:f86732d81998 282 message.dup = false;
sathipal 0:f86732d81998 283 message.payload = (void*)data;
sathipal 0:f86732d81998 284 message.payloadlen = strlen(data);
lokeshhk 5:ea9f483e0294 285
lokeshhk 5:ea9f483e0294 286 LOG("Publishing %s\r\n", data);
lokeshhk 5:ea9f483e0294 287 int rc = mqttClient->publish(topic, message);
sathipal 0:f86732d81998 288 return rc == 0;
sathipal 0:f86732d81998 289 }
sathipal 0:f86732d81998 290
lokeshhk 5:ea9f483e0294 291 void DeviceClient::setCommandCallback(CommandHandler callbackFunc)
sathipal 2:199ddea804cd 292 {
sathipal 0:f86732d81998 293 handler = callbackFunc;
sathipal 0:f86732d81998 294 }
sathipal 0:f86732d81998 295 /**
sathipal 0:f86732d81998 296 * Subscribe to commands from the application. This will be executed only for
sathipal 0:f86732d81998 297 * registered flow (quickstart flow does not support command publish)
sathipal 0:f86732d81998 298 */
lokeshhk 5:ea9f483e0294 299 int DeviceClient::subscribeToCommands()
sathipal 2:199ddea804cd 300 {
sathipal 0:f86732d81998 301 int rc = 0;
sathipal 0:f86732d81998 302 // iot-2/cmd/+/fmt/+
lokeshhk 5:ea9f483e0294 303 if ((rc = mqttClient->subscribe("iot-2/cmd/+/fmt/+", MQTT::QOS2, msgArrived)) != 0)
lokeshhk 5:ea9f483e0294 304 WARN("rc from MQTT subscribe is %d\r\n", rc);
sathipal 0:f86732d81998 305 return rc;
sathipal 0:f86732d81998 306 }
sathipal 0:f86732d81998 307
sathipal 0:f86732d81998 308 /**
lokeshhk 5:ea9f483e0294 309 * Callback method to be registered with MQTT::Client. MQTT::Client calls whenever
sathipal 0:f86732d81998 310 * any command is published to the topic subscribed earlier.
sathipal 0:f86732d81998 311 */
sathipal 0:f86732d81998 312 void msgArrived(MQTT::MessageData& md)
sathipal 0:f86732d81998 313 {
sathipal 0:f86732d81998 314 // check whether callback is registered by the client code
lokeshhk 5:ea9f483e0294 315 if(handler == NULL)
sathipal 3:3d91bf839b49 316 {
sathipal 0:f86732d81998 317 return;
sathipal 0:f86732d81998 318 }
lokeshhk 5:ea9f483e0294 319
sathipal 0:f86732d81998 320 MQTT::Message &message = md.message;
sathipal 0:f86732d81998 321 char topic[md.topicName.lenstring.len + 1];
lokeshhk 5:ea9f483e0294 322
sathipal 0:f86732d81998 323 sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data);
lokeshhk 5:ea9f483e0294 324
lamell 10:665cfb0da4c5 325 LOG("Message arrived on topic %s: Length: %ul. Payload: %s\r\n", topic, message.payloadlen, message.payload);
lokeshhk 5:ea9f483e0294 326
sathipal 0:f86732d81998 327 // Command topic: iot-2/cmd/blink/fmt/json - cmd is the string between cmd/ and /fmt/
sathipal 0:f86732d81998 328 char* start = strstr(topic, "/cmd/") + 5;
sathipal 0:f86732d81998 329 int len = strstr(topic, "/fmt/") - start;
sathipal 0:f86732d81998 330
sathipal 0:f86732d81998 331 char name[len + 1];
lokeshhk 5:ea9f483e0294 332
sathipal 0:f86732d81998 333 memcpy(name, start, len);
sathipal 0:f86732d81998 334 name[len] = NULL;
lokeshhk 5:ea9f483e0294 335
sathipal 0:f86732d81998 336 start = strstr(topic, "/fmt/") + 5;
lokeshhk 5:ea9f483e0294 337
sathipal 0:f86732d81998 338 char format[20]; // ToDO: need to find the length of the format
sathipal 0:f86732d81998 339 strcpy(format, start);
lokeshhk 5:ea9f483e0294 340
sathipal 0:f86732d81998 341 char payload[message.payloadlen + 1];
sathipal 0:f86732d81998 342 sprintf(payload, "%.*s", message.payloadlen, (char*)message.payload);
lokeshhk 5:ea9f483e0294 343
sathipal 0:f86732d81998 344 IoTF::Command cmd(name, format, payload);
sathipal 0:f86732d81998 345 (*handler)(cmd);
sathipal 0:f86732d81998 346 }
sathipal 0:f86732d81998 347
sathipal 3:3d91bf839b49 348 /**
sathipal 3:3d91bf839b49 349 * Disconnects the connection in order.
sathipal 3:3d91bf839b49 350 */
lokeshhk 5:ea9f483e0294 351 bool DeviceClient::disconnect()
sathipal 2:199ddea804cd 352 {
sathipal 3:3d91bf839b49 353 int rc = 0;
lokeshhk 5:ea9f483e0294 354 if(mqttClient->isConnected())
sathipal 3:3d91bf839b49 355 {
lokeshhk 5:ea9f483e0294 356 rc = mqttClient->disconnect();
sathipal 0:f86732d81998 357 }
lokeshhk 5:ea9f483e0294 358
lokeshhk 5:ea9f483e0294 359 NetworkInterface* net = mqttNetwork->getEth();
lokeshhk 5:ea9f483e0294 360 mqttNetwork->disconnect();
lokeshhk 5:ea9f483e0294 361 net->disconnect();
sathipal 3:3d91bf839b49 362 connected = false;
sathipal 3:3d91bf839b49 363 return rc == 0;
sathipal 0:f86732d81998 364 }
sathipal 0:f86732d81998 365
sathipal 0:f86732d81998 366 // Yield to allow MQTT client to process the command
lokeshhk 5:ea9f483e0294 367 void DeviceClient::yield(int ms)
sathipal 2:199ddea804cd 368 {
lokeshhk 5:ea9f483e0294 369 if(mqttClient->isConnected())
sathipal 3:3d91bf839b49 370 {
lokeshhk 5:ea9f483e0294 371 mqttClient->yield(ms);
sathipal 0:f86732d81998 372 }
sathipal 0:f86732d81998 373 }
sathipal 0:f86732d81998 374
sathipal 2:199ddea804cd 375 // Obtain DeviceId address
lokeshhk 5:ea9f483e0294 376 char* DeviceClient::getDeviceId(char* buf, int buflen)
lokeshhk 5:ea9f483e0294 377 {
lokeshhk 5:ea9f483e0294 378 if(this->deviceId == NULL || (strcmp("", this->deviceId) == 0))
sathipal 3:3d91bf839b49 379 {
sathipal 2:199ddea804cd 380 return getMac(buf, buflen);
sathipal 2:199ddea804cd 381 } else {
sathipal 2:199ddea804cd 382 return strncpy(buf, this->deviceId, buflen);
sathipal 2:199ddea804cd 383 }
sathipal 2:199ddea804cd 384 }
sathipal 0:f86732d81998 385 // Obtain MAC address
lokeshhk 5:ea9f483e0294 386 char* DeviceClient::getMac(char* buf, int buflen)
lokeshhk 5:ea9f483e0294 387 {
lokeshhk 5:ea9f483e0294 388 NetworkInterface* net = mqttNetwork->getEth();
lokeshhk 5:ea9f483e0294 389 strncpy(buf, net->get_mac_address(), buflen);
sathipal 0:f86732d81998 390
sathipal 0:f86732d81998 391 char* pos; // Remove colons from mac address
sathipal 0:f86732d81998 392 while ((pos = strchr(buf, ':')) != NULL)
sathipal 0:f86732d81998 393 memmove(pos, pos + 1, strlen(pos) + 1);
sathipal 0:f86732d81998 394 return buf;
lokeshhk 5:ea9f483e0294 395 }
lamell 8:cb2c98efdca8 396
lamell 8:cb2c98efdca8 397 char* DeviceClient::ipaddress() {
lamell 8:cb2c98efdca8 398 //char iplocal[25];
lamell 8:cb2c98efdca8 399
lamell 8:cb2c98efdca8 400 NetworkInterface* net = mqttNetwork->getEth();
lamell 8:cb2c98efdca8 401 //const char* ip = net->get_ip_address();
lamell 8:cb2c98efdca8 402
lamell 8:cb2c98efdca8 403 //strcpy(iplocal,ip);
lamell 8:cb2c98efdca8 404 //return iplocal;
lamell 8:cb2c98efdca8 405 return (char*)net->get_ip_address();
lamell 8:cb2c98efdca8 406 }
lamell 10:665cfb0da4c5 407
lamell 10:665cfb0da4c5 408 //NetworkInterface* DeviceClient::eth() {
lamell 10:665cfb0da4c5 409 // NetworkInterface* net = mqttNetwork->getEth();
lamell 10:665cfb0da4c5 410 // return (NetworkInterface*)net;
lamell 10:665cfb0da4c5 411 //}