What if you woke up and everything was different
Dependencies: EthernetInterface MQTT mbed-rtos mbed
Fork of MBED-MQTT by
main.cpp@4:21552aa726cc, 2017-03-21 (annotated)
- Committer:
- kenkron
- Date:
- Tue Mar 21 00:53:21 2017 +0000
- Revision:
- 4:21552aa726cc
- Parent:
- 3:a77ffe1d4c35
Polish
Who changed what in which revision?
User | Revision | Line number | New 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 |
kenkron | 3:a77ffe1d4c35 | 7 | #define BROKER "192.168.1.129" // 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);} |
kenkron | 3:a77ffe1d4c35 | 77 | else if(strncmp((char*)message.payload, "sub", 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; |
kenkron | 3:a77ffe1d4c35 | 152 | int bufferSize = 128; |
kenkron | 3:a77ffe1d4c35 | 153 | char buf[bufferSize]; |
msbaylis | 0:9796509d718e | 154 | message.qos = MQTT::QOS0; |
msbaylis | 0:9796509d718e | 155 | message.retained = false; |
msbaylis | 0:9796509d718e | 156 | message.dup = false; |
msbaylis | 0:9796509d718e | 157 | message.payload = (void*)buf; |
kenkron | 3:a77ffe1d4c35 | 158 | message.payloadlen = bufferSize+1; |
ryanqfeeney | 2:005cdf4e8fb3 | 159 | int counter = 0; |
msbaylis | 0:9796509d718e | 160 | |
kenkron | 3:a77ffe1d4c35 | 161 | sprintf(buf, "max:%d", thresh); |
kenkron | 3:a77ffe1d4c35 | 162 | rc = client.publish(topic, message); |
kenkron | 3:a77ffe1d4c35 | 163 | |
msbaylis | 0:9796509d718e | 164 | while(true) { |
msbaylis | 0:9796509d718e | 165 | osEvent switchEvent = messageQ.get(100); |
ryanqfeeney | 2:005cdf4e8fb3 | 166 | |
ryanqfeeney | 2:005cdf4e8fb3 | 167 | if(flash){ |
ryanqfeeney | 2:005cdf4e8fb3 | 168 | controlLED(red); |
ryanqfeeney | 2:005cdf4e8fb3 | 169 | wait(.25); |
ryanqfeeney | 2:005cdf4e8fb3 | 170 | controlLED(off); |
ryanqfeeney | 2:005cdf4e8fb3 | 171 | wait(.25); |
ryanqfeeney | 2:005cdf4e8fb3 | 172 | } |
ryanqfeeney | 2:005cdf4e8fb3 | 173 | |
msbaylis | 0:9796509d718e | 174 | if (switchEvent.value.v == 22 || switchEvent.value.v == 33) { |
msbaylis | 0:9796509d718e | 175 | switch(switchEvent.value.v) { |
msbaylis | 0:9796509d718e | 176 | case 22 : |
ryanqfeeney | 2:005cdf4e8fb3 | 177 | counter++; |
kenkron | 3:a77ffe1d4c35 | 178 | if (counter > thresh) flash = true; |
msbaylis | 0:9796509d718e | 179 | break; |
msbaylis | 0:9796509d718e | 180 | case 33 : |
ryanqfeeney | 2:005cdf4e8fb3 | 181 | if(counter > 0){counter--;} |
kenkron | 3:a77ffe1d4c35 | 182 | if (counter <= thresh) flash = false; |
msbaylis | 0:9796509d718e | 183 | break; |
msbaylis | 0:9796509d718e | 184 | } |
kenkron | 3:a77ffe1d4c35 | 185 | sprintf(buf, "{\"type\":\"UPDATE\",\"count\":\"%d\", \"max\":\"%d\"}", counter, thresh); |
kenkron | 4:21552aa726cc | 186 | message.payloadlen = strlen(buf); |
ryanqfeeney | 2:005cdf4e8fb3 | 187 | |
msbaylis | 0:9796509d718e | 188 | pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload); |
msbaylis | 0:9796509d718e | 189 | rc = client.publish(topic, message); |
msbaylis | 0:9796509d718e | 190 | client.yield(100); |
ryanqfeeney | 2:005cdf4e8fb3 | 191 | |
msbaylis | 0:9796509d718e | 192 | } |
msbaylis | 0:9796509d718e | 193 | |
msbaylis | 0:9796509d718e | 194 | else { |
msbaylis | 0:9796509d718e | 195 | client.yield(100); |
msbaylis | 0:9796509d718e | 196 | } |
msbaylis | 0:9796509d718e | 197 | } |
ryanqfeeney | 2:005cdf4e8fb3 | 198 | } |