iot_water_monitor_v2
Dependencies: easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code
MQTT/MQTTSocket.h@57:898fcb6692cd, 2018-04-03 (annotated)
- 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?
User | Revision | Line number | New 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 |