What if you woke up and everything was different

Dependencies:   EthernetInterface MQTT mbed-rtos mbed

Fork of MBED-MQTT by Ryan Feeney

Committer:
ryanqfeeney
Date:
Sat Mar 18 19:54:58 2017 +0000
Revision:
1:9e3ca45e51b5
Parent:
0:9796509d718e
Child:
2:005cdf4e8fb3
working example code TCP port 1883

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
ryanqfeeney 1:9e3ca45e51b5 8 #define BROKER "broker.hivemq.com" // MQTT broker URL
msbaylis 0:9796509d718e 9 #define PORT 1883 // MQTT broker port number
ryanqfeeney 1:9e3ca45e51b5 10 #define CLIENTID "0002F7F000" // use K64F MAC address without colons
msbaylis 0:9796509d718e 11 #define USERNAME "" // not required for MQTT Dashboard public broker
msbaylis 0:9796509d718e 12 #define PASSWORD "" // not required for MQTT Dashboard public broker
ryanqfeeney 1:9e3ca45e51b5 13 #define TOPIC "testeroo" // 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;
msbaylis 0:9796509d718e 51 pc.printf("Receiving MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
msbaylis 0:9796509d718e 52
msbaylis 0:9796509d718e 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
msbaylis 0:9796509d718e 57 else if(strncmp((char*)message.payload, "grn", 3) == 0)
msbaylis 0:9796509d718e 58 controlLED(green);
msbaylis 0:9796509d718e 59
msbaylis 0:9796509d718e 60 else if(strncmp((char*)message.payload, "blu", 3) == 0)
msbaylis 0:9796509d718e 61 controlLED(blue);
msbaylis 0:9796509d718e 62
msbaylis 0:9796509d718e 63 else if(strncmp((char*)message.payload, "off", 3) == 0)
msbaylis 0:9796509d718e 64 controlLED(off);
msbaylis 0:9796509d718e 65 }
msbaylis 0:9796509d718e 66 }
msbaylis 0:9796509d718e 67
msbaylis 0:9796509d718e 68 int main() {
msbaylis 0:9796509d718e 69 // turn off LED
ryanqfeeney 1:9e3ca45e51b5 70 controlLED(red);
msbaylis 0:9796509d718e 71
msbaylis 0:9796509d718e 72 // set SW2 and SW3 to generate interrupt on falling edge
msbaylis 0:9796509d718e 73 switch2.fall(&sw2_ISR);
msbaylis 0:9796509d718e 74 switch3.fall(&sw3_ISR);
msbaylis 0:9796509d718e 75
msbaylis 0:9796509d718e 76 pc.printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n");
msbaylis 0:9796509d718e 77 pc.printf("\r\nAttempting connect to local network...\r\n");
msbaylis 0:9796509d718e 78
msbaylis 0:9796509d718e 79 // initialize ethernet interface
msbaylis 0:9796509d718e 80 MQTTEthernet ipstack = MQTTEthernet();
msbaylis 0:9796509d718e 81
msbaylis 0:9796509d718e 82 // get and display client network info
msbaylis 0:9796509d718e 83 EthernetInterface& eth = ipstack.getEth();
msbaylis 0:9796509d718e 84 pc.printf("IP address is %s\r\n", eth.getIPAddress());
msbaylis 0:9796509d718e 85 pc.printf("MAC address is %s\r\n", eth.getMACAddress());
msbaylis 0:9796509d718e 86 pc.printf("Gateway address is %s\r\n", eth.getGateway());
msbaylis 0:9796509d718e 87
ryanqfeeney 1:9e3ca45e51b5 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
ryanqfeeney 1:9e3ca45e51b5 99 if ((rc = ipstack.connect(hostname, port)) != 0){
msbaylis 0:9796509d718e 100 pc.printf("failed: rc= %d\r\n", rc);
ryanqfeeney 1:9e3ca45e51b5 101 controlLED(blue);}
msbaylis 0:9796509d718e 102
msbaylis 0:9796509d718e 103 else
msbaylis 0:9796509d718e 104 pc.printf("success\r\n");
msbaylis 0:9796509d718e 105
msbaylis 0:9796509d718e 106 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
msbaylis 0:9796509d718e 107 data.MQTTVersion = 3;
msbaylis 0:9796509d718e 108 data.clientID.cstring = CLIENTID;
msbaylis 0:9796509d718e 109 // data.username.cstring = USERNAME;
msbaylis 0:9796509d718e 110 // data.password.cstring = PASSWORD;
msbaylis 0:9796509d718e 111
msbaylis 0:9796509d718e 112 // send MQTT connect packet and check return code
msbaylis 0:9796509d718e 113 pc.printf("Attempting MQTT connect to %s:%d: ", hostname, port);
ryanqfeeney 1:9e3ca45e51b5 114 if ((rc = client.connect(data)) != 0){
msbaylis 0:9796509d718e 115 pc.printf("failed: rc= %d\r\n", rc);
ryanqfeeney 1:9e3ca45e51b5 116 controlLED(green);}
ryanqfeeney 1:9e3ca45e51b5 117 else{
msbaylis 0:9796509d718e 118 pc.printf("success\r\n");
ryanqfeeney 1:9e3ca45e51b5 119 controlLED(off);}
msbaylis 0:9796509d718e 120
msbaylis 0:9796509d718e 121 char* topic = TOPIC;
msbaylis 0:9796509d718e 122
msbaylis 0:9796509d718e 123 // subscribe to MQTT topic
msbaylis 0:9796509d718e 124 pc.printf("Subscribing to MQTT topic %s: ", topic);
msbaylis 0:9796509d718e 125 if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0)
msbaylis 0:9796509d718e 126 pc.printf("failed: rc= %d\r\n", rc);
msbaylis 0:9796509d718e 127
msbaylis 0:9796509d718e 128 else
msbaylis 0:9796509d718e 129 pc.printf("success\r\n");
msbaylis 0:9796509d718e 130
msbaylis 0:9796509d718e 131 MQTT::Message message;
msbaylis 0:9796509d718e 132 char buf[100];
msbaylis 0:9796509d718e 133 message.qos = MQTT::QOS0;
msbaylis 0:9796509d718e 134 message.retained = false;
msbaylis 0:9796509d718e 135 message.dup = false;
msbaylis 0:9796509d718e 136 message.payload = (void*)buf;
msbaylis 0:9796509d718e 137 message.payloadlen = strlen(buf)+1;
msbaylis 0:9796509d718e 138
msbaylis 0:9796509d718e 139 while(true) {
msbaylis 0:9796509d718e 140 osEvent switchEvent = messageQ.get(100);
msbaylis 0:9796509d718e 141
msbaylis 0:9796509d718e 142 if (switchEvent.value.v == 22 || switchEvent.value.v == 33) {
msbaylis 0:9796509d718e 143 switch(switchEvent.value.v) {
msbaylis 0:9796509d718e 144 case 22 :
msbaylis 0:9796509d718e 145 sprintf(buf, "sw2");
msbaylis 0:9796509d718e 146 break;
msbaylis 0:9796509d718e 147 case 33 :
msbaylis 0:9796509d718e 148 sprintf(buf, "sw3");
msbaylis 0:9796509d718e 149 break;
msbaylis 0:9796509d718e 150 }
msbaylis 0:9796509d718e 151 pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload);
msbaylis 0:9796509d718e 152 rc = client.publish(topic, message);
msbaylis 0:9796509d718e 153 client.yield(100);
msbaylis 0:9796509d718e 154 }
msbaylis 0:9796509d718e 155
msbaylis 0:9796509d718e 156 else {
msbaylis 0:9796509d718e 157 client.yield(100);
msbaylis 0:9796509d718e 158 }
msbaylis 0:9796509d718e 159 }
msbaylis 0:9796509d718e 160 }