sending data to DeviceHub.net
Dependencies: EthernetInterface MQTT mbed-rtos mbed
Diff: main.cpp
- Revision:
- 0:886a2daca437
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Oct 01 18:55:33 2015 +0000 @@ -0,0 +1,188 @@ +#include "MQTTClient.h" +#include "MQTTEthernet.h" +#include "rtos.h" +#include <stdlib.h> + +#define __APP_SW_REVISION__ "1" + +#define MQTT_PORT 1883 + +#define MQTT_MAX_PACKET_SIZE 250 + +#include "K64F.h" + +bool quickstartMode = true; + +bool connected = false; +bool mqttConnecting = false; +bool netConnected = false; +bool netConnecting = false; +bool ethernetInitialising = true; +int connack_rc = 0; // MQTT connack return code +int retryAttempt = 0; + +int blink_interval = 0; + +char* ip_addr = ""; +char* gateway_addr = ""; +char* host_addr = ""; +int connectTimeout = 1000; + +#define API_KEY "ba8b7a2d-b690-4351-8521-100b45c09dd8" +#define PROJECT_ID "4505" +#define AN_SENSOR_NAME "test" +#define DEVICE_UUID "1deffe91-f938-48c5-aaea-3aef29af7869" +#define ID "aaa" + +char* pubTopic = "/a/"API_KEY"/p/"PROJECT_ID"/d/"DEVICE_UUID"/sensor/"AN_SENSOR_NAME"/data"; +char id[30] = ID; + +int connect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) +{ + const char* host = "mqtt.devicehub.net"; + + char hostname[strlen(host) + 1]; + sprintf(hostname, "%s", host); + EthernetInterface& eth = ipstack->getEth(); + ip_addr = eth.getIPAddress(); + gateway_addr = eth.getGateway(); + + char clientId[strlen(id)]; + sprintf(clientId, "%s",id); + + // Network debug statements + LOG("=====================================\n"); + LOG("Connecting Ethernet.\n"); + LOG("IP ADDRESS: %s\n", eth.getIPAddress()); + LOG("MAC ADDRESS: %s\n", eth.getMACAddress()); + LOG("Gateway: %s\n", eth.getGateway()); + LOG("Network Mask: %s\n", eth.getNetworkMask()); + LOG("Server Hostname: %s\n", hostname); + LOG("Client ID: %s\n", clientId); + LOG("=====================================\n"); + + netConnecting = true; + int rc = ipstack->connect(hostname, MQTT_PORT, connectTimeout); + if (rc != 0) + { + WARN("IP Stack connect returned: %d\n", rc); + return rc; + } + netConnected = true; + netConnecting = false; + + // MQTT Connect + mqttConnecting = true; + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + data.MQTTVersion = 3; + data.clientID.cstring = clientId; + + + if ((rc = client->connect(data)) == 0) + { + connected = true; + } + else + WARN("MQTT connect returned %d\n", rc); + if (rc >= 0) + connack_rc = rc; + mqttConnecting = false; + return rc; +} + + +int getConnTimeout(int attemptNumber) +{ // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute + // after 20 attempts, retry every 10 minutes + return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600; +} + + +void attemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) +{ + connected = false; + + while (!linkStatus()) + { + wait(1.0f); + WARN("Ethernet link not present. Check cable connection\n"); + } + + while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED) + { + + int timeout = getConnTimeout(++retryAttempt); + WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout); + + // this works - reset the system when the retry count gets to a threshold + if (retryAttempt == 5) + NVIC_SystemReset(); + else + wait(timeout); + } +} + + +int publish(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) +{ + MQTT::Message message; + + int analog_sensor = rand() % 100; + char buf[250]; + sprintf(buf,"{\"value\": %d }", analog_sensor); + message.qos = MQTT::QOS0; + message.retained = false; + message.dup = false; + message.payload = (void*)buf; + message.payloadlen = strlen(buf); + + LOG("Publishing %s\n", buf); + return client->publish(pubTopic, message); +} + + +char* getMac(EthernetInterface& eth, char* buf, int buflen) // Obtain MAC address +{ + strncpy(buf, eth.getMACAddress(), buflen); + + char* pos; // Remove colons from mac address + while ((pos = strchr(buf, ':')) != NULL) + memmove(pos, pos + 1, strlen(pos) + 1); + return buf; +} + +int main() +{ + + led2 = LED2_OFF; // K64F: turn off the main board LED + + LOG("***** DeviceHub.net example *****\n"); + MQTTEthernet ipstack; + ethernetInitialising = false; + MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack); + LOG("Ethernet Initialized\n"); + + if (quickstartMode) + getMac(ipstack.getEth(), id, sizeof(id)); + + attemptConnect(&client, &ipstack); + + + blink_interval = 0; + int count = 0; + while (true) + { + if (++count == 100) + { // Publish a message every second + if (publish(&client, &ipstack) != 0) + attemptConnect(&client, &ipstack); // if we have lost the connection + count = 0; + } + + if (blink_interval == 0) + led2 = LED2_OFF; + else if (count % blink_interval == 0) + led2 = !led2; + client.yield(10); // allow the MQTT client to receive messages + } +}