sending data to DeviceHub.net

Dependencies:   EthernetInterface MQTT mbed-rtos mbed

Committer:
alexandrug
Date:
Thu Oct 01 18:55:33 2015 +0000
Revision:
0:886a2daca437
sample

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alexandrug 0:886a2daca437 1 #include "MQTTClient.h"
alexandrug 0:886a2daca437 2 #include "MQTTEthernet.h"
alexandrug 0:886a2daca437 3 #include "rtos.h"
alexandrug 0:886a2daca437 4 #include <stdlib.h>
alexandrug 0:886a2daca437 5
alexandrug 0:886a2daca437 6 #define __APP_SW_REVISION__ "1"
alexandrug 0:886a2daca437 7
alexandrug 0:886a2daca437 8 #define MQTT_PORT 1883
alexandrug 0:886a2daca437 9
alexandrug 0:886a2daca437 10 #define MQTT_MAX_PACKET_SIZE 250
alexandrug 0:886a2daca437 11
alexandrug 0:886a2daca437 12 #include "K64F.h"
alexandrug 0:886a2daca437 13
alexandrug 0:886a2daca437 14 bool quickstartMode = true;
alexandrug 0:886a2daca437 15
alexandrug 0:886a2daca437 16 bool connected = false;
alexandrug 0:886a2daca437 17 bool mqttConnecting = false;
alexandrug 0:886a2daca437 18 bool netConnected = false;
alexandrug 0:886a2daca437 19 bool netConnecting = false;
alexandrug 0:886a2daca437 20 bool ethernetInitialising = true;
alexandrug 0:886a2daca437 21 int connack_rc = 0; // MQTT connack return code
alexandrug 0:886a2daca437 22 int retryAttempt = 0;
alexandrug 0:886a2daca437 23
alexandrug 0:886a2daca437 24 int blink_interval = 0;
alexandrug 0:886a2daca437 25
alexandrug 0:886a2daca437 26 char* ip_addr = "";
alexandrug 0:886a2daca437 27 char* gateway_addr = "";
alexandrug 0:886a2daca437 28 char* host_addr = "";
alexandrug 0:886a2daca437 29 int connectTimeout = 1000;
alexandrug 0:886a2daca437 30
alexandrug 0:886a2daca437 31 #define API_KEY "ba8b7a2d-b690-4351-8521-100b45c09dd8"
alexandrug 0:886a2daca437 32 #define PROJECT_ID "4505"
alexandrug 0:886a2daca437 33 #define AN_SENSOR_NAME "test"
alexandrug 0:886a2daca437 34 #define DEVICE_UUID "1deffe91-f938-48c5-aaea-3aef29af7869"
alexandrug 0:886a2daca437 35 #define ID "aaa"
alexandrug 0:886a2daca437 36
alexandrug 0:886a2daca437 37 char* pubTopic = "/a/"API_KEY"/p/"PROJECT_ID"/d/"DEVICE_UUID"/sensor/"AN_SENSOR_NAME"/data";
alexandrug 0:886a2daca437 38 char id[30] = ID;
alexandrug 0:886a2daca437 39
alexandrug 0:886a2daca437 40 int connect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
alexandrug 0:886a2daca437 41 {
alexandrug 0:886a2daca437 42 const char* host = "mqtt.devicehub.net";
alexandrug 0:886a2daca437 43
alexandrug 0:886a2daca437 44 char hostname[strlen(host) + 1];
alexandrug 0:886a2daca437 45 sprintf(hostname, "%s", host);
alexandrug 0:886a2daca437 46 EthernetInterface& eth = ipstack->getEth();
alexandrug 0:886a2daca437 47 ip_addr = eth.getIPAddress();
alexandrug 0:886a2daca437 48 gateway_addr = eth.getGateway();
alexandrug 0:886a2daca437 49
alexandrug 0:886a2daca437 50 char clientId[strlen(id)];
alexandrug 0:886a2daca437 51 sprintf(clientId, "%s",id);
alexandrug 0:886a2daca437 52
alexandrug 0:886a2daca437 53 // Network debug statements
alexandrug 0:886a2daca437 54 LOG("=====================================\n");
alexandrug 0:886a2daca437 55 LOG("Connecting Ethernet.\n");
alexandrug 0:886a2daca437 56 LOG("IP ADDRESS: %s\n", eth.getIPAddress());
alexandrug 0:886a2daca437 57 LOG("MAC ADDRESS: %s\n", eth.getMACAddress());
alexandrug 0:886a2daca437 58 LOG("Gateway: %s\n", eth.getGateway());
alexandrug 0:886a2daca437 59 LOG("Network Mask: %s\n", eth.getNetworkMask());
alexandrug 0:886a2daca437 60 LOG("Server Hostname: %s\n", hostname);
alexandrug 0:886a2daca437 61 LOG("Client ID: %s\n", clientId);
alexandrug 0:886a2daca437 62 LOG("=====================================\n");
alexandrug 0:886a2daca437 63
alexandrug 0:886a2daca437 64 netConnecting = true;
alexandrug 0:886a2daca437 65 int rc = ipstack->connect(hostname, MQTT_PORT, connectTimeout);
alexandrug 0:886a2daca437 66 if (rc != 0)
alexandrug 0:886a2daca437 67 {
alexandrug 0:886a2daca437 68 WARN("IP Stack connect returned: %d\n", rc);
alexandrug 0:886a2daca437 69 return rc;
alexandrug 0:886a2daca437 70 }
alexandrug 0:886a2daca437 71 netConnected = true;
alexandrug 0:886a2daca437 72 netConnecting = false;
alexandrug 0:886a2daca437 73
alexandrug 0:886a2daca437 74 // MQTT Connect
alexandrug 0:886a2daca437 75 mqttConnecting = true;
alexandrug 0:886a2daca437 76 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
alexandrug 0:886a2daca437 77 data.MQTTVersion = 3;
alexandrug 0:886a2daca437 78 data.clientID.cstring = clientId;
alexandrug 0:886a2daca437 79
alexandrug 0:886a2daca437 80
alexandrug 0:886a2daca437 81 if ((rc = client->connect(data)) == 0)
alexandrug 0:886a2daca437 82 {
alexandrug 0:886a2daca437 83 connected = true;
alexandrug 0:886a2daca437 84 }
alexandrug 0:886a2daca437 85 else
alexandrug 0:886a2daca437 86 WARN("MQTT connect returned %d\n", rc);
alexandrug 0:886a2daca437 87 if (rc >= 0)
alexandrug 0:886a2daca437 88 connack_rc = rc;
alexandrug 0:886a2daca437 89 mqttConnecting = false;
alexandrug 0:886a2daca437 90 return rc;
alexandrug 0:886a2daca437 91 }
alexandrug 0:886a2daca437 92
alexandrug 0:886a2daca437 93
alexandrug 0:886a2daca437 94 int getConnTimeout(int attemptNumber)
alexandrug 0:886a2daca437 95 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
alexandrug 0:886a2daca437 96 // after 20 attempts, retry every 10 minutes
alexandrug 0:886a2daca437 97 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
alexandrug 0:886a2daca437 98 }
alexandrug 0:886a2daca437 99
alexandrug 0:886a2daca437 100
alexandrug 0:886a2daca437 101 void attemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
alexandrug 0:886a2daca437 102 {
alexandrug 0:886a2daca437 103 connected = false;
alexandrug 0:886a2daca437 104
alexandrug 0:886a2daca437 105 while (!linkStatus())
alexandrug 0:886a2daca437 106 {
alexandrug 0:886a2daca437 107 wait(1.0f);
alexandrug 0:886a2daca437 108 WARN("Ethernet link not present. Check cable connection\n");
alexandrug 0:886a2daca437 109 }
alexandrug 0:886a2daca437 110
alexandrug 0:886a2daca437 111 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
alexandrug 0:886a2daca437 112 {
alexandrug 0:886a2daca437 113
alexandrug 0:886a2daca437 114 int timeout = getConnTimeout(++retryAttempt);
alexandrug 0:886a2daca437 115 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
alexandrug 0:886a2daca437 116
alexandrug 0:886a2daca437 117 // this works - reset the system when the retry count gets to a threshold
alexandrug 0:886a2daca437 118 if (retryAttempt == 5)
alexandrug 0:886a2daca437 119 NVIC_SystemReset();
alexandrug 0:886a2daca437 120 else
alexandrug 0:886a2daca437 121 wait(timeout);
alexandrug 0:886a2daca437 122 }
alexandrug 0:886a2daca437 123 }
alexandrug 0:886a2daca437 124
alexandrug 0:886a2daca437 125
alexandrug 0:886a2daca437 126 int publish(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
alexandrug 0:886a2daca437 127 {
alexandrug 0:886a2daca437 128 MQTT::Message message;
alexandrug 0:886a2daca437 129
alexandrug 0:886a2daca437 130 int analog_sensor = rand() % 100;
alexandrug 0:886a2daca437 131 char buf[250];
alexandrug 0:886a2daca437 132 sprintf(buf,"{\"value\": %d }", analog_sensor);
alexandrug 0:886a2daca437 133 message.qos = MQTT::QOS0;
alexandrug 0:886a2daca437 134 message.retained = false;
alexandrug 0:886a2daca437 135 message.dup = false;
alexandrug 0:886a2daca437 136 message.payload = (void*)buf;
alexandrug 0:886a2daca437 137 message.payloadlen = strlen(buf);
alexandrug 0:886a2daca437 138
alexandrug 0:886a2daca437 139 LOG("Publishing %s\n", buf);
alexandrug 0:886a2daca437 140 return client->publish(pubTopic, message);
alexandrug 0:886a2daca437 141 }
alexandrug 0:886a2daca437 142
alexandrug 0:886a2daca437 143
alexandrug 0:886a2daca437 144 char* getMac(EthernetInterface& eth, char* buf, int buflen) // Obtain MAC address
alexandrug 0:886a2daca437 145 {
alexandrug 0:886a2daca437 146 strncpy(buf, eth.getMACAddress(), buflen);
alexandrug 0:886a2daca437 147
alexandrug 0:886a2daca437 148 char* pos; // Remove colons from mac address
alexandrug 0:886a2daca437 149 while ((pos = strchr(buf, ':')) != NULL)
alexandrug 0:886a2daca437 150 memmove(pos, pos + 1, strlen(pos) + 1);
alexandrug 0:886a2daca437 151 return buf;
alexandrug 0:886a2daca437 152 }
alexandrug 0:886a2daca437 153
alexandrug 0:886a2daca437 154 int main()
alexandrug 0:886a2daca437 155 {
alexandrug 0:886a2daca437 156
alexandrug 0:886a2daca437 157 led2 = LED2_OFF; // K64F: turn off the main board LED
alexandrug 0:886a2daca437 158
alexandrug 0:886a2daca437 159 LOG("***** DeviceHub.net example *****\n");
alexandrug 0:886a2daca437 160 MQTTEthernet ipstack;
alexandrug 0:886a2daca437 161 ethernetInitialising = false;
alexandrug 0:886a2daca437 162 MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
alexandrug 0:886a2daca437 163 LOG("Ethernet Initialized\n");
alexandrug 0:886a2daca437 164
alexandrug 0:886a2daca437 165 if (quickstartMode)
alexandrug 0:886a2daca437 166 getMac(ipstack.getEth(), id, sizeof(id));
alexandrug 0:886a2daca437 167
alexandrug 0:886a2daca437 168 attemptConnect(&client, &ipstack);
alexandrug 0:886a2daca437 169
alexandrug 0:886a2daca437 170
alexandrug 0:886a2daca437 171 blink_interval = 0;
alexandrug 0:886a2daca437 172 int count = 0;
alexandrug 0:886a2daca437 173 while (true)
alexandrug 0:886a2daca437 174 {
alexandrug 0:886a2daca437 175 if (++count == 100)
alexandrug 0:886a2daca437 176 { // Publish a message every second
alexandrug 0:886a2daca437 177 if (publish(&client, &ipstack) != 0)
alexandrug 0:886a2daca437 178 attemptConnect(&client, &ipstack); // if we have lost the connection
alexandrug 0:886a2daca437 179 count = 0;
alexandrug 0:886a2daca437 180 }
alexandrug 0:886a2daca437 181
alexandrug 0:886a2daca437 182 if (blink_interval == 0)
alexandrug 0:886a2daca437 183 led2 = LED2_OFF;
alexandrug 0:886a2daca437 184 else if (count % blink_interval == 0)
alexandrug 0:886a2daca437 185 led2 = !led2;
alexandrug 0:886a2daca437 186 client.yield(10); // allow the MQTT client to receive messages
alexandrug 0:886a2daca437 187 }
alexandrug 0:886a2daca437 188 }