Mike Baylis / Mbed 2 deprecated K64F-RTOS-MQTT-Example

Dependencies:   EthernetInterface MQTT mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "MQTTClient.h"
00003 #include "MQTTEthernet.h"
00004 #include "rtos.h"
00005 #include "k64f.h"
00006 
00007 // connect options for MQTT broker
00008 #define BROKER "broker.mqttdashboard.com"   // MQTT broker URL
00009 #define PORT 1883                           // MQTT broker port number
00010 #define CLIENTID ""                         // use K64F MAC address without colons
00011 #define USERNAME ""                         // not required for MQTT Dashboard public broker 
00012 #define PASSWORD ""                         // not required for MQTT Dashboard public broker
00013 #define TOPIC ""                            // MQTT topic
00014 
00015 Queue<uint32_t, 6> messageQ;
00016 
00017 // LED color control function
00018 void controlLED(color_t led_color) {
00019     switch(led_color) {
00020         case red :
00021             greenLED = blueLED = 1;          
00022             redLED = 0.7;
00023             break;
00024         case green :
00025             redLED = blueLED = 1;
00026             greenLED = 0.7;
00027             break;
00028         case blue :
00029             redLED = greenLED = 1;
00030             blueLED = 0.7;
00031             break;
00032         case off :
00033             redLED = greenLED = blueLED = 1;
00034             break;
00035     }
00036 }
00037     
00038 // Switch 2 interrupt handler
00039 void sw2_ISR(void) {
00040     messageQ.put((uint32_t*)22);
00041 }
00042 
00043 // Switch3 interrupt handler
00044 void sw3_ISR(void) {
00045     messageQ.put((uint32_t*)33);
00046 }
00047  
00048 // MQTT message arrived callback function
00049 void messageArrived(MQTT::MessageData& md) {
00050     MQTT::Message &message = md.message;
00051     pc.printf("Receiving MQTT message:  %.*s\r\n", message.payloadlen, (char*)message.payload);
00052     
00053     if (message.payloadlen == 3) {
00054         if (strncmp((char*)message.payload, "red", 3) == 0)
00055             controlLED(red);
00056         
00057         else if(strncmp((char*)message.payload, "grn", 3) == 0)
00058             controlLED(green);
00059         
00060         else if(strncmp((char*)message.payload, "blu", 3) == 0)
00061             controlLED(blue);
00062         
00063         else if(strncmp((char*)message.payload, "off", 3) == 0)
00064             controlLED(off);
00065     }        
00066 }
00067 
00068 int main() {
00069     // turn off LED  
00070     controlLED(off);
00071     
00072     // set SW2 and SW3 to generate interrupt on falling edge 
00073     switch2.fall(&sw2_ISR);
00074     switch3.fall(&sw3_ISR);
00075     
00076     pc.printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n");
00077     pc.printf("\r\nAttempting connect to local network...\r\n");
00078         
00079     // initialize ethernet interface
00080     MQTTEthernet ipstack = MQTTEthernet();
00081     
00082     // get and display client network info
00083     EthernetInterface& eth = ipstack.getEth();
00084     pc.printf("IP address is %s\r\n", eth.getIPAddress());
00085     pc.printf("MAC address is %s\r\n", eth.getMACAddress());
00086     pc.printf("Gateway address is %s\r\n", eth.getGateway());
00087     
00088     // construct the MQTT client
00089     MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
00090     
00091     char* hostname = BROKER;
00092     int port = PORT;
00093     int rc;
00094     
00095     pc.printf("\r\nAttempting TCP connect to %s:%d:  ", hostname, port);
00096     
00097     // connect to TCP socket and check return code
00098     if ((rc = ipstack.connect(hostname, port)) != 0)
00099         pc.printf("failed: rc= %d\r\n", rc);
00100         
00101     else
00102         pc.printf("success\r\n");
00103     
00104     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
00105     data.MQTTVersion = 3;
00106     data.clientID.cstring = CLIENTID;
00107 //    data.username.cstring = USERNAME;
00108 //    data.password.cstring = PASSWORD;
00109     
00110     // send MQTT connect packet and check return code
00111     pc.printf("Attempting MQTT connect to %s:%d: ", hostname, port);
00112     if ((rc = client.connect(data)) != 0)
00113         pc.printf("failed: rc= %d\r\n", rc);
00114         
00115     else
00116         pc.printf("success\r\n");
00117         
00118     char* topic = TOPIC;
00119     
00120     // subscribe to MQTT topic
00121     pc.printf("Subscribing to MQTT topic %s: ", topic);
00122     if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0)
00123         pc.printf("failed: rc= %d\r\n", rc);
00124         
00125     else
00126         pc.printf("success\r\n");
00127         
00128     MQTT::Message message;
00129     char buf[100];
00130     message.qos = MQTT::QOS0;
00131     message.retained = false;
00132     message.dup = false;
00133     message.payload = (void*)buf;
00134     message.payloadlen = strlen(buf)+1;
00135     
00136     while(true) {
00137         osEvent switchEvent = messageQ.get(100);
00138         
00139         if (switchEvent.value.v == 22 || switchEvent.value.v == 33) {
00140             switch(switchEvent.value.v) {
00141                 case 22 :
00142                     sprintf(buf, "sw2");
00143                     break;
00144                 case 33 :
00145                     sprintf(buf, "sw3");
00146                     break;
00147             }
00148             pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
00149             rc = client.publish(topic, message);
00150             client.yield(100);
00151         }
00152         
00153         else {
00154             client.yield(100);
00155         }           
00156     }
00157 }