Test MQTT Protocol with a Temperature Sensore

Dependencies:   EthernetInterface LM75A MQTT mbed-rtos mbed

Fork of HelloMQTT by MQTT

Notebook info: HERE

Committer:
edodm85
Date:
Sat Jan 14 14:12:53 2017 +0000
Revision:
20:bec5faa6a303
Parent:
19:7f7aba7a4a8b
Test MQTT protocol with a Temperature Sensore

Who changed what in which revision?

UserRevisionLine numberNew contents of line
edodm85 20:bec5faa6a303 1 /*
edodm85 20:bec5faa6a303 2 * Author: Edoardo De Marchi
edodm85 20:bec5faa6a303 3 * Date: 14-01-2017
edodm85 20:bec5faa6a303 4 * Notes: Send the temperature value over MQTT protocol
edodm85 20:bec5faa6a303 5 */
icraggs 1:a1d5c7a6acbc 6
icraggs 2:638c854c0695 7
edodm85 20:bec5faa6a303 8 #include "main.h"
icraggs 2:638c854c0695 9
icraggs 8:a3e3113054a1 10
icraggs 9:5beb8609e9f7 11 void messageArrived(MQTT::MessageData& md)
icraggs 2:638c854c0695 12 {
icraggs 9:5beb8609e9f7 13 MQTT::Message &message = md.message;
edodm85 20:bec5faa6a303 14
edodm85 20:bec5faa6a303 15
icraggs 9:5beb8609e9f7 16 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n", message.qos, message.retained, message.dup, message.id);
edodm85 20:bec5faa6a303 17 printf("Payload [len: %d] %s\n", message.payloadlen, message.payload);
edodm85 20:bec5faa6a303 18
edodm85 20:bec5faa6a303 19 memset(bufMQTT, 0, sizeof(bufMQTT));
edodm85 20:bec5faa6a303 20 message.payloadlen = 0;
icraggs 2:638c854c0695 21 }
icraggs 0:0cae29831d01 22
icraggs 2:638c854c0695 23
edodm85 20:bec5faa6a303 24
edodm85 20:bec5faa6a303 25
edodm85 20:bec5faa6a303 26
edodm85 20:bec5faa6a303 27
edodm85 20:bec5faa6a303 28 // Thread that read the temperature from LM75 sensor
edodm85 20:bec5faa6a303 29 void temp_sensor_thread(void const *argument)
edodm85 20:bec5faa6a303 30 {
edodm85 20:bec5faa6a303 31 while (true)
edodm85 20:bec5faa6a303 32 {
edodm85 20:bec5faa6a303 33 if(bStart)
edodm85 20:bec5faa6a303 34 {
edodm85 20:bec5faa6a303 35
edodm85 20:bec5faa6a303 36 // Read Temperature
edodm85 20:bec5faa6a303 37 fTemperature = TempSensor.read_T();
edodm85 20:bec5faa6a303 38 if(fTemperature != fTemperatureTemp)
edodm85 20:bec5faa6a303 39 {
edodm85 20:bec5faa6a303 40 int len = sprintf(bufMQTT, "The room temperature is: %4.2f degree C\n", fTemperature);
edodm85 20:bec5faa6a303 41
edodm85 20:bec5faa6a303 42 fTemperatureTemp = fTemperature;
edodm85 20:bec5faa6a303 43 bNewValue = true;
edodm85 20:bec5faa6a303 44 }
edodm85 20:bec5faa6a303 45
edodm85 20:bec5faa6a303 46 led3 = !led3;
edodm85 20:bec5faa6a303 47
edodm85 20:bec5faa6a303 48 }
edodm85 20:bec5faa6a303 49
edodm85 20:bec5faa6a303 50 osDelay(1000);
edodm85 20:bec5faa6a303 51 }
edodm85 20:bec5faa6a303 52 }
edodm85 20:bec5faa6a303 53
edodm85 20:bec5faa6a303 54
edodm85 20:bec5faa6a303 55
edodm85 20:bec5faa6a303 56
edodm85 20:bec5faa6a303 57
edodm85 20:bec5faa6a303 58
edodm85 20:bec5faa6a303 59
edodm85 20:bec5faa6a303 60 void init()
edodm85 20:bec5faa6a303 61 {
edodm85 20:bec5faa6a303 62 led1 = 0;
edodm85 20:bec5faa6a303 63 led2 = 0;
edodm85 20:bec5faa6a303 64 led3 = 0;
edodm85 20:bec5faa6a303 65 led4 = 0;
edodm85 20:bec5faa6a303 66
edodm85 20:bec5faa6a303 67
edodm85 20:bec5faa6a303 68 // Create Thread
edodm85 20:bec5faa6a303 69 osThreadCreate(osThread(temp_sensor_thread), NULL);
edodm85 20:bec5faa6a303 70 }
edodm85 20:bec5faa6a303 71
edodm85 20:bec5faa6a303 72
edodm85 20:bec5faa6a303 73
edodm85 20:bec5faa6a303 74
icraggs 2:638c854c0695 75 int main(int argc, char* argv[])
icraggs 2:638c854c0695 76 {
edodm85 20:bec5faa6a303 77
edodm85 20:bec5faa6a303 78
edodm85 20:bec5faa6a303 79 init();
edodm85 20:bec5faa6a303 80
edodm85 20:bec5faa6a303 81 printf("Connecting to %s:%d\n", hostbroker, port);
edodm85 20:bec5faa6a303 82
icraggs 2:638c854c0695 83
edodm85 20:bec5faa6a303 84 // dhcp
edodm85 20:bec5faa6a303 85 MQTTEthernet ipstack = MQTTEthernet();
edodm85 20:bec5faa6a303 86
edodm85 20:bec5faa6a303 87
edodm85 20:bec5faa6a303 88 EthernetInterface& eth = ipstack.getEth();
edodm85 20:bec5faa6a303 89 printf("IP addr is %s\n", eth.getIPAddress());
edodm85 20:bec5faa6a303 90 printf("MAC addr is %s\n", eth.getMACAddress());
edodm85 20:bec5faa6a303 91 printf("Gateway addr is %s\n", eth.getGateway());
edodm85 20:bec5faa6a303 92
edodm85 20:bec5faa6a303 93
edodm85 20:bec5faa6a303 94 MQTT::Client<MQTTEthernet, Countdown> clientMQTT = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
edodm85 20:bec5faa6a303 95
edodm85 20:bec5faa6a303 96
edodm85 20:bec5faa6a303 97 // tcp connection
edodm85 20:bec5faa6a303 98 if ((rc = ipstack.connect(hostbroker, port)) != 0)
edodm85 20:bec5faa6a303 99 {
icraggs 18:07a79d8f01c3 100 printf("rc from TCP connect is %d\n", rc);
edodm85 20:bec5faa6a303 101 }else
edodm85 20:bec5faa6a303 102 {
edodm85 20:bec5faa6a303 103 printf("TCP connection OK\n");
edodm85 20:bec5faa6a303 104 led1 = 1;
edodm85 20:bec5faa6a303 105 }
edodm85 20:bec5faa6a303 106
edodm85 20:bec5faa6a303 107
edodm85 20:bec5faa6a303 108
edodm85 20:bec5faa6a303 109 // Connection data
edodm85 20:bec5faa6a303 110 MQTTPacket_connectData dataMQTT = MQTTPacket_connectData_initializer;
edodm85 20:bec5faa6a303 111 dataMQTT.MQTTVersion = 3;
edodm85 20:bec5faa6a303 112 dataMQTT.clientID.cstring = clientID;
edodm85 20:bec5faa6a303 113 dataMQTT.username.cstring = username;
edodm85 20:bec5faa6a303 114 dataMQTT.password.cstring = password;
icraggs 2:638c854c0695 115
edodm85 20:bec5faa6a303 116
edodm85 20:bec5faa6a303 117 // client connection
edodm85 20:bec5faa6a303 118 if ((rc = clientMQTT.connect(dataMQTT)) != 0)
edodm85 20:bec5faa6a303 119 {
edodm85 20:bec5faa6a303 120 printf("rc from MQTT connect is %d\n", rc);
edodm85 20:bec5faa6a303 121 }else
edodm85 20:bec5faa6a303 122 {
edodm85 20:bec5faa6a303 123 printf("MQTT connection OK\n");
edodm85 20:bec5faa6a303 124 led2 = 1;
edodm85 20:bec5faa6a303 125 }
edodm85 20:bec5faa6a303 126
edodm85 20:bec5faa6a303 127
edodm85 20:bec5faa6a303 128 // topic subscribe
edodm85 20:bec5faa6a303 129 if ((rc = clientMQTT.subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
edodm85 20:bec5faa6a303 130 {
icraggs 18:07a79d8f01c3 131 printf("rc from MQTT subscribe is %d\n", rc);
edodm85 20:bec5faa6a303 132 }else
edodm85 20:bec5faa6a303 133 {
edodm85 20:bec5faa6a303 134 printf("MQTT subscribe OK\n");
edodm85 20:bec5faa6a303 135 }
edodm85 20:bec5faa6a303 136
edodm85 20:bec5faa6a303 137
icraggs 2:638c854c0695 138 // QoS 0
icraggs 2:638c854c0695 139 message.qos = MQTT::QOS0;
icraggs 2:638c854c0695 140 message.retained = false;
icraggs 2:638c854c0695 141 message.dup = false;
edodm85 20:bec5faa6a303 142
edodm85 20:bec5faa6a303 143
edodm85 20:bec5faa6a303 144
edodm85 20:bec5faa6a303 145 // Set configuration register
edodm85 20:bec5faa6a303 146 TempSensor.write_reg(0x01, 0x00);
edodm85 20:bec5faa6a303 147 fTemperatureTemp = TempSensor.read_T();
edodm85 20:bec5faa6a303 148
edodm85 20:bec5faa6a303 149 bStart = true;
edodm85 20:bec5faa6a303 150
edodm85 20:bec5faa6a303 151 while(1)
edodm85 20:bec5faa6a303 152 {
edodm85 20:bec5faa6a303 153
edodm85 20:bec5faa6a303 154 if(bNewValue)
edodm85 20:bec5faa6a303 155 {
edodm85 20:bec5faa6a303 156 bNewValue = false;
edodm85 20:bec5faa6a303 157 message.payload = (void*)bufMQTT;
edodm85 20:bec5faa6a303 158 message.payloadlen = strlen(bufMQTT)+1;
icraggs 17:0811bdbdd78a 159
edodm85 20:bec5faa6a303 160 // publish message
edodm85 20:bec5faa6a303 161 rc = clientMQTT.publish(topic, message);
edodm85 20:bec5faa6a303 162 }
edodm85 20:bec5faa6a303 163
edodm85 20:bec5faa6a303 164
edodm85 20:bec5faa6a303 165 clientMQTT.yield(100);
edodm85 20:bec5faa6a303 166 }
icraggs 0:0cae29831d01 167 }