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

Dependencies:   EthernetInterface MQTT mbed-rtos mbed HC_SR04_Ultrasonic_Library

Fork of K64F-RTOS-MQTT-Example by Mike Baylis

Committer:
sim2egor
Date:
Wed Aug 02 15:34:50 2017 +0300
Revision:
2:24b2b10d3bc2
Parent:
1:9caf46f4ed3e
Child:
3:e33c80165703
myedit 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
msbaylis 0:9796509d718e 1 #include "mbed.h"
msbaylis 0:9796509d718e 2 #include "MQTTClient.h"
msbaylis 0:9796509d718e 3 #include "MQTTEthernet.h"
msbaylis 0:9796509d718e 4 #include "rtos.h"
msbaylis 0:9796509d718e 5 #include "k64f.h"
msbaylis 0:9796509d718e 6
msbaylis 0:9796509d718e 7 // connect options for MQTT broker
sim2egor 1:9caf46f4ed3e 8 #define BROKER "192.168.1.133"//"broker.mqttdashboard.com" // MQTT broker URL
msbaylis 0:9796509d718e 9 #define PORT 1883 // MQTT broker port number
sim2egor 1:9caf46f4ed3e 10 #define CLIENTID "cd23787" // use K64F MAC address without colons
sim2egor 1:9caf46f4ed3e 11 #define USERNAME "c1" // not required for MQTT Dashboard public broker
msbaylis 0:9796509d718e 12 #define PASSWORD "" // not required for MQTT Dashboard public broker
sim2egor 1:9caf46f4ed3e 13 #define TOPIC "3435" // MQTT topic
msbaylis 0:9796509d718e 14
msbaylis 0:9796509d718e 15 Queue<uint32_t, 6> messageQ;
msbaylis 0:9796509d718e 16
msbaylis 0:9796509d718e 17 // LED color control function
msbaylis 0:9796509d718e 18 void controlLED(color_t led_color) {
msbaylis 0:9796509d718e 19 switch(led_color) {
msbaylis 0:9796509d718e 20 case red :
msbaylis 0:9796509d718e 21 greenLED = blueLED = 1;
msbaylis 0:9796509d718e 22 redLED = 0.7;
msbaylis 0:9796509d718e 23 break;
msbaylis 0:9796509d718e 24 case green :
msbaylis 0:9796509d718e 25 redLED = blueLED = 1;
msbaylis 0:9796509d718e 26 greenLED = 0.7;
msbaylis 0:9796509d718e 27 break;
msbaylis 0:9796509d718e 28 case blue :
msbaylis 0:9796509d718e 29 redLED = greenLED = 1;
msbaylis 0:9796509d718e 30 blueLED = 0.7;
msbaylis 0:9796509d718e 31 break;
msbaylis 0:9796509d718e 32 case off :
msbaylis 0:9796509d718e 33 redLED = greenLED = blueLED = 1;
msbaylis 0:9796509d718e 34 break;
msbaylis 0:9796509d718e 35 }
msbaylis 0:9796509d718e 36 }
msbaylis 0:9796509d718e 37
msbaylis 0:9796509d718e 38 // Switch 2 interrupt handler
msbaylis 0:9796509d718e 39 void sw2_ISR(void) {
msbaylis 0:9796509d718e 40 messageQ.put((uint32_t*)22);
msbaylis 0:9796509d718e 41 }
msbaylis 0:9796509d718e 42
msbaylis 0:9796509d718e 43 // Switch3 interrupt handler
msbaylis 0:9796509d718e 44 void sw3_ISR(void) {
msbaylis 0:9796509d718e 45 messageQ.put((uint32_t*)33);
msbaylis 0:9796509d718e 46 }
msbaylis 0:9796509d718e 47
msbaylis 0:9796509d718e 48 // MQTT message arrived callback function
msbaylis 0:9796509d718e 49 void messageArrived(MQTT::MessageData& md) {
msbaylis 0:9796509d718e 50 MQTT::Message &message = md.message;
sim2egor 2:24b2b10d3bc2 51
msbaylis 0:9796509d718e 52 pc.printf("Receiving MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
msbaylis 0:9796509d718e 53
msbaylis 0:9796509d718e 54 if (message.payloadlen == 3) {
msbaylis 0:9796509d718e 55 if (strncmp((char*)message.payload, "red", 3) == 0)
msbaylis 0:9796509d718e 56 controlLED(red);
msbaylis 0:9796509d718e 57
msbaylis 0:9796509d718e 58 else if(strncmp((char*)message.payload, "grn", 3) == 0)
msbaylis 0:9796509d718e 59 controlLED(green);
msbaylis 0:9796509d718e 60
msbaylis 0:9796509d718e 61 else if(strncmp((char*)message.payload, "blu", 3) == 0)
msbaylis 0:9796509d718e 62 controlLED(blue);
msbaylis 0:9796509d718e 63
msbaylis 0:9796509d718e 64 else if(strncmp((char*)message.payload, "off", 3) == 0)
msbaylis 0:9796509d718e 65 controlLED(off);
msbaylis 0:9796509d718e 66 }
msbaylis 0:9796509d718e 67 }
msbaylis 0:9796509d718e 68
msbaylis 0:9796509d718e 69 int main() {
msbaylis 0:9796509d718e 70 // turn off LED
msbaylis 0:9796509d718e 71 controlLED(off);
msbaylis 0:9796509d718e 72
msbaylis 0:9796509d718e 73 // set SW2 and SW3 to generate interrupt on falling edge
msbaylis 0:9796509d718e 74 switch2.fall(&sw2_ISR);
msbaylis 0:9796509d718e 75 switch3.fall(&sw3_ISR);
sim2egor 2:24b2b10d3bc2 76 pc.baud(115200);
msbaylis 0:9796509d718e 77 pc.printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n");
msbaylis 0:9796509d718e 78 pc.printf("\r\nAttempting connect to local network...\r\n");
msbaylis 0:9796509d718e 79
msbaylis 0:9796509d718e 80 // initialize ethernet interface
msbaylis 0:9796509d718e 81 MQTTEthernet ipstack = MQTTEthernet();
msbaylis 0:9796509d718e 82
msbaylis 0:9796509d718e 83 // get and display client network info
msbaylis 0:9796509d718e 84 EthernetInterface& eth = ipstack.getEth();
msbaylis 0:9796509d718e 85 pc.printf("IP address is %s\r\n", eth.getIPAddress());
msbaylis 0:9796509d718e 86 pc.printf("MAC address is %s\r\n", eth.getMACAddress());
msbaylis 0:9796509d718e 87 pc.printf("Gateway address is %s\r\n", eth.getGateway());
msbaylis 0:9796509d718e 88
msbaylis 0:9796509d718e 89 // construct the MQTT client
msbaylis 0:9796509d718e 90 MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
msbaylis 0:9796509d718e 91
msbaylis 0:9796509d718e 92 char* hostname = BROKER;
msbaylis 0:9796509d718e 93 int port = PORT;
msbaylis 0:9796509d718e 94 int rc;
msbaylis 0:9796509d718e 95
msbaylis 0:9796509d718e 96 pc.printf("\r\nAttempting TCP connect to %s:%d: ", hostname, port);
msbaylis 0:9796509d718e 97
msbaylis 0:9796509d718e 98 // connect to TCP socket and check return code
msbaylis 0:9796509d718e 99 if ((rc = ipstack.connect(hostname, port)) != 0)
msbaylis 0:9796509d718e 100 pc.printf("failed: rc= %d\r\n", rc);
msbaylis 0:9796509d718e 101
msbaylis 0:9796509d718e 102 else
msbaylis 0:9796509d718e 103 pc.printf("success\r\n");
msbaylis 0:9796509d718e 104
msbaylis 0:9796509d718e 105 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
msbaylis 0:9796509d718e 106 data.MQTTVersion = 3;
msbaylis 0:9796509d718e 107 data.clientID.cstring = CLIENTID;
msbaylis 0:9796509d718e 108 // data.username.cstring = USERNAME;
msbaylis 0:9796509d718e 109 // data.password.cstring = PASSWORD;
msbaylis 0:9796509d718e 110
msbaylis 0:9796509d718e 111 // send MQTT connect packet and check return code
msbaylis 0:9796509d718e 112 pc.printf("Attempting MQTT connect to %s:%d: ", hostname, port);
msbaylis 0:9796509d718e 113 if ((rc = client.connect(data)) != 0)
msbaylis 0:9796509d718e 114 pc.printf("failed: rc= %d\r\n", rc);
msbaylis 0:9796509d718e 115
msbaylis 0:9796509d718e 116 else
msbaylis 0:9796509d718e 117 pc.printf("success\r\n");
msbaylis 0:9796509d718e 118
msbaylis 0:9796509d718e 119 char* topic = TOPIC;
msbaylis 0:9796509d718e 120
msbaylis 0:9796509d718e 121 // subscribe to MQTT topic
msbaylis 0:9796509d718e 122 pc.printf("Subscribing to MQTT topic %s: ", topic);
msbaylis 0:9796509d718e 123 if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0)
msbaylis 0:9796509d718e 124 pc.printf("failed: rc= %d\r\n", rc);
msbaylis 0:9796509d718e 125
msbaylis 0:9796509d718e 126 else
msbaylis 0:9796509d718e 127 pc.printf("success\r\n");
msbaylis 0:9796509d718e 128
msbaylis 0:9796509d718e 129 MQTT::Message message;
msbaylis 0:9796509d718e 130 char buf[100];
msbaylis 0:9796509d718e 131 message.qos = MQTT::QOS0;
msbaylis 0:9796509d718e 132 message.retained = false;
msbaylis 0:9796509d718e 133 message.dup = false;
msbaylis 0:9796509d718e 134 message.payload = (void*)buf;
msbaylis 0:9796509d718e 135 message.payloadlen = strlen(buf)+1;
msbaylis 0:9796509d718e 136
msbaylis 0:9796509d718e 137 while(true) {
msbaylis 0:9796509d718e 138 osEvent switchEvent = messageQ.get(100);
msbaylis 0:9796509d718e 139
msbaylis 0:9796509d718e 140 if (switchEvent.value.v == 22 || switchEvent.value.v == 33) {
msbaylis 0:9796509d718e 141 switch(switchEvent.value.v) {
msbaylis 0:9796509d718e 142 case 22 :
msbaylis 0:9796509d718e 143 sprintf(buf, "sw2");
msbaylis 0:9796509d718e 144 break;
msbaylis 0:9796509d718e 145 case 33 :
msbaylis 0:9796509d718e 146 sprintf(buf, "sw3");
msbaylis 0:9796509d718e 147 break;
msbaylis 0:9796509d718e 148 }
msbaylis 0:9796509d718e 149 pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
msbaylis 0:9796509d718e 150 rc = client.publish(topic, message);
msbaylis 0:9796509d718e 151 client.yield(100);
msbaylis 0:9796509d718e 152 }
msbaylis 0:9796509d718e 153
msbaylis 0:9796509d718e 154 else {
msbaylis 0:9796509d718e 155 client.yield(100);
msbaylis 0:9796509d718e 156 }
msbaylis 0:9796509d718e 157 }
msbaylis 0:9796509d718e 158 }