sending data to DeviceHub.net
Dependencies: EthernetInterface MQTT mbed-rtos mbed
main.cpp@0:886a2daca437, 2015-10-01 (annotated)
- Committer:
- alexandrug
- Date:
- Thu Oct 01 18:55:33 2015 +0000
- Revision:
- 0:886a2daca437
sample
Who changed what in which revision?
User | Revision | Line number | New 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 | } |