MQTT client to test the ENC28J60-EMAC on NUCLEO-F446RE.

Dependencies:   ENC28J60-EMAC

Committer:
hudakz
Date:
Mon Mar 29 09:32:44 2021 +0000
Revision:
5:d9570dbf2f82
Parent:
0:238f0d0c0ba3
MQTT client to test the ENC28J60-EMAC on NUCLEO-F446RE.

Who changed what in which revision?

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