,

Dependencies:   C12832 DHT MQTT

Fork of HelloMQTT by MQTT

Committer:
2814970
Date:
Fri Jan 05 12:20:31 2018 +0000
Revision:
23:e3422d0d3cc2
Parent:
21:a68bd76740f9
,

Who changed what in which revision?

UserRevisionLine numberNew contents of line
2814970 23:e3422d0d3cc2 1 /*
icraggs 17:0811bdbdd78a 2 #include "C12832.h"
2814970 23:e3422d0d3cc2 3 #include "easy-connect.h"
2814970 23:e3422d0d3cc2 4 #include "MQTTNetwork.h"
2814970 23:e3422d0d3cc2 5 #include "MQTTmbed.h"
2814970 23:e3422d0d3cc2 6 #include "MQTTClient.h"
2814970 23:e3422d0d3cc2 7 */
Jan Jongboom 20:49c9daf2b0ff 8
Jan Jongboom 20:49c9daf2b0ff 9 #define logMessage printf
2814970 23:e3422d0d3cc2 10 //#define MQTTCLIENT_QOS2 1
2814970 23:e3422d0d3cc2 11 #include "mbed.h"
Jan Jongboom 20:49c9daf2b0ff 12 #include "easy-connect.h"
Jan Jongboom 20:49c9daf2b0ff 13 #include "MQTTNetwork.h"
Jan Jongboom 20:49c9daf2b0ff 14 #include "MQTTmbed.h"
icraggs 2:638c854c0695 15 #include "MQTTClient.h"
2814970 23:e3422d0d3cc2 16 #include "DHT.h"
2814970 23:e3422d0d3cc2 17 /* connect this pin to both the CH_PD (aka EN) & RST pins on the ESP8266 just in case */
2814970 23:e3422d0d3cc2 18 #define WIFI_HW_RESET_PIN D4
2814970 23:e3422d0d3cc2 19 /* See if you can try using a hostname here */
2814970 23:e3422d0d3cc2 20 #define MQTT_BROKER_ADDR "192.168.0.9"
2814970 23:e3422d0d3cc2 21 #define MQTT_BROKER_PORT 1883
2814970 23:e3422d0d3cc2 22 DHT sensor(D7,DHT22);
2814970 23:e3422d0d3cc2 23 DigitalOut wifiHwResetPin(WIFI_HW_RESET_PIN);
2814970 23:e3422d0d3cc2 24 DigitalOut led2(LED2);
2814970 23:e3422d0d3cc2 25 Serial pc(USBTX, USBRX); // computer to mbedboardSerialesp(D1, D0);
icraggs 2:638c854c0695 26
icraggs 8:a3e3113054a1 27
2814970 23:e3422d0d3cc2 28
2814970 23:e3422d0d3cc2 29
2814970 23:e3422d0d3cc2 30 volatile bool flag = false;
2814970 23:e3422d0d3cc2 31
2814970 23:e3422d0d3cc2 32 Mutex mqttMtx;
2814970 23:e3422d0d3cc2 33
2814970 23:e3422d0d3cc2 34
2814970 23:e3422d0d3cc2 35 float t = 0;
2814970 23:e3422d0d3cc2 36
2814970 23:e3422d0d3cc2 37 char* topic1 = "LED";
2814970 23:e3422d0d3cc2 38 char* topic2 = "TEMP";
2814970 23:e3422d0d3cc2 39 char* topic3 = "LEDS";
icraggs 9:5beb8609e9f7 40 void messageArrived(MQTT::MessageData& md)
icraggs 2:638c854c0695 41 {
2814970 23:e3422d0d3cc2 42
icraggs 9:5beb8609e9f7 43 MQTT::Message &message = md.message;
2814970 23:e3422d0d3cc2 44 /* our messaging standard says the first byte denotes which thread to fwdto */
2814970 23:e3422d0d3cc2 45 logMessage("Message arrived: qos%d, retained %d, dup %d, packetid%d\r\n", message.qos, message.retained, message.dup, message.id);
Jan Jongboom 20:49c9daf2b0ff 46 logMessage("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
2814970 23:e3422d0d3cc2 47
2814970 23:e3422d0d3cc2 48 char fwdTarget= ((char *)message.payload)[0];
2814970 23:e3422d0d3cc2 49 switch(fwdTarget)
2814970 23:e3422d0d3cc2 50 {
2814970 23:e3422d0d3cc2 51 case '0': // turn off
2814970 23:e3422d0d3cc2 52 led2 = 0;
2814970 23:e3422d0d3cc2 53 break;
icraggs 0:0cae29831d01 54
2814970 23:e3422d0d3cc2 55 case '1': //turn on
2814970 23:e3422d0d3cc2 56 led2 = 1;
2814970 23:e3422d0d3cc2 57 break;
2814970 23:e3422d0d3cc2 58
2814970 23:e3422d0d3cc2 59 case '2': //LED status
2814970 23:e3422d0d3cc2 60 flag = true;
2814970 23:e3422d0d3cc2 61 break;
2814970 23:e3422d0d3cc2 62
2814970 23:e3422d0d3cc2 63 default:
2814970 23:e3422d0d3cc2 64 pc.printf("Unknown MQTT message\n");
2814970 23:e3422d0d3cc2 65 break;
2814970 23:e3422d0d3cc2 66 }
2814970 23:e3422d0d3cc2 67 }
icraggs 2:638c854c0695 68
icraggs 2:638c854c0695 69 int main(int argc, char* argv[])
Jan Jongboom 20:49c9daf2b0ff 70 {
2814970 23:e3422d0d3cc2 71 float version = 0.5;
2814970 23:e3422d0d3cc2 72 pc.baud(115200);
2814970 23:e3422d0d3cc2 73 logMessage("MQTT example: version is %.2f\r\n", version);
2814970 23:e3422d0d3cc2 74 wait(0.2); //delay startup
2814970 23:e3422d0d3cc2 75 pc.printf("Resetting ESP8266 Hardware...\r\n");
2814970 23:e3422d0d3cc2 76 wifiHwResetPin= 0;
2814970 23:e3422d0d3cc2 77 wait_ms(500);
2814970 23:e3422d0d3cc2 78 wifiHwResetPin= 1;
2814970 23:e3422d0d3cc2 79 pc.printf("Starting MQTT example with an ESP8266 wifidevice using MbedOS.\r\n");
2814970 23:e3422d0d3cc2 80 pc.printf("Attempting to connect to access point...\r\n");
Jan Jongboom 20:49c9daf2b0ff 81
Jan Jongboom 20:49c9daf2b0ff 82 NetworkInterface* network = easy_connect(true);
Jan Jongboom 20:49c9daf2b0ff 83 if (!network) {
2814970 23:e3422d0d3cc2 84 pc.printf("Error in east connection\r\n");
Jan Jongboom 20:49c9daf2b0ff 85 return -1;
Jan Jongboom 20:49c9daf2b0ff 86 }
Jan Jongboom 20:49c9daf2b0ff 87
Jan Jongboom 20:49c9daf2b0ff 88 MQTTNetwork mqttNetwork(network);
Jan Jongboom 21:a68bd76740f9 89 MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);
2814970 23:e3422d0d3cc2 90
2814970 23:e3422d0d3cc2 91 logMessage("Connecting to %s:%d\r\n", MQTT_BROKER_ADDR, MQTT_BROKER_PORT);
2814970 23:e3422d0d3cc2 92 int rc= mqttNetwork.connect(MQTT_BROKER_ADDR, MQTT_BROKER_PORT);
Jan Jongboom 20:49c9daf2b0ff 93
2814970 23:e3422d0d3cc2 94 if (rc!= 0)
2814970 23:e3422d0d3cc2 95 logMessage("rcfrom TCP connect is %d\r\n", rc);
2814970 23:e3422d0d3cc2 96
2814970 23:e3422d0d3cc2 97 MQTTPacket_connectData data= MQTTPacket_connectData_initializer;
2814970 23:e3422d0d3cc2 98 data.MQTTVersion= 3;
2814970 23:e3422d0d3cc2 99 data.clientID.cstring= "mbed-ljw";
2814970 23:e3422d0d3cc2 100 data.username.cstring= "user-ljw";
2814970 23:e3422d0d3cc2 101 data.password.cstring= "testpassword";
Jan Jongboom 20:49c9daf2b0ff 102
2814970 23:e3422d0d3cc2 103 if ((rc= client.connect(data)) != 0)
2814970 23:e3422d0d3cc2 104 logMessage("rcfrom MQTT connect is %d\r\n", rc);
2814970 23:e3422d0d3cc2 105 if ((rc= client.subscribe(topic1, MQTT::QOS0, messageArrived)) != 0)
2814970 23:e3422d0d3cc2 106 logMessage("rcfrom MQTT subscribe is %d\r\n", rc);
2814970 23:e3422d0d3cc2 107
2814970 23:e3422d0d3cc2 108 int count = 0;
2814970 23:e3422d0d3cc2 109
2814970 23:e3422d0d3cc2 110 while(1) {
2814970 23:e3422d0d3cc2 111 Thread::wait(1000);
Jan Jongboom 20:49c9daf2b0ff 112
2814970 23:e3422d0d3cc2 113 char buf[64];
2814970 23:e3422d0d3cc2 114 MQTT::Message message;
2814970 23:e3422d0d3cc2 115
2814970 23:e3422d0d3cc2 116
2814970 23:e3422d0d3cc2 117 t = sensor.ReadTemperature(CELCIUS);
icraggs 2:638c854c0695 118
2814970 23:e3422d0d3cc2 119
2814970 23:e3422d0d3cc2 120
2814970 23:e3422d0d3cc2 121 if (count == 30) {
2814970 23:e3422d0d3cc2 122 pc.printf("Publish: TEMP\r\n");
2814970 23:e3422d0d3cc2 123
2814970 23:e3422d0d3cc2 124 sprintf(buf, "{ \"temp\": \"%.1f\"}\r\n", t);
icraggs 0:0cae29831d01 125
2814970 23:e3422d0d3cc2 126 message.qos= MQTT::QOS2;
2814970 23:e3422d0d3cc2 127 message.retained= false;
2814970 23:e3422d0d3cc2 128 message.dup= false;
2814970 23:e3422d0d3cc2 129 message.payload= (void*)buf;
2814970 23:e3422d0d3cc2 130 message.payloadlen= strlen(buf)+1;
2814970 23:e3422d0d3cc2 131 mqttMtx.lock();
2814970 23:e3422d0d3cc2 132 rc= client.publish(topic2, message);
2814970 23:e3422d0d3cc2 133 mqttMtx.unlock();
2814970 23:e3422d0d3cc2 134 count = 0;
2814970 23:e3422d0d3cc2 135
2814970 23:e3422d0d3cc2 136 }
2814970 23:e3422d0d3cc2 137
2814970 23:e3422d0d3cc2 138 if (flag) {
2814970 23:e3422d0d3cc2 139 pc.printf("Publish: LEDS\r\n");
Jan Jongboom 20:49c9daf2b0ff 140
2814970 23:e3422d0d3cc2 141 if (led2 == 0)
2814970 23:e3422d0d3cc2 142 sprintf(buf, "LED OFF");
2814970 23:e3422d0d3cc2 143 else
2814970 23:e3422d0d3cc2 144 sprintf(buf, "LED ON");
2814970 23:e3422d0d3cc2 145
2814970 23:e3422d0d3cc2 146 message.qos= MQTT::QOS1;
2814970 23:e3422d0d3cc2 147 message.retained= false;
2814970 23:e3422d0d3cc2 148 message.dup= false;
2814970 23:e3422d0d3cc2 149 message.payload= (void*)buf;
2814970 23:e3422d0d3cc2 150 message.payloadlen= strlen(buf)+1;
Jan Jongboom 20:49c9daf2b0ff 151
2814970 23:e3422d0d3cc2 152 mqttMtx.lock();
2814970 23:e3422d0d3cc2 153 rc= client.publish(topic3, message);
2814970 23:e3422d0d3cc2 154 mqttMtx.unlock();
2814970 23:e3422d0d3cc2 155 flag = false;
2814970 23:e3422d0d3cc2 156 }
Jan Jongboom 20:49c9daf2b0ff 157
2814970 23:e3422d0d3cc2 158 if(!client.isConnected())
2814970 23:e3422d0d3cc2 159 NVIC_SystemReset();// soft reset
2814970 23:e3422d0d3cc2 160 /* yield() needs to be called at least once per keepAliveInterval*/
2814970 23:e3422d0d3cc2 161 client.yield(10);
2814970 23:e3422d0d3cc2 162 count++;
2814970 23:e3422d0d3cc2 163 }
icraggs 0:0cae29831d01 164 return 0;
icraggs 0:0cae29831d01 165 }