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 Mike Baylis

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?

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"
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 }