BUTTON LED COMBO - ST IOT CHALLENGE 2020

Dependencies:   Cayenne-MQTT-mbed mbed X_NUCLEO_IDW01M1v2 NetworkSocketAPI

Files at this revision

API Documentation at this revision

Comitter:
jburhenn
Date:
Fri Oct 07 18:30:51 2016 +0000
Child:
1:a2d8aec2bb92
Commit message:
Example for connecting to Cayenne using an X-NUCLEO-IDW01M1 WiFi expansion board.

Changed in this revision

Cayenne-MQTT-Embedded-C.lib Show annotated file Show diff for this revision Revisions of this file
NetworkSocketAPI.lib Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_IDW01M1v2.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Cayenne-MQTT-Embedded-C.lib	Fri Oct 07 18:30:51 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/myDevicesIoT/code/Cayenne-MQTT-Embedded-C/#09ef59d2d0f7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NetworkSocketAPI.lib	Fri Oct 07 18:30:51 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/NetworkSocketAPI/code/NetworkSocketAPI/#ea3a618e0818
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_IDW01M1v2.lib	Fri Oct 07 18:30:51 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/ST/code/X_NUCLEO_IDW01M1v2/#4cd89586b370
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Oct 07 18:30:51 2016 +0000
@@ -0,0 +1,183 @@
+/**
+* Example app for using the Cayenne MQTT C++ library to send and receive example data. This example uses
+* the X-NUCLEO-IDW01M1 WiFi expansion board via the X_NUCLEO_IDW01M1v2 library.
+*/
+
+#include "MQTTTimer.h"
+#include "CayenneMQTTClient.h"
+#include "MQTTNetworkIDW01M1.h"
+#include "SpwfInterface.h"
+
+// WiFi network info.
+char* ssid = "ssid";
+char* wifiPassword = "wifiPassword";
+
+// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
+char* username = "MQTT_USERNAME";
+char* clientID = "CLIENT_ID";
+char* password = "MQTT_PASSWORD";
+
+SpwfSAInterface interface(D8, D2); // TX, RX
+MQTTNetwork<SpwfSAInterface> network(interface);
+Cayenne::MQTTClient<MQTTNetwork<SpwfSAInterface>, MQTTTimer> mqttClient(network);
+
+/**
+* Print the message info.
+* @param[in] message The message received from the Cayenne server.
+*/
+void outputMessage(Cayenne::MessageData& message)
+{
+    switch (message.topic)  {
+    case COMMAND_TOPIC:
+        printf("topic=Command");
+        break;
+    case CONFIG_TOPIC:
+        printf("topic=Config");
+        break;
+    default:
+        printf("topic=%d", message.topic);
+        break;
+    }
+    printf(" channel=%d", message.channel);
+    if (message.clientID) {
+        printf(" clientID=%s", message.clientID);
+    }
+    if (message.type) {
+        printf(" type=%s", message.type);
+    }
+    for (size_t i = 0; i < message.valueCount; ++i) {
+        if (message.values[i].value) {
+            printf(" value=%s", message.values[i].value);
+        }
+        if (message.values[i].unit) {
+            printf(" unit=%s", message.values[i].unit);
+        }
+    }
+    if (message.id) {
+        printf(" id=%s", message.id);
+    }
+    printf("\n");
+}
+
+/**
+* Handle messages received from the Cayenne server.
+* @param[in] message The message received from the Cayenne server.
+*/
+void messageArrived(Cayenne::MessageData& message)
+{
+    int error = 0;
+    // Add code to process the message. Here we just ouput the message data.
+    outputMessage(message);
+
+    // If this is a command message we publish a response. Here we are just sending a default 'OK' response.
+    // An error response should be sent if there are issues processing the message.
+    if (message.topic == COMMAND_TOPIC && (error = mqttClient.publishResponse(message.channel, message.id, NULL, message.clientID)) != CAYENNE_SUCCESS) {
+        printf("Response failure, error: %d\n", error);
+    }
+}
+
+/**
+* Connect to the Cayenne server.
+* @return Returns CAYENNE_SUCCESS if the connection succeeds, or an error code otherwise.
+*/
+int connectClient(void)
+{
+    int error = 0;
+    // Connect to the server.
+    printf("Connecting to %s:%d\n", CAYENNE_DOMAIN, CAYENNE_PORT);
+    while ((error = network.connect(CAYENNE_DOMAIN, CAYENNE_PORT)) != 0) {
+        printf("TCP connect failed, error: %d\n", error);
+        wait(2);
+    }
+
+    if ((error = mqttClient.connect(username, clientID, password)) != MQTT::SUCCESS) {
+        printf("MQTT connect failed, error: %d\n", error);
+        return error;
+    }
+    printf("Connected\n");
+
+    // Subscribe to required topics.
+    if ((error = mqttClient.subscribe(COMMAND_TOPIC, CAYENNE_ALL_CHANNELS)) != CAYENNE_SUCCESS) {
+        printf("Subscription to Command topic failed, error: %d\n", error);
+    }
+    if ((error = mqttClient.subscribe(CONFIG_TOPIC, CAYENNE_ALL_CHANNELS)) != CAYENNE_SUCCESS) {
+        printf("Subscription to Config topic failed, error:%d\n", error);
+    }
+
+    // Send device info. Here we just send some example values for the system info. These should be changed to use actual system data, or removed if not needed.
+    mqttClient.publishData(SYS_VERSION_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, CAYENNE_VERSION);
+    mqttClient.publishData(SYS_MODEL_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, "mbedDevice");
+    mqttClient.publishData(SYS_CPU_MODEL_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, "CPU Model");
+    mqttClient.publishData(SYS_CPU_SPEED_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, "1000000000");
+
+    return CAYENNE_SUCCESS;
+}
+
+/**
+* Main loop where MQTT code is run.
+*/
+void loop(void)
+{
+    MQTTTimer timer(5000);
+
+    while (true) {
+        // Yield to allow MQTT message processing.
+        mqttClient.yield(1000);
+
+        // Check that we are still connected, if not, reconnect.
+        if (!network.connected() || !mqttClient.connected()) {
+            network.disconnect();
+            mqttClient.disconnect();
+            printf("Reconnecting\n");
+            while (connectClient() != CAYENNE_SUCCESS) {
+                wait(2);
+                printf("Reconnect failed, retrying\n");
+            }
+        }
+
+        // Publish some example data every few seconds. This should be changed to send your actual data to Cayenne.
+        if (timer.expired()) {
+            int error = 0;
+            if ((error = mqttClient.publishData(DATA_TOPIC, 0, TEMPERATURE, CELSIUS, 30.5)) != CAYENNE_SUCCESS) {
+                printf("Publish temperature failed, error: %d\n", error);
+            }
+            if ((error = mqttClient.publishData(DATA_TOPIC, 1, LUMINOSITY, LUX, 1000)) != CAYENNE_SUCCESS) {
+                printf("Publish luminosity failed, error: %d\n", error);
+            }
+            if ((error = mqttClient.publishData(DATA_TOPIC, 2, BAROMETRIC_PRESSURE, HECTOPASCAL, 800)) != CAYENNE_SUCCESS) {
+                printf("Publish barometric pressure failed, error: %d\n", error);
+            }
+            timer.countdown_ms(5000);
+        }
+    }
+}
+
+/**
+* Main function.
+*/
+int main()
+{   
+    // Initialize the network interface.
+    printf("Initializing interface\n");
+    interface.connect(ssid, wifiPassword, NSAPI_SECURITY_WPA2);
+
+    // Set the default function that receives Cayenne messages.
+    mqttClient.setDefaultMessageHandler(messageArrived);
+
+    // Connect to Cayenne.
+    if (connectClient() == CAYENNE_SUCCESS) {
+        // Run main loop.
+        loop();
+    }
+    else {
+        printf("Connection failed, exiting\n");
+    }
+
+    if (mqttClient.connected())
+        mqttClient.disconnect();
+    if (network.connected())
+        network.disconnect();
+
+    return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Oct 07 18:30:51 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/25aea2a3f4e3
\ No newline at end of file