Working example code TCP 1883.

Dependencies:   EthernetInterface MQTT mbed-rtos mbed

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

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 // connect options for MQTT broker
00007 #define BROKER "192.168.0.29"   // MQTT broker URL
00008 #define PORT 1883                           // MQTT broker port number
00009 #define CLIENTID "0002F7F000"      // use K64F MAC address without colons
00010 #define USERNAME ""                         // not required for MQTT Dashboard public broker 
00011 #define PASSWORD ""                         // not required for MQTT Dashboard public broker
00012 #define TOPIC "testeroo"                    // MQTT topic
00013 
00014 Queue<uint32_t, 6> messageQ;
00015 bool flash = false;
00016 int thresh = 3;
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, "add", 3) == 0)
00058             {controlLED(off);
00059             controlLED(green);
00060             wait(.1);
00061             controlLED(off);}
00062         
00063         else if(strncmp((char*)message.payload, "blu", 3) == 0)
00064             controlLED(blue);
00065         
00066         else if(strncmp((char*)message.payload, "off", 3) == 0)
00067             controlLED(off);
00068             
00069         else if(strncmp((char*)message.payload, "b1o", 3) == 0)
00070             flash = true;
00071         else if(strncmp((char*)message.payload, "b1u", 3) == 0)
00072             {flash = false;
00073             controlLED(off);
00074             controlLED(blue);
00075             wait(.1);
00076             controlLED(off);}
00077         else if(strncmp((char*)message.payload, "new", 3)==0)
00078             {controlLED(off);
00079             controlLED(blue);
00080             wait(.1);
00081             controlLED(off);}
00082         
00083   //  }        
00084 }
00085 
00086 int main() {
00087     // turn off LED  
00088     controlLED(red);
00089     
00090     // set SW2 and SW3 to generate interrupt on falling edge 
00091     switch2.fall(&sw2_ISR);
00092     switch3.fall(&sw3_ISR);
00093     
00094     pc.printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n");
00095     pc.printf("\r\nAttempting connect to local network...\r\n");
00096         
00097     // initialize ethernet interface
00098     MQTTEthernet ipstack = MQTTEthernet();
00099     
00100     // get and display client network info
00101     EthernetInterface& eth = ipstack.getEth();
00102     pc.printf("IP address is %s\r\n", eth.getIPAddress());
00103     pc.printf("MAC address is %s\r\n", eth.getMACAddress());
00104     pc.printf("Gateway address is %s\r\n", eth.getGateway());
00105     
00106     
00107     // construct the MQTT client
00108     MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
00109     
00110     char* hostname = BROKER;
00111     int port = PORT;
00112     int rc;
00113     
00114     pc.printf("\r\nAttempting TCP connect to %s:%d:  ", hostname, port);
00115     
00116     // connect to TCP socket and check return code
00117     if ((rc = ipstack.connect(hostname, port)) != 0){
00118         pc.printf("failed: rc= %d\r\n", rc);
00119         controlLED(blue);}
00120         
00121     else
00122         pc.printf("success\r\n");
00123     
00124     
00125     //client starts building connection request to the broker
00126     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
00127     data.MQTTVersion = 3;
00128     data.clientID.cstring = CLIENTID;
00129 //    data.username.cstring = USERNAME;
00130 //    data.password.cstring = PASSWORD;
00131     
00132     // send MQTT connect packet and check return code
00133     pc.printf("Attempting MQTT connect to %s:%d: ", hostname, port);
00134     if ((rc = client.connect(data)) != 0){
00135         pc.printf("failed: rc= %d\r\n", rc);
00136         controlLED(green);}
00137     else{
00138         pc.printf("success\r\n");
00139         controlLED(off);}
00140         
00141     char* topic = TOPIC;
00142     
00143     // subscribe to MQTT topic
00144     pc.printf("Subscribing to MQTT topic %s: ", topic);
00145     if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0)
00146         pc.printf("failed: rc= %d\r\n", rc);
00147         
00148     else
00149         pc.printf("success\r\n");
00150         
00151     MQTT::Message message;
00152     char buf[100];
00153     message.qos = MQTT::QOS0;
00154     message.retained = false;
00155     message.dup = false;
00156     message.payload = (void*)buf;
00157     message.payloadlen = strlen(buf)+1;
00158     int counter = 0;
00159     
00160     while(true) {
00161         osEvent switchEvent = messageQ.get(100);
00162         
00163 
00164         if(flash){
00165             controlLED(red);
00166             wait(.25);
00167             controlLED(off);
00168             wait(.25);
00169         }
00170         
00171         if (switchEvent.value.v == 22 || switchEvent.value.v == 33) {
00172             switch(switchEvent.value.v) {
00173                 case 22 :
00174                     if(counter == thresh){sprintf(buf, "b1o");}
00175                     else{sprintf(buf, "add");}
00176                     counter++;
00177                     break;
00178                 case 33 :
00179                     
00180                     if(counter == (thresh+1)){sprintf(buf, "b1u");}
00181                     else{sprintf(buf, "new");}
00182                     if(counter > 0){counter--;}
00183                     break;
00184             }
00185 
00186             
00187             pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
00188             rc = client.publish(topic, message);
00189             client.yield(100);
00190             
00191         }
00192         
00193         else {
00194             client.yield(100);
00195         }           
00196     }
00197 }