Removed buffer 256 thus less memory is needed for MqttClient instances

This commit is contained in:
hsaturn
2021-03-21 17:21:36 +01:00
parent 4fd34bfffa
commit ed9efbb5ce
2 changed files with 27 additions and 53 deletions

View File

@@ -174,10 +174,10 @@ bool MqttBroker::compareString(
return *good==0; 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]); len = (buff[0]<<8)|(buff[1]);
buffer+=2; buff+=2;
} }
void MqttClient::clientAlive(uint32_t more_seconds) void MqttClient::clientAlive(uint32_t more_seconds)
@@ -226,7 +226,7 @@ void MqttClient::processMessage()
std::string s; std::string s;
// Serial << "---> INCOMING " << _HEX(message.type()) << ", mem=" << ESP.getFreeHeap() << endl; // Serial << "---> INCOMING " << _HEX(message.type()) << ", mem=" << ESP.getFreeHeap() << endl;
auto header = message.getVHeader(); auto header = message.getVHeader();
char* payload; const char* payload;
uint16_t len; uint16_t len;
bool bclose=true; bool bclose=true;
@@ -420,15 +420,14 @@ void MqttClient::publish(const Topic& topic, MqttMessage& msg)
void MqttMessage::reset() void MqttMessage::reset()
{ {
curr=buffer; buffer.clear();
*curr=0; // Type Unknown
state=FixedHeader; state=FixedHeader;
size=0; size=0;
} }
void MqttMessage::incoming(char in_byte) void MqttMessage::incoming(char in_byte)
{ {
*curr++ = in_byte; buffer += in_byte;
switch(state) switch(state)
{ {
case FixedHeader: case FixedHeader:
@@ -443,7 +442,7 @@ void MqttMessage::incoming(char in_byte)
} }
else if ((in_byte & 0x80) == 0) else if ((in_byte & 0x80) == 0)
{ {
vheader = curr; vheader = buffer.length();
if (size==0) if (size==0)
state = Complete; state = Complete;
else else
@@ -464,15 +463,14 @@ void MqttMessage::incoming(char in_byte)
break; break;
case Complete: case Complete:
default: default:
curr--;
Serial << "Spurious " << _HEX(in_byte) << endl; Serial << "Spurious " << _HEX(in_byte) << endl;
state = Error; reset();
break; break;
} }
if (curr-buffer > 250) if (buffer.length() > 256) // TODO magic 256 ?
{ {
debug("Spurious byte " << _HEX(in_byte)); debug("Too long");
curr=buffer; reset();
} }
} }
@@ -496,29 +494,26 @@ void MqttMessage::encodeLength(char* msb, int length)
void MqttMessage::sendTo(MqttClient* client) 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"); // hexdump("snd");
client->write(buffer, curr-buffer); client->write(&buffer[0], buffer.size());
} }
else else
{ {
Serial << "??? Invalid send" << endl; Serial << "??? Invalid send" << endl;
Serial << (long)end() << "-" << (long)buffer << endl;
} }
} }
void MqttMessage::hexdump(const char* prefix) const void MqttMessage::hexdump(const char* prefix) const
{ {
if (prefix) Serial << prefix << ' '; if (prefix) Serial << prefix << ' ';
Serial << (long)buffer << "-" << (long)curr << " : "; Serial << "size(" << buffer.size() << ") : ";
const char* p=buffer; for(const char chr: buffer)
while(p!=curr)
{ {
if (*p<16) Serial << '0'; if (chr<16) Serial << '0';
Serial << _HEX(*p) << ' '; Serial << _HEX(chr) << ' ';
p++;
} }
Serial << endl; Serial << endl;
} }

View File

@@ -51,15 +51,15 @@ class MqttMessage
void add(const char* p, size_t len); void add(const char* p, size_t len);
void add(const std::string& s) { add(s.c_str(), s.length()); } void add(const std::string& s) { add(s.c_str(), s.length()); }
void add(const Topic& t) { add(t.str()); } void add(const Topic& t) { add(t.str()); }
char* getVHeader() const { return vheader; } const char* end() const { return &buffer[0]+buffer.size(); }
char* end() const { return curr; } const char* getVHeader() const { return &buffer[vheader]; }
uint16_t length() const { return curr-buffer; } uint16_t length() const { return buffer.size(); }
void reset(); void reset();
// buff is MSB/LSB/STRING // buff is MSB/LSB/STRING
// output buff+=2, len=length(str) // 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 Type type() const
@@ -69,9 +69,9 @@ class MqttMessage
void create(Type type) void create(Type type)
{ {
buffer[0]=type; buffer=(char)type;
curr=buffer+2; buffer+='\0';
vheader=curr; vheader=2;
size=0; size=0;
state=Create; state=Create;
} }
@@ -81,9 +81,8 @@ class MqttMessage
private: private:
void encodeLength(char* msb, int length); void encodeLength(char* msb, int length);
char buffer[256]; // TODO why 256 ? (should be replaced by a std::string) std::string buffer;
char* vheader; uint8_t vheader;
char* curr;
uint16_t size; // bytes left to receive uint16_t size; // bytes left to receive
State state; State state;
}; };
@@ -169,26 +168,6 @@ class MqttClient
CallBack callback = nullptr; 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 class MqttBroker
{ {
enum State enum State