MQTT example using the Freescale FRDM-K64F platform without additional hardware.

Dependencies:   EthernetInterface MQTT mbed-rtos mbed

This is a simple MQTT demo that does the following:

- connect/disconnect to the MQTT Dashboard public broker (broker.mqttdashboard.com)

- subscribe to a user-defined MQTT topic

- publish messages from the FRDM-K64F board when SW2 or SW3 is pressed

- receive messages from a web dashboard client to change the color of the LED

- send serial output regarding connection status and MQTT messages sent/received

The web client code can be found at the following URL:

https://github.com/msbaylis/frdm-k64f-mqtt-dashboard.git

NOTE: make sure you change the #defines in main.cpp to specify your client ID and MQTT topic. I used the MAC address of my FRDM-K64F board without colons for the client ID. Assuming you're board is properly connected to a network, the serial output should display info including the board's MAC address.

Files at this revision

API Documentation at this revision

Comitter:
msbaylis
Date:
Wed Feb 10 18:39:26 2016 +0000
Commit message:
Initial committ

Changed in this revision

EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
MQTT.lib Show annotated file Show diff for this revision Revisions of this file
k64f.h 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-rtos.lib 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
diff -r 000000000000 -r 9796509d718e EthernetInterface.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Wed Feb 10 18:39:26 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/EthernetInterface/#2fc406e2553f
diff -r 000000000000 -r 9796509d718e MQTT.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MQTT.lib	Wed Feb 10 18:39:26 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/mqtt/code/MQTT/#e335fcc1a663
diff -r 000000000000 -r 9796509d718e k64f.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/k64f.h	Wed Feb 10 18:39:26 2016 +0000
@@ -0,0 +1,13 @@
+#ifndef K64F_H_
+#define K64F_H_
+
+typedef enum color {off, red, green, blue} color_t;
+
+Serial pc(USBTX, USBRX);
+DigitalOut redLED(LED_RED);
+DigitalOut greenLED(LED_GREEN);
+DigitalOut blueLED(LED_BLUE);
+InterruptIn switch2(SW2);
+InterruptIn switch3(SW3);
+
+#endif // K64F.H 
\ No newline at end of file
diff -r 000000000000 -r 9796509d718e main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Feb 10 18:39:26 2016 +0000
@@ -0,0 +1,157 @@
+#include "mbed.h"
+#include "MQTTClient.h"
+#include "MQTTEthernet.h"
+#include "rtos.h"
+#include "k64f.h"
+
+// connect options for MQTT broker
+#define BROKER "broker.mqttdashboard.com"   // MQTT broker URL
+#define PORT 1883                           // MQTT broker port number
+#define CLIENTID ""                         // use K64F MAC address without colons
+#define USERNAME ""                         // not required for MQTT Dashboard public broker 
+#define PASSWORD ""                         // not required for MQTT Dashboard public broker
+#define TOPIC ""                            // MQTT topic
+
+Queue<uint32_t, 6> messageQ;
+
+// LED color control function
+void controlLED(color_t led_color) {
+    switch(led_color) {
+        case red :
+            greenLED = blueLED = 1;          
+            redLED = 0.7;
+            break;
+        case green :
+            redLED = blueLED = 1;
+            greenLED = 0.7;
+            break;
+        case blue :
+            redLED = greenLED = 1;
+            blueLED = 0.7;
+            break;
+        case off :
+            redLED = greenLED = blueLED = 1;
+            break;
+    }
+}
+    
+// Switch 2 interrupt handler
+void sw2_ISR(void) {
+    messageQ.put((uint32_t*)22);
+}
+
+// Switch3 interrupt handler
+void sw3_ISR(void) {
+    messageQ.put((uint32_t*)33);
+}
+ 
+// MQTT message arrived callback function
+void messageArrived(MQTT::MessageData& md) {
+    MQTT::Message &message = md.message;
+    pc.printf("Receiving MQTT message:  %.*s\r\n", message.payloadlen, (char*)message.payload);
+    
+    if (message.payloadlen == 3) {
+        if (strncmp((char*)message.payload, "red", 3) == 0)
+            controlLED(red);
+        
+        else if(strncmp((char*)message.payload, "grn", 3) == 0)
+            controlLED(green);
+        
+        else if(strncmp((char*)message.payload, "blu", 3) == 0)
+            controlLED(blue);
+        
+        else if(strncmp((char*)message.payload, "off", 3) == 0)
+            controlLED(off);
+    }        
+}
+
+int main() {
+    // turn off LED  
+    controlLED(off);
+    
+    // set SW2 and SW3 to generate interrupt on falling edge 
+    switch2.fall(&sw2_ISR);
+    switch3.fall(&sw3_ISR);
+    
+    pc.printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n");
+    pc.printf("\r\nAttempting connect to local network...\r\n");
+        
+    // initialize ethernet interface
+    MQTTEthernet ipstack = MQTTEthernet();
+    
+    // get and display client network info
+    EthernetInterface& eth = ipstack.getEth();
+    pc.printf("IP address is %s\r\n", eth.getIPAddress());
+    pc.printf("MAC address is %s\r\n", eth.getMACAddress());
+    pc.printf("Gateway address is %s\r\n", eth.getGateway());
+    
+    // construct the MQTT client
+    MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
+    
+    char* hostname = BROKER;
+    int port = PORT;
+    int rc;
+    
+    pc.printf("\r\nAttempting TCP connect to %s:%d:  ", hostname, port);
+    
+    // connect to TCP socket and check return code
+    if ((rc = ipstack.connect(hostname, port)) != 0)
+        pc.printf("failed: rc= %d\r\n", rc);
+        
+    else
+        pc.printf("success\r\n");
+    
+    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
+    data.MQTTVersion = 3;
+    data.clientID.cstring = CLIENTID;
+//    data.username.cstring = USERNAME;
+//    data.password.cstring = PASSWORD;
+    
+    // send MQTT connect packet and check return code
+    pc.printf("Attempting MQTT connect to %s:%d: ", hostname, port);
+    if ((rc = client.connect(data)) != 0)
+        pc.printf("failed: rc= %d\r\n", rc);
+        
+    else
+        pc.printf("success\r\n");
+        
+    char* topic = TOPIC;
+    
+    // subscribe to MQTT topic
+    pc.printf("Subscribing to MQTT topic %s: ", topic);
+    if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0)
+        pc.printf("failed: rc= %d\r\n", rc);
+        
+    else
+        pc.printf("success\r\n");
+        
+    MQTT::Message message;
+    char buf[100];
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf)+1;
+    
+    while(true) {
+        osEvent switchEvent = messageQ.get(100);
+        
+        if (switchEvent.value.v == 22 || switchEvent.value.v == 33) {
+            switch(switchEvent.value.v) {
+                case 22 :
+                    sprintf(buf, "sw2");
+                    break;
+                case 33 :
+                    sprintf(buf, "sw3");
+                    break;
+            }
+            pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
+            rc = client.publish(topic, message);
+            client.yield(100);
+        }
+        
+        else {
+            client.yield(100);
+        }           
+    }
+}
diff -r 000000000000 -r 9796509d718e mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Wed Feb 10 18:39:26 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#21b438192b0f
diff -r 000000000000 -r 9796509d718e mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Feb 10 18:39:26 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/8ed44a420e5c
\ No newline at end of file