Working example code TCP 1883.

Dependencies:   EthernetInterface MQTT mbed-rtos mbed

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

Committer:
ryanqfeeney
Date:
Mon Mar 20 17:10:21 2017 +0000
Revision:
2:005cdf4e8fb3
Parent:
1:9e3ca45e51b5
Working with board and node server.; Change the host to the local; ip of the computer running the server

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 // connect options for MQTT broker
ryanqfeeney 2:005cdf4e8fb3 7 #define BROKER "192.168.0.29" // MQTT broker URL
msbaylis 0:9796509d718e 8 #define PORT 1883 // MQTT broker port number
ryanqfeeney 1:9e3ca45e51b5 9 #define CLIENTID "0002F7F000" // use K64F MAC address without colons
msbaylis 0:9796509d718e 10 #define USERNAME "" // not required for MQTT Dashboard public broker
msbaylis 0:9796509d718e 11 #define PASSWORD "" // not required for MQTT Dashboard public broker
ryanqfeeney 1:9e3ca45e51b5 12 #define TOPIC "testeroo" // MQTT topic
msbaylis 0:9796509d718e 13
msbaylis 0:9796509d718e 14 Queue<uint32_t, 6> messageQ;
ryanqfeeney 2:005cdf4e8fb3 15 bool flash = false;
ryanqfeeney 2:005cdf4e8fb3 16 int thresh = 3;
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;
msbaylis 0:9796509d718e 51 pc.printf("Receiving MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
msbaylis 0:9796509d718e 52
ryanqfeeney 2:005cdf4e8fb3 53 // if (message.payloadlen == 3) {
msbaylis 0:9796509d718e 54 if (strncmp((char*)message.payload, "red", 3) == 0)
msbaylis 0:9796509d718e 55 controlLED(red);
msbaylis 0:9796509d718e 56
ryanqfeeney 2:005cdf4e8fb3 57 else if(strncmp((char*)message.payload, "add", 3) == 0)
ryanqfeeney 2:005cdf4e8fb3 58 {controlLED(off);
msbaylis 0:9796509d718e 59 controlLED(green);
ryanqfeeney 2:005cdf4e8fb3 60 wait(.1);
ryanqfeeney 2:005cdf4e8fb3 61 controlLED(off);}
msbaylis 0:9796509d718e 62
msbaylis 0:9796509d718e 63 else if(strncmp((char*)message.payload, "blu", 3) == 0)
msbaylis 0:9796509d718e 64 controlLED(blue);
msbaylis 0:9796509d718e 65
msbaylis 0:9796509d718e 66 else if(strncmp((char*)message.payload, "off", 3) == 0)
msbaylis 0:9796509d718e 67 controlLED(off);
ryanqfeeney 2:005cdf4e8fb3 68
ryanqfeeney 2:005cdf4e8fb3 69 else if(strncmp((char*)message.payload, "b1o", 3) == 0)
ryanqfeeney 2:005cdf4e8fb3 70 flash = true;
ryanqfeeney 2:005cdf4e8fb3 71 else if(strncmp((char*)message.payload, "b1u", 3) == 0)
ryanqfeeney 2:005cdf4e8fb3 72 {flash = false;
ryanqfeeney 2:005cdf4e8fb3 73 controlLED(off);
ryanqfeeney 2:005cdf4e8fb3 74 controlLED(blue);
ryanqfeeney 2:005cdf4e8fb3 75 wait(.1);
ryanqfeeney 2:005cdf4e8fb3 76 controlLED(off);}
ryanqfeeney 2:005cdf4e8fb3 77 else if(strncmp((char*)message.payload, "new", 3)==0)
ryanqfeeney 2:005cdf4e8fb3 78 {controlLED(off);
ryanqfeeney 2:005cdf4e8fb3 79 controlLED(blue);
ryanqfeeney 2:005cdf4e8fb3 80 wait(.1);
ryanqfeeney 2:005cdf4e8fb3 81 controlLED(off);}
ryanqfeeney 2:005cdf4e8fb3 82
ryanqfeeney 2:005cdf4e8fb3 83 // }
msbaylis 0:9796509d718e 84 }
msbaylis 0:9796509d718e 85
msbaylis 0:9796509d718e 86 int main() {
msbaylis 0:9796509d718e 87 // turn off LED
ryanqfeeney 1:9e3ca45e51b5 88 controlLED(red);
msbaylis 0:9796509d718e 89
msbaylis 0:9796509d718e 90 // set SW2 and SW3 to generate interrupt on falling edge
msbaylis 0:9796509d718e 91 switch2.fall(&sw2_ISR);
msbaylis 0:9796509d718e 92 switch3.fall(&sw3_ISR);
msbaylis 0:9796509d718e 93
msbaylis 0:9796509d718e 94 pc.printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n");
msbaylis 0:9796509d718e 95 pc.printf("\r\nAttempting connect to local network...\r\n");
msbaylis 0:9796509d718e 96
msbaylis 0:9796509d718e 97 // initialize ethernet interface
msbaylis 0:9796509d718e 98 MQTTEthernet ipstack = MQTTEthernet();
msbaylis 0:9796509d718e 99
msbaylis 0:9796509d718e 100 // get and display client network info
msbaylis 0:9796509d718e 101 EthernetInterface& eth = ipstack.getEth();
msbaylis 0:9796509d718e 102 pc.printf("IP address is %s\r\n", eth.getIPAddress());
msbaylis 0:9796509d718e 103 pc.printf("MAC address is %s\r\n", eth.getMACAddress());
msbaylis 0:9796509d718e 104 pc.printf("Gateway address is %s\r\n", eth.getGateway());
msbaylis 0:9796509d718e 105
ryanqfeeney 1:9e3ca45e51b5 106
msbaylis 0:9796509d718e 107 // construct the MQTT client
msbaylis 0:9796509d718e 108 MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
msbaylis 0:9796509d718e 109
msbaylis 0:9796509d718e 110 char* hostname = BROKER;
msbaylis 0:9796509d718e 111 int port = PORT;
msbaylis 0:9796509d718e 112 int rc;
msbaylis 0:9796509d718e 113
msbaylis 0:9796509d718e 114 pc.printf("\r\nAttempting TCP connect to %s:%d: ", hostname, port);
msbaylis 0:9796509d718e 115
msbaylis 0:9796509d718e 116 // connect to TCP socket and check return code
ryanqfeeney 1:9e3ca45e51b5 117 if ((rc = ipstack.connect(hostname, port)) != 0){
msbaylis 0:9796509d718e 118 pc.printf("failed: rc= %d\r\n", rc);
ryanqfeeney 1:9e3ca45e51b5 119 controlLED(blue);}
msbaylis 0:9796509d718e 120
msbaylis 0:9796509d718e 121 else
msbaylis 0:9796509d718e 122 pc.printf("success\r\n");
msbaylis 0:9796509d718e 123
ryanqfeeney 2:005cdf4e8fb3 124
ryanqfeeney 2:005cdf4e8fb3 125 //client starts building connection request to the broker
msbaylis 0:9796509d718e 126 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
msbaylis 0:9796509d718e 127 data.MQTTVersion = 3;
msbaylis 0:9796509d718e 128 data.clientID.cstring = CLIENTID;
msbaylis 0:9796509d718e 129 // data.username.cstring = USERNAME;
msbaylis 0:9796509d718e 130 // data.password.cstring = PASSWORD;
msbaylis 0:9796509d718e 131
msbaylis 0:9796509d718e 132 // send MQTT connect packet and check return code
msbaylis 0:9796509d718e 133 pc.printf("Attempting MQTT connect to %s:%d: ", hostname, port);
ryanqfeeney 1:9e3ca45e51b5 134 if ((rc = client.connect(data)) != 0){
msbaylis 0:9796509d718e 135 pc.printf("failed: rc= %d\r\n", rc);
ryanqfeeney 1:9e3ca45e51b5 136 controlLED(green);}
ryanqfeeney 1:9e3ca45e51b5 137 else{
msbaylis 0:9796509d718e 138 pc.printf("success\r\n");
ryanqfeeney 1:9e3ca45e51b5 139 controlLED(off);}
msbaylis 0:9796509d718e 140
msbaylis 0:9796509d718e 141 char* topic = TOPIC;
msbaylis 0:9796509d718e 142
msbaylis 0:9796509d718e 143 // subscribe to MQTT topic
msbaylis 0:9796509d718e 144 pc.printf("Subscribing to MQTT topic %s: ", topic);
msbaylis 0:9796509d718e 145 if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0)
msbaylis 0:9796509d718e 146 pc.printf("failed: rc= %d\r\n", rc);
msbaylis 0:9796509d718e 147
msbaylis 0:9796509d718e 148 else
msbaylis 0:9796509d718e 149 pc.printf("success\r\n");
msbaylis 0:9796509d718e 150
msbaylis 0:9796509d718e 151 MQTT::Message message;
msbaylis 0:9796509d718e 152 char buf[100];
msbaylis 0:9796509d718e 153 message.qos = MQTT::QOS0;
msbaylis 0:9796509d718e 154 message.retained = false;
msbaylis 0:9796509d718e 155 message.dup = false;
msbaylis 0:9796509d718e 156 message.payload = (void*)buf;
msbaylis 0:9796509d718e 157 message.payloadlen = strlen(buf)+1;
ryanqfeeney 2:005cdf4e8fb3 158 int counter = 0;
msbaylis 0:9796509d718e 159
msbaylis 0:9796509d718e 160 while(true) {
msbaylis 0:9796509d718e 161 osEvent switchEvent = messageQ.get(100);
msbaylis 0:9796509d718e 162
ryanqfeeney 2:005cdf4e8fb3 163
ryanqfeeney 2:005cdf4e8fb3 164 if(flash){
ryanqfeeney 2:005cdf4e8fb3 165 controlLED(red);
ryanqfeeney 2:005cdf4e8fb3 166 wait(.25);
ryanqfeeney 2:005cdf4e8fb3 167 controlLED(off);
ryanqfeeney 2:005cdf4e8fb3 168 wait(.25);
ryanqfeeney 2:005cdf4e8fb3 169 }
ryanqfeeney 2:005cdf4e8fb3 170
msbaylis 0:9796509d718e 171 if (switchEvent.value.v == 22 || switchEvent.value.v == 33) {
msbaylis 0:9796509d718e 172 switch(switchEvent.value.v) {
msbaylis 0:9796509d718e 173 case 22 :
ryanqfeeney 2:005cdf4e8fb3 174 if(counter == thresh){sprintf(buf, "b1o");}
ryanqfeeney 2:005cdf4e8fb3 175 else{sprintf(buf, "add");}
ryanqfeeney 2:005cdf4e8fb3 176 counter++;
msbaylis 0:9796509d718e 177 break;
msbaylis 0:9796509d718e 178 case 33 :
ryanqfeeney 2:005cdf4e8fb3 179
ryanqfeeney 2:005cdf4e8fb3 180 if(counter == (thresh+1)){sprintf(buf, "b1u");}
ryanqfeeney 2:005cdf4e8fb3 181 else{sprintf(buf, "new");}
ryanqfeeney 2:005cdf4e8fb3 182 if(counter > 0){counter--;}
msbaylis 0:9796509d718e 183 break;
msbaylis 0:9796509d718e 184 }
ryanqfeeney 2:005cdf4e8fb3 185
ryanqfeeney 2:005cdf4e8fb3 186
msbaylis 0:9796509d718e 187 pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
msbaylis 0:9796509d718e 188 rc = client.publish(topic, message);
msbaylis 0:9796509d718e 189 client.yield(100);
ryanqfeeney 2:005cdf4e8fb3 190
msbaylis 0:9796509d718e 191 }
msbaylis 0:9796509d718e 192
msbaylis 0:9796509d718e 193 else {
msbaylis 0:9796509d718e 194 client.yield(100);
msbaylis 0:9796509d718e 195 }
msbaylis 0:9796509d718e 196 }
ryanqfeeney 2:005cdf4e8fb3 197 }