MQTT from mbed to node with pressure sensor data retrieval
Dependencies: EthernetInterface FSR MQTT Queue mbed-rtos mbed
Fork of K64F-RTOS-MQTT-Example by
main.cpp@2:11452b6f6681, 2017-05-02 (annotated)
- Committer:
- ram54288
- Date:
- Tue May 02 16:50:33 2017 +0000
- Revision:
- 2:11452b6f6681
- Parent:
- 1:ddf6a1c98d91
Published FSR
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" |
ram54288 | 1:ddf6a1c98d91 | 6 | #include "FSR.h" |
ram54288 | 1:ddf6a1c98d91 | 7 | //#include "queue.h" |
ram54288 | 1:ddf6a1c98d91 | 8 | |
msbaylis | 0:9796509d718e | 9 | |
msbaylis | 0:9796509d718e | 10 | // connect options for MQTT broker |
ram54288 | 1:ddf6a1c98d91 | 11 | #define BROKER "10.136.107.229" // MQTT broker URL |
msbaylis | 0:9796509d718e | 12 | #define PORT 1883 // MQTT broker port number |
ram54288 | 1:ddf6a1c98d91 | 13 | #define CLIENTID "MyMbedClient1" // use K64F MAC address without colons |
msbaylis | 0:9796509d718e | 14 | #define USERNAME "" // not required for MQTT Dashboard public broker |
msbaylis | 0:9796509d718e | 15 | #define PASSWORD "" // not required for MQTT Dashboard public broker |
ram54288 | 1:ddf6a1c98d91 | 16 | #define TOPIC1 "pressure" // MQTT topic |
ram54288 | 1:ddf6a1c98d91 | 17 | #define TOPIC2 "motion" |
msbaylis | 0:9796509d718e | 18 | |
ram54288 | 1:ddf6a1c98d91 | 19 | Queue<float, 6> messageQ; |
ram54288 | 1:ddf6a1c98d91 | 20 | //Queue messageQ( 1, 5); |
ram54288 | 1:ddf6a1c98d91 | 21 | FSR fsr(PTB2, 10); |
ram54288 | 1:ddf6a1c98d91 | 22 | |
ram54288 | 1:ddf6a1c98d91 | 23 | //InterruptIn g_button_tap(SW2); |
ram54288 | 1:ddf6a1c98d91 | 24 | InterruptIn pressure_in(PTB2); |
msbaylis | 0:9796509d718e | 25 | |
msbaylis | 0:9796509d718e | 26 | // LED color control function |
msbaylis | 0:9796509d718e | 27 | void controlLED(color_t led_color) { |
msbaylis | 0:9796509d718e | 28 | switch(led_color) { |
msbaylis | 0:9796509d718e | 29 | case red : |
msbaylis | 0:9796509d718e | 30 | greenLED = blueLED = 1; |
msbaylis | 0:9796509d718e | 31 | redLED = 0.7; |
msbaylis | 0:9796509d718e | 32 | break; |
msbaylis | 0:9796509d718e | 33 | case green : |
msbaylis | 0:9796509d718e | 34 | redLED = blueLED = 1; |
msbaylis | 0:9796509d718e | 35 | greenLED = 0.7; |
msbaylis | 0:9796509d718e | 36 | break; |
msbaylis | 0:9796509d718e | 37 | case blue : |
msbaylis | 0:9796509d718e | 38 | redLED = greenLED = 1; |
msbaylis | 0:9796509d718e | 39 | blueLED = 0.7; |
msbaylis | 0:9796509d718e | 40 | break; |
msbaylis | 0:9796509d718e | 41 | case off : |
msbaylis | 0:9796509d718e | 42 | redLED = greenLED = blueLED = 1; |
msbaylis | 0:9796509d718e | 43 | break; |
msbaylis | 0:9796509d718e | 44 | } |
msbaylis | 0:9796509d718e | 45 | } |
msbaylis | 0:9796509d718e | 46 | |
msbaylis | 0:9796509d718e | 47 | // Switch 2 interrupt handler |
ram54288 | 1:ddf6a1c98d91 | 48 | void on_tap(void) { |
ram54288 | 1:ddf6a1c98d91 | 49 | |
ram54288 | 1:ddf6a1c98d91 | 50 | messageQ.put(fsr.readFSRResistance()); |
ram54288 | 1:ddf6a1c98d91 | 51 | |
msbaylis | 0:9796509d718e | 52 | } |
msbaylis | 0:9796509d718e | 53 | |
msbaylis | 0:9796509d718e | 54 | // MQTT message arrived callback function |
msbaylis | 0:9796509d718e | 55 | void messageArrived(MQTT::MessageData& md) { |
msbaylis | 0:9796509d718e | 56 | MQTT::Message &message = md.message; |
msbaylis | 0:9796509d718e | 57 | pc.printf("Receiving MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload); |
msbaylis | 0:9796509d718e | 58 | |
msbaylis | 0:9796509d718e | 59 | if (message.payloadlen == 3) { |
msbaylis | 0:9796509d718e | 60 | if (strncmp((char*)message.payload, "red", 3) == 0) |
msbaylis | 0:9796509d718e | 61 | controlLED(red); |
msbaylis | 0:9796509d718e | 62 | |
msbaylis | 0:9796509d718e | 63 | else if(strncmp((char*)message.payload, "grn", 3) == 0) |
msbaylis | 0:9796509d718e | 64 | controlLED(green); |
msbaylis | 0:9796509d718e | 65 | |
msbaylis | 0:9796509d718e | 66 | else if(strncmp((char*)message.payload, "blu", 3) == 0) |
msbaylis | 0:9796509d718e | 67 | controlLED(blue); |
msbaylis | 0:9796509d718e | 68 | |
msbaylis | 0:9796509d718e | 69 | else if(strncmp((char*)message.payload, "off", 3) == 0) |
msbaylis | 0:9796509d718e | 70 | controlLED(off); |
msbaylis | 0:9796509d718e | 71 | } |
msbaylis | 0:9796509d718e | 72 | } |
msbaylis | 0:9796509d718e | 73 | |
msbaylis | 0:9796509d718e | 74 | int main() { |
msbaylis | 0:9796509d718e | 75 | // turn off LED |
msbaylis | 0:9796509d718e | 76 | controlLED(off); |
msbaylis | 0:9796509d718e | 77 | |
ram54288 | 1:ddf6a1c98d91 | 78 | //g_button_tap.fall(&on_tap); |
ram54288 | 1:ddf6a1c98d91 | 79 | pressure_in.fall(&on_tap); |
msbaylis | 0:9796509d718e | 80 | |
msbaylis | 0:9796509d718e | 81 | pc.printf("\r\n\r\nWelcome to the K64F MQTT Demo!\r\n"); |
msbaylis | 0:9796509d718e | 82 | pc.printf("\r\nAttempting connect to local network...\r\n"); |
msbaylis | 0:9796509d718e | 83 | |
msbaylis | 0:9796509d718e | 84 | // initialize ethernet interface |
msbaylis | 0:9796509d718e | 85 | MQTTEthernet ipstack = MQTTEthernet(); |
msbaylis | 0:9796509d718e | 86 | |
msbaylis | 0:9796509d718e | 87 | // get and display client network info |
msbaylis | 0:9796509d718e | 88 | EthernetInterface& eth = ipstack.getEth(); |
msbaylis | 0:9796509d718e | 89 | pc.printf("IP address is %s\r\n", eth.getIPAddress()); |
msbaylis | 0:9796509d718e | 90 | pc.printf("MAC address is %s\r\n", eth.getMACAddress()); |
msbaylis | 0:9796509d718e | 91 | pc.printf("Gateway address is %s\r\n", eth.getGateway()); |
msbaylis | 0:9796509d718e | 92 | |
msbaylis | 0:9796509d718e | 93 | // construct the MQTT client |
msbaylis | 0:9796509d718e | 94 | MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack); |
msbaylis | 0:9796509d718e | 95 | |
msbaylis | 0:9796509d718e | 96 | char* hostname = BROKER; |
msbaylis | 0:9796509d718e | 97 | int port = PORT; |
msbaylis | 0:9796509d718e | 98 | int rc; |
msbaylis | 0:9796509d718e | 99 | |
msbaylis | 0:9796509d718e | 100 | pc.printf("\r\nAttempting TCP connect to %s:%d: ", hostname, port); |
msbaylis | 0:9796509d718e | 101 | |
msbaylis | 0:9796509d718e | 102 | // connect to TCP socket and check return code |
msbaylis | 0:9796509d718e | 103 | if ((rc = ipstack.connect(hostname, port)) != 0) |
msbaylis | 0:9796509d718e | 104 | pc.printf("failed: rc= %d\r\n", rc); |
msbaylis | 0:9796509d718e | 105 | |
msbaylis | 0:9796509d718e | 106 | else |
msbaylis | 0:9796509d718e | 107 | pc.printf("success\r\n"); |
msbaylis | 0:9796509d718e | 108 | |
msbaylis | 0:9796509d718e | 109 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
msbaylis | 0:9796509d718e | 110 | data.MQTTVersion = 3; |
msbaylis | 0:9796509d718e | 111 | data.clientID.cstring = CLIENTID; |
msbaylis | 0:9796509d718e | 112 | // data.username.cstring = USERNAME; |
msbaylis | 0:9796509d718e | 113 | // data.password.cstring = PASSWORD; |
msbaylis | 0:9796509d718e | 114 | |
msbaylis | 0:9796509d718e | 115 | // send MQTT connect packet and check return code |
msbaylis | 0:9796509d718e | 116 | pc.printf("Attempting MQTT connect to %s:%d: ", hostname, port); |
msbaylis | 0:9796509d718e | 117 | if ((rc = client.connect(data)) != 0) |
msbaylis | 0:9796509d718e | 118 | pc.printf("failed: rc= %d\r\n", rc); |
msbaylis | 0:9796509d718e | 119 | |
msbaylis | 0:9796509d718e | 120 | else |
msbaylis | 0:9796509d718e | 121 | pc.printf("success\r\n"); |
msbaylis | 0:9796509d718e | 122 | |
ram54288 | 1:ddf6a1c98d91 | 123 | char* topic = TOPIC1; |
msbaylis | 0:9796509d718e | 124 | |
msbaylis | 0:9796509d718e | 125 | // subscribe to MQTT topic |
msbaylis | 0:9796509d718e | 126 | pc.printf("Subscribing to MQTT topic %s: ", topic); |
msbaylis | 0:9796509d718e | 127 | if ((rc = client.subscribe(topic, MQTT::QOS0, messageArrived)) != 0) |
msbaylis | 0:9796509d718e | 128 | pc.printf("failed: rc= %d\r\n", rc); |
msbaylis | 0:9796509d718e | 129 | else |
msbaylis | 0:9796509d718e | 130 | pc.printf("success\r\n"); |
ram54288 | 1:ddf6a1c98d91 | 131 | |
msbaylis | 0:9796509d718e | 132 | |
msbaylis | 0:9796509d718e | 133 | MQTT::Message message; |
msbaylis | 0:9796509d718e | 134 | char buf[100]; |
msbaylis | 0:9796509d718e | 135 | message.qos = MQTT::QOS0; |
msbaylis | 0:9796509d718e | 136 | message.retained = false; |
msbaylis | 0:9796509d718e | 137 | message.dup = false; |
msbaylis | 0:9796509d718e | 138 | message.payload = (void*)buf; |
msbaylis | 0:9796509d718e | 139 | message.payloadlen = strlen(buf)+1; |
msbaylis | 0:9796509d718e | 140 | |
msbaylis | 0:9796509d718e | 141 | while(true) { |
ram54288 | 1:ddf6a1c98d91 | 142 | |
msbaylis | 0:9796509d718e | 143 | osEvent switchEvent = messageQ.get(100); |
msbaylis | 0:9796509d718e | 144 | |
ram54288 | 1:ddf6a1c98d91 | 145 | if (switchEvent.value.v > 3000) |
ram54288 | 1:ddf6a1c98d91 | 146 | { |
ram54288 | 1:ddf6a1c98d91 | 147 | sprintf(buf, "message"); |
msbaylis | 0:9796509d718e | 148 | pc.printf("Publishing MQTT message: %.*s\r\n", message.payloadlen, (char*)message.payload); |
msbaylis | 0:9796509d718e | 149 | rc = client.publish(topic, message); |
msbaylis | 0:9796509d718e | 150 | client.yield(100); |
msbaylis | 0:9796509d718e | 151 | } |
msbaylis | 0:9796509d718e | 152 | else { |
msbaylis | 0:9796509d718e | 153 | client.yield(100); |
msbaylis | 0:9796509d718e | 154 | } |
msbaylis | 0:9796509d718e | 155 | } |
msbaylis | 0:9796509d718e | 156 | } |