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.
Revision 0:9796509d718e, committed 2016-02-10
- Comitter:
- msbaylis
- Date:
- Wed Feb 10 18:39:26 2016 +0000
- Commit message:
- Initial committ
Changed in this revision
--- /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
--- /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
--- /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
--- /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); + } + } +}
--- /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
--- /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