MQTT demo program for Nucleo F401RE and Seeedstudio W5200 Ethernet Shield which is based on Wiznet IBMIoTClientEthernetExample_W5500.

Dependencies:   MQTT W5200Interface mbed DHT11

Fork of IBMIoTClientEthernetExample_W5500 by W5500-Ethernet-Interface Makers

I post description regarding this source code here.

http://developer.mbed.org/users/hillkim7/notebook/ibmiotclientethernetexample_w5200/

Committer:
kaizen
Date:
Fri Sep 26 08:06:10 2014 +0000
Revision:
0:910036879da0
Child:
1:532d83b9f910
This is example for using IBMIotClient

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kaizen 0:910036879da0 1 #include "mbed.h"
kaizen 0:910036879da0 2 #include "MQTTClient.h"
kaizen 0:910036879da0 3 #include "MQTTEthernet.h"
kaizen 0:910036879da0 4
kaizen 0:910036879da0 5 // Configuration values needed to connect to IBM IoT Cloud
kaizen 0:910036879da0 6 #define QUICKSTARTMODE 1
kaizen 0:910036879da0 7 #if (QUICKSTARTMODE)
kaizen 0:910036879da0 8 #define ORG "quickstart"
kaizen 0:910036879da0 9 #define ID ""
kaizen 0:910036879da0 10 #define AUTH_TOKEN ""
kaizen 0:910036879da0 11 #define TYPE "iotsample-mbed-lpc1768"
kaizen 0:910036879da0 12 #else
kaizen 0:910036879da0 13 #define ORG "Replace with your org"
kaizen 0:910036879da0 14 #define ID "Replace with your id"
kaizen 0:910036879da0 15 #define TYPE "Replace with your type"
kaizen 0:910036879da0 16 #define AUTH_TOKEN "Replace with your auth-token"
kaizen 0:910036879da0 17 #endif
kaizen 0:910036879da0 18
kaizen 0:910036879da0 19 #define MQTT_PORT 1883
kaizen 0:910036879da0 20 #define MQTT_TLS_PORT 8883
kaizen 0:910036879da0 21 #define IBM_IOT_PORT MQTT_PORT
kaizen 0:910036879da0 22
kaizen 0:910036879da0 23 #define MQTT_MAX_PACKET_SIZE 250
kaizen 0:910036879da0 24
kaizen 0:910036879da0 25
kaizen 0:910036879da0 26 bool quickstartMode = (QUICKSTARTMODE) ? true : false;
kaizen 0:910036879da0 27 char org[11] = ORG;
kaizen 0:910036879da0 28 char type[30] = TYPE;
kaizen 0:910036879da0 29 char id[30] = ID; // mac without colons
kaizen 0:910036879da0 30 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
kaizen 0:910036879da0 31
kaizen 0:910036879da0 32 bool connected = false;
kaizen 0:910036879da0 33
kaizen 0:910036879da0 34
kaizen 0:910036879da0 35 char* getMac(EthernetInterface& eth, char* buf, int buflen) // Obtain MAC address
kaizen 0:910036879da0 36 {
kaizen 0:910036879da0 37 //strncpy(buf, eth.getMACAddress(), buflen);
kaizen 0:910036879da0 38 strncpy(buf,"00:02:f7:f2:05:00",buflen);
kaizen 0:910036879da0 39
kaizen 0:910036879da0 40 char* pos; // Remove colons from mac address
kaizen 0:910036879da0 41 while ((pos = strchr(buf, ':')) != NULL)
kaizen 0:910036879da0 42 memmove(pos, pos + 1, strlen(pos) + 1);
kaizen 0:910036879da0 43 return buf;
kaizen 0:910036879da0 44 }
kaizen 0:910036879da0 45
kaizen 0:910036879da0 46
kaizen 0:910036879da0 47 int connect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
kaizen 0:910036879da0 48 {
kaizen 0:910036879da0 49 const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com";
kaizen 0:910036879da0 50
kaizen 0:910036879da0 51 char hostname[strlen(org) + strlen(iot_ibm) + 1];
kaizen 0:910036879da0 52 sprintf(hostname, "%s%s", org, iot_ibm);
kaizen 0:910036879da0 53 int rc = ipstack->connect(hostname, IBM_IOT_PORT);
kaizen 0:910036879da0 54 if (rc != 0)
kaizen 0:910036879da0 55 return rc;
kaizen 0:910036879da0 56
kaizen 0:910036879da0 57 // Construct clientId - d:org:type:id
kaizen 0:910036879da0 58 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
kaizen 0:910036879da0 59 sprintf(clientId, "d:%s:%s:%s", org, type, id);
kaizen 0:910036879da0 60 DEBUG("clientid is %s\r\n", clientId);
kaizen 0:910036879da0 61
kaizen 0:910036879da0 62 // MQTT Connect
kaizen 0:910036879da0 63 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
kaizen 0:910036879da0 64 data.MQTTVersion = 3;
kaizen 0:910036879da0 65 data.clientID.cstring = clientId;
kaizen 0:910036879da0 66
kaizen 0:910036879da0 67 if (!quickstartMode)
kaizen 0:910036879da0 68 {
kaizen 0:910036879da0 69 data.username.cstring = "use-token-auth";
kaizen 0:910036879da0 70 data.password.cstring = auth_token;
kaizen 0:910036879da0 71 }
kaizen 0:910036879da0 72
kaizen 0:910036879da0 73 if ((rc = client->connect(&data)) == 0)
kaizen 0:910036879da0 74 {
kaizen 0:910036879da0 75 connected = true;
kaizen 0:910036879da0 76 }
kaizen 0:910036879da0 77 return rc;
kaizen 0:910036879da0 78 }
kaizen 0:910036879da0 79
kaizen 0:910036879da0 80
kaizen 0:910036879da0 81 int getConnTimeout(int attemptNumber)
kaizen 0:910036879da0 82 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
kaizen 0:910036879da0 83 // after 20 attempts, retry every 10 minutes
kaizen 0:910036879da0 84 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
kaizen 0:910036879da0 85 }
kaizen 0:910036879da0 86
kaizen 0:910036879da0 87
kaizen 0:910036879da0 88 void attemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
kaizen 0:910036879da0 89 {
kaizen 0:910036879da0 90 int retryAttempt = 0;
kaizen 0:910036879da0 91 connected = false;
kaizen 0:910036879da0 92
kaizen 0:910036879da0 93 // make sure a cable is connected before starting to connect
kaizen 0:910036879da0 94 while ( !ipstack->getEth().linkstatus() ) {
kaizen 0:910036879da0 95 wait(1.0f);
kaizen 0:910036879da0 96 WARN("Ethernet link not present. Check cable connection\r\n");
kaizen 0:910036879da0 97 }
kaizen 0:910036879da0 98
kaizen 0:910036879da0 99 while (connect(client, ipstack) != 0)
kaizen 0:910036879da0 100 {
kaizen 0:910036879da0 101 int timeout = getConnTimeout(++retryAttempt);
kaizen 0:910036879da0 102 WARN("Retry attempt number %d waiting %d\r\n", retryAttempt, timeout);
kaizen 0:910036879da0 103 wait(timeout);
kaizen 0:910036879da0 104 }
kaizen 0:910036879da0 105 }
kaizen 0:910036879da0 106
kaizen 0:910036879da0 107 int publish(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
kaizen 0:910036879da0 108 {
kaizen 0:910036879da0 109 MQTT::Message message;
kaizen 0:910036879da0 110 char* pubTopic = "iot-2/evt/status/fmt/json";
kaizen 0:910036879da0 111
kaizen 0:910036879da0 112 char buf[250];
kaizen 0:910036879da0 113 sprintf(buf,
kaizen 0:910036879da0 114 "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}",
kaizen 0:910036879da0 115 12.4, 22.3, 12.2, 25.3, "up", 12.3, 22.1);
kaizen 0:910036879da0 116
kaizen 0:910036879da0 117 message.qos = MQTT::QOS0;
kaizen 0:910036879da0 118 message.retained = false;
kaizen 0:910036879da0 119 message.dup = false;
kaizen 0:910036879da0 120 message.payload = (void*)buf;
kaizen 0:910036879da0 121 message.payloadlen = strlen(buf);
kaizen 0:910036879da0 122
kaizen 0:910036879da0 123 LOG("Publishing %s\r\n", buf);
kaizen 0:910036879da0 124 return client->publish(pubTopic, &message);
kaizen 0:910036879da0 125 }
kaizen 0:910036879da0 126
kaizen 0:910036879da0 127
kaizen 0:910036879da0 128 void messageArrived(MQTT::MessageData& md)
kaizen 0:910036879da0 129 {
kaizen 0:910036879da0 130 MQTT::Message &message = md.message;
kaizen 0:910036879da0 131 char topic[md.topicName.lenstring.len + 1];
kaizen 0:910036879da0 132
kaizen 0:910036879da0 133 sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data);
kaizen 0:910036879da0 134
kaizen 0:910036879da0 135 LOG("Message arrived on topic %s: %.*s\r\n", topic, message.payloadlen, message.payload);
kaizen 0:910036879da0 136
kaizen 0:910036879da0 137 // Command topic: iot-2/cmd/blink/fmt/json - cmd is the string between cmd/ and /fmt/
kaizen 0:910036879da0 138 char* start = strstr(topic, "/cmd/") + 5;
kaizen 0:910036879da0 139 int len = strstr(topic, "/fmt/") - start;
kaizen 0:910036879da0 140
kaizen 0:910036879da0 141 if (memcmp(start, "blink", len) == 0)
kaizen 0:910036879da0 142 {
kaizen 0:910036879da0 143 char payload[message.payloadlen + 1];
kaizen 0:910036879da0 144 sprintf(payload, "%.*s", message.payloadlen, (char*)message.payload);
kaizen 0:910036879da0 145
kaizen 0:910036879da0 146 char* pos = strchr(payload, '}');
kaizen 0:910036879da0 147 if (pos != NULL)
kaizen 0:910036879da0 148 {
kaizen 0:910036879da0 149 *pos = '\0';
kaizen 0:910036879da0 150 if ((pos = strchr(payload, ':')) != NULL)
kaizen 0:910036879da0 151 {
kaizen 0:910036879da0 152 }
kaizen 0:910036879da0 153 }
kaizen 0:910036879da0 154 }
kaizen 0:910036879da0 155 else
kaizen 0:910036879da0 156 WARN("Unsupported command: %.*s\r\n", len, start);
kaizen 0:910036879da0 157 }
kaizen 0:910036879da0 158
kaizen 0:910036879da0 159
kaizen 0:910036879da0 160
kaizen 0:910036879da0 161 int main()
kaizen 0:910036879da0 162 {
kaizen 0:910036879da0 163 Serial pc(USBTX, USBRX);
kaizen 0:910036879da0 164 pc.baud(115200);
kaizen 0:910036879da0 165
kaizen 0:910036879da0 166 SPI spi(D11, D12, D13); // mosi, miso, sclk
kaizen 0:910036879da0 167 wait(1);
kaizen 0:910036879da0 168
kaizen 0:910036879da0 169 MQTTEthernet ipstack(&spi, D10, D9); //scs(D10), nRESET(PTA20)
kaizen 0:910036879da0 170 MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
kaizen 0:910036879da0 171
kaizen 0:910036879da0 172 if (quickstartMode )
kaizen 0:910036879da0 173 {
kaizen 0:910036879da0 174 getMac(ipstack.getEth(), id, sizeof(id));
kaizen 0:910036879da0 175 }
kaizen 0:910036879da0 176
kaizen 0:910036879da0 177 attemptConnect(&client, &ipstack);
kaizen 0:910036879da0 178
kaizen 0:910036879da0 179 if (!quickstartMode)
kaizen 0:910036879da0 180 {
kaizen 0:910036879da0 181 int rc = 0;
kaizen 0:910036879da0 182 if ((rc = client.subscribe("iot-2/cmd/+/fmt/json", MQTT::QOS1, messageArrived)) != 0)
kaizen 0:910036879da0 183 WARN("rc from MQTT subscribe is %d\r\n", rc);
kaizen 0:910036879da0 184 }
kaizen 0:910036879da0 185
kaizen 0:910036879da0 186 int count = 0;
kaizen 0:910036879da0 187 while (true)
kaizen 0:910036879da0 188 {
kaizen 0:910036879da0 189 if (!ipstack.getEth().linkstatus()) {
kaizen 0:910036879da0 190 NVIC_SystemReset();
kaizen 0:910036879da0 191 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
kaizen 0:910036879da0 192 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
kaizen 0:910036879da0 193 }
kaizen 0:910036879da0 194
kaizen 0:910036879da0 195 if (++count == 100)
kaizen 0:910036879da0 196 { // Publish a message every second
kaizen 0:910036879da0 197 if (publish(&client, &ipstack) != 0)
kaizen 0:910036879da0 198 attemptConnect(&client, &ipstack); // if we have lost the connection
kaizen 0:910036879da0 199 count = 0;
kaizen 0:910036879da0 200 }
kaizen 0:910036879da0 201
kaizen 0:910036879da0 202 client.yield(10); // allow the MQTT client to receive messages
kaizen 0:910036879da0 203 }
kaizen 0:910036879da0 204 }