waterish_os_rev3_public/libraries/MQTT_Client/MQTTClient.h

98 lines
2.6 KiB
C++

/*
* Copyright (C) 2018 Andreas Motzek andreas-motzek@t-online.de
*
* This file is part of the MQTT Client package.
*
* You can use, redistribute and/or modify this file under the terms of the Modified Artistic License.
* See http://simplysomethings.de/open+source/modified+artistic+license.html for details.
*
* This file is distributed in the hope that it will be useful, but without any warranty; without even
* the implied warranty of merchantability or fitness for a particular purpose.
*/
#ifndef MQTTClient_h
#define MQTTClient_h
#include "Client.h"
#include "CooperativeMultitasking.h"
class MQTTClient {
friend class MQTTTopic;
private:
struct PublishPacket {
bool retain;
const char* topicname;
char* payload;
uint16_t packetid;
uint16_t trycount;
PublishPacket* next;
};
static MQTTClient* current;
CooperativeMultitasking* tasks;
Client* client;
char* host;
uint16_t port;
char* clientid;
char* username;
char* password;
uint16_t keepalive;
bool isconnected;
PublishPacket* head;
PublishPacket* tail;
void enqueuePublishPacket(PublishPacket* packet);
void transmitPublishPacketsAfter(unsigned long duration);
void transmitPublishPackets();
void removePublishPacket(uint16_t packetid);
void rotatePublishPackets();
bool sendConnectPacket();
void receiveConnectAcknowledgementPacket();
bool sendHeadPublishPacket();
void receivePublishAcknowledgementPacket();
void sendDisconnectPacket();
void writeTypeFlags(uint8_t type, uint8_t flags);
void writePacketLength(int value);
void writeLengthString(const char* value);
void writeString(const char* value, size_t len);
void writeShort(uint16_t value);
void writeByte(uint8_t value);
uint8_t readByte();
uint16_t readShort();
void flush();
int getWriteError();
int available();
void stop();
static char* strdupOrNull(const char* string);
protected:
bool publish(bool retain, const char* topicname, const char* payload);
public:
MQTTClient(CooperativeMultitasking* tasks, Client* client, const char* host, uint16_t port, const char* clientid, const char* username, const char* password, uint16_t keepalive = 300);
virtual ~MQTTClient();
bool connect();
bool connected();
bool publishAcknowledged();
void disconnect();
};
class MQTTTopic {
private:
MQTTClient* client;
char* topicname;
bool retain;
public:
MQTTTopic(MQTTClient* client, const char* topicname);
virtual ~MQTTTopic();
bool publish(const char* payload, bool retain = true);
};
#endif