v-16

Dependencies:   FP MQTTPacket

Committer:
DuyLionTran
Date:
Tue Dec 12 15:58:09 2017 +0000
Revision:
0:818366b014c9
version 1.6;

Who changed what in which revision?

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