Removed buffer 256 thus less memory is needed for MqttClient instances
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user