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;
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user