Provides Javascript wrappers for MQTT.

Dependencies:   mbed-http DEVI2C_JS MQTTPacket FP

Committer:
kajasu
Date:
Mon Feb 03 09:36:20 2020 +0000
Revision:
1:a8ffffd1beab
Parent:
0:f4dbe435e64c
TT

Who changed what in which revision?

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