diff --git a/src/TinyMqtt.cpp b/src/TinyMqtt.cpp index 1f59474..e9d7ca3 100644 --- a/src/TinyMqtt.cpp +++ b/src/TinyMqtt.cpp @@ -174,10 +174,10 @@ bool MqttBroker::compareString( return *good==0; } -void MqttMessage::getString(char* &buffer, uint16_t& len) +void MqttMessage::getString(const char* &buff, uint16_t& len) { - len = (buffer[0]<<8)|(buffer[1]); - buffer+=2; + len = (buff[0]<<8)|(buff[1]); + buff+=2; } void MqttClient::clientAlive(uint32_t more_seconds) @@ -226,7 +226,7 @@ void MqttClient::processMessage() std::string s; // Serial << "---> INCOMING " << _HEX(message.type()) << ", mem=" << ESP.getFreeHeap() << endl; auto header = message.getVHeader(); - char* payload; + const char* payload; uint16_t len; bool bclose=true; @@ -420,15 +420,14 @@ void MqttClient::publish(const Topic& topic, MqttMessage& msg) void MqttMessage::reset() { - curr=buffer; - *curr=0; // Type Unknown + buffer.clear(); state=FixedHeader; size=0; } void MqttMessage::incoming(char in_byte) { - *curr++ = in_byte; + buffer += in_byte; switch(state) { case FixedHeader: @@ -443,7 +442,7 @@ void MqttMessage::incoming(char in_byte) } else if ((in_byte & 0x80) == 0) { - vheader = curr; + vheader = buffer.length(); if (size==0) state = Complete; else @@ -464,15 +463,14 @@ void MqttMessage::incoming(char in_byte) break; case Complete: default: - curr--; Serial << "Spurious " << _HEX(in_byte) << endl; - state = Error; + reset(); break; } - if (curr-buffer > 250) + if (buffer.length() > 256) // TODO magic 256 ? { - debug("Spurious byte " << _HEX(in_byte)); - curr=buffer; + debug("Too long"); + reset(); } } @@ -496,29 +494,26 @@ void MqttMessage::encodeLength(char* msb, int length) void MqttMessage::sendTo(MqttClient* client) { - if (curr-buffer-2 >= 0) + if (buffer.size()>2) { - encodeLength(buffer+1, curr-buffer-2); + encodeLength(&buffer[1], buffer.size()-2); // hexdump("snd"); - client->write(buffer, curr-buffer); + client->write(&buffer[0], buffer.size()); } else { Serial << "??? Invalid send" << endl; - Serial << (long)end() << "-" << (long)buffer << endl; } } void MqttMessage::hexdump(const char* prefix) const { if (prefix) Serial << prefix << ' '; - Serial << (long)buffer << "-" << (long)curr << " : "; - const char* p=buffer; - while(p!=curr) + Serial << "size(" << buffer.size() << ") : "; + for(const char chr: buffer) { - if (*p<16) Serial << '0'; - Serial << _HEX(*p) << ' '; - p++; + if (chr<16) Serial << '0'; + Serial << _HEX(chr) << ' '; } Serial << endl; } diff --git a/src/TinyMqtt.h b/src/TinyMqtt.h index f5a392e..0d927cb 100644 --- a/src/TinyMqtt.h +++ b/src/TinyMqtt.h @@ -51,15 +51,15 @@ class MqttMessage void add(const char* p, size_t len); void add(const std::string& s) { add(s.c_str(), s.length()); } void add(const Topic& t) { add(t.str()); } - char* getVHeader() const { return vheader; } - char* end() const { return curr; } - uint16_t length() const { return curr-buffer; } + const char* end() const { return &buffer[0]+buffer.size(); } + const char* getVHeader() const { return &buffer[vheader]; } + uint16_t length() const { return buffer.size(); } void reset(); // buff is MSB/LSB/STRING // output buff+=2, len=length(str) - void getString(char* &buff, uint16_t& len); + static void getString(const char* &buff, uint16_t& len); Type type() const @@ -69,9 +69,9 @@ class MqttMessage void create(Type type) { - buffer[0]=type; - curr=buffer+2; - vheader=curr; + buffer=(char)type; + buffer+='\0'; + vheader=2; size=0; state=Create; } @@ -81,9 +81,8 @@ class MqttMessage private: void encodeLength(char* msb, int length); - char buffer[256]; // TODO why 256 ? (should be replaced by a std::string) - char* vheader; - char* curr; + std::string buffer; + uint8_t vheader; uint16_t size; // bytes left to receive State state; }; @@ -169,26 +168,6 @@ class MqttClient CallBack callback = nullptr; }; -/*********************************************** - * R1 - accept external cnx - * R2 - allows all clients pusblish to go outside - * R3 - allows ext publish to all clients - * R4 - allows local publish to local clients - * R5 - tries to connect elsewhere (*) - * R6 - disconnect external clients - * R7 - allows all publish to go everywhere - * --------------------------------------------- - * (*) single client or ip range - * --------------------------------------------- - * - * ================================================+ - * | connected | not connected | - * -------------+---------------+------------------+ - * proxy broker | R2 R3 R5 R6 | R5 R7 | - * normal broker| R2 R3 R5 R6 | R1 R5 R7 | - * -------------+---------------+------------------+ - * - */ class MqttBroker { enum State