Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface MQTT mbed-rtos mbed
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 }
Generated on Sun Jul 24 2022 07:58:05 by
1.7.2