iot_water_monitor_v2

Dependencies:   easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code

Committer:
DuyLionTran
Date:
Tue Apr 03 17:03:01 2018 +0000
Revision:
57:898fcb6692cd
Parent:
11:3802c82a5ae9
;   * version 2.9.8  	03-04-2018  Minor changes. Time frame updated to IBM Watson every 60s

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 11:3802c82a5ae9 1 #if !defined(MQTTSOCKET_H)
DuyLionTran 11:3802c82a5ae9 2 #define MQTTSOCKET_H
DuyLionTran 11:3802c82a5ae9 3
DuyLionTran 11:3802c82a5ae9 4 #include "MQTTmbed.h"
DuyLionTran 11:3802c82a5ae9 5 #include <EthernetInterface.h>
DuyLionTran 11:3802c82a5ae9 6 #include <Timer.h>
DuyLionTran 11:3802c82a5ae9 7
DuyLionTran 11:3802c82a5ae9 8 class MQTTSocket
DuyLionTran 11:3802c82a5ae9 9 {
DuyLionTran 11:3802c82a5ae9 10 public:
DuyLionTran 11:3802c82a5ae9 11 MQTTSocket(EthernetInterface *anet)
DuyLionTran 11:3802c82a5ae9 12 {
DuyLionTran 11:3802c82a5ae9 13 net = anet;
DuyLionTran 11:3802c82a5ae9 14 open = false;
DuyLionTran 11:3802c82a5ae9 15 }
DuyLionTran 11:3802c82a5ae9 16
DuyLionTran 11:3802c82a5ae9 17 int connect(char* hostname, int port, int timeout=1000)
DuyLionTran 11:3802c82a5ae9 18 {
DuyLionTran 11:3802c82a5ae9 19 if (open)
DuyLionTran 11:3802c82a5ae9 20 disconnect();
DuyLionTran 11:3802c82a5ae9 21 nsapi_error_t rc = mysock.open(net);
DuyLionTran 11:3802c82a5ae9 22 open = true;
DuyLionTran 11:3802c82a5ae9 23 mysock.set_blocking(true);
DuyLionTran 11:3802c82a5ae9 24 mysock.set_timeout((unsigned int)timeout);
DuyLionTran 11:3802c82a5ae9 25 rc = mysock.connect(hostname, port);
DuyLionTran 11:3802c82a5ae9 26 mysock.set_blocking(false); // blocking timeouts seem not to work
DuyLionTran 11:3802c82a5ae9 27 return rc;
DuyLionTran 11:3802c82a5ae9 28 }
DuyLionTran 11:3802c82a5ae9 29
DuyLionTran 11:3802c82a5ae9 30 // common read/write routine, avoiding blocking timeouts
DuyLionTran 11:3802c82a5ae9 31 int common(unsigned char* buffer, int len, int timeout, bool read)
DuyLionTran 11:3802c82a5ae9 32 {
DuyLionTran 11:3802c82a5ae9 33 timer.start();
DuyLionTran 11:3802c82a5ae9 34 mysock.set_blocking(false); // blocking timeouts seem not to work
DuyLionTran 11:3802c82a5ae9 35 int bytes = 0;
DuyLionTran 11:3802c82a5ae9 36 bool first = true;
DuyLionTran 11:3802c82a5ae9 37 do
DuyLionTran 11:3802c82a5ae9 38 {
DuyLionTran 11:3802c82a5ae9 39 if (first)
DuyLionTran 11:3802c82a5ae9 40 first = false;
DuyLionTran 11:3802c82a5ae9 41 else
DuyLionTran 11:3802c82a5ae9 42 wait_ms(timeout < 100 ? timeout : 100);
DuyLionTran 11:3802c82a5ae9 43 int rc;
DuyLionTran 11:3802c82a5ae9 44 if (read)
DuyLionTran 11:3802c82a5ae9 45 rc = mysock.recv((char*)buffer, len);
DuyLionTran 11:3802c82a5ae9 46 else
DuyLionTran 11:3802c82a5ae9 47 rc = mysock.send((char*)buffer, len);
DuyLionTran 11:3802c82a5ae9 48 if (rc < 0)
DuyLionTran 11:3802c82a5ae9 49 {
DuyLionTran 11:3802c82a5ae9 50 if (rc != NSAPI_ERROR_WOULD_BLOCK)
DuyLionTran 11:3802c82a5ae9 51 {
DuyLionTran 11:3802c82a5ae9 52 bytes = -1;
DuyLionTran 11:3802c82a5ae9 53 break;
DuyLionTran 11:3802c82a5ae9 54 }
DuyLionTran 11:3802c82a5ae9 55 }
DuyLionTran 11:3802c82a5ae9 56 else
DuyLionTran 11:3802c82a5ae9 57 bytes += rc;
DuyLionTran 11:3802c82a5ae9 58 }
DuyLionTran 11:3802c82a5ae9 59 while (bytes < len && timer.read_ms() < timeout);
DuyLionTran 11:3802c82a5ae9 60 timer.stop();
DuyLionTran 11:3802c82a5ae9 61 return bytes;
DuyLionTran 11:3802c82a5ae9 62 }
DuyLionTran 11:3802c82a5ae9 63
DuyLionTran 11:3802c82a5ae9 64 /* returns the number of bytes read, which could be 0.
DuyLionTran 11:3802c82a5ae9 65 -1 if there was an error on the socket
DuyLionTran 11:3802c82a5ae9 66 */
DuyLionTran 11:3802c82a5ae9 67 int read(unsigned char* buffer, int len, int timeout)
DuyLionTran 11:3802c82a5ae9 68 {
DuyLionTran 11:3802c82a5ae9 69 return common(buffer, len, timeout, true);
DuyLionTran 11:3802c82a5ae9 70 }
DuyLionTran 11:3802c82a5ae9 71
DuyLionTran 11:3802c82a5ae9 72 int write(unsigned char* buffer, int len, int timeout)
DuyLionTran 11:3802c82a5ae9 73 {
DuyLionTran 11:3802c82a5ae9 74 return common(buffer, len, timeout, false);
DuyLionTran 11:3802c82a5ae9 75 }
DuyLionTran 11:3802c82a5ae9 76
DuyLionTran 11:3802c82a5ae9 77 int disconnect()
DuyLionTran 11:3802c82a5ae9 78 {
DuyLionTran 11:3802c82a5ae9 79 open = false;
DuyLionTran 11:3802c82a5ae9 80 return mysock.close();
DuyLionTran 11:3802c82a5ae9 81 }
DuyLionTran 11:3802c82a5ae9 82
DuyLionTran 11:3802c82a5ae9 83 /*bool is_connected()
DuyLionTran 11:3802c82a5ae9 84 {
DuyLionTran 11:3802c82a5ae9 85 return mysock.is_connected();
DuyLionTran 11:3802c82a5ae9 86 }*/
DuyLionTran 11:3802c82a5ae9 87
DuyLionTran 11:3802c82a5ae9 88 private:
DuyLionTran 11:3802c82a5ae9 89
DuyLionTran 11:3802c82a5ae9 90 bool open;
DuyLionTran 11:3802c82a5ae9 91 TCPSocket mysock;
DuyLionTran 11:3802c82a5ae9 92 EthernetInterface *net;
DuyLionTran 11:3802c82a5ae9 93 Timer timer;
DuyLionTran 11:3802c82a5ae9 94
DuyLionTran 11:3802c82a5ae9 95 };
DuyLionTran 11:3802c82a5ae9 96
DuyLionTran 11:3802c82a5ae9 97 #endif