Provides Javascript wrappers for MQTT.
Dependencies: mbed-http DEVI2C_JS MQTTPacket FP
MQTT/MQTTSocket.h@1:a8ffffd1beab, 2020-02-03 (annotated)
- Committer:
- kajasu
- Date:
- Mon Feb 03 09:36:20 2020 +0000
- Revision:
- 1:a8ffffd1beab
- Parent:
- 0:f4dbe435e64c
TT
Who changed what in which revision?
User | Revision | Line number | New 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 |