Test MQTT Protocol with a Temperature Sensore
Dependencies: EthernetInterface LM75A MQTT mbed-rtos mbed
Fork of HelloMQTT by
Notebook info: HERE
main.cpp@20:bec5faa6a303, 2017-01-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |