[MqttClient] Fix keep_alive decoding
This commit is contained in:
@@ -106,7 +106,7 @@ void MqttClient::connect(std::string broker, uint16_t port, uint16_t ka)
|
|||||||
#ifdef TINY_MQTT_ASYNC
|
#ifdef TINY_MQTT_ASYNC
|
||||||
client->onData(onData, this);
|
client->onData(onData, this);
|
||||||
client->onConnect(onConnect, this);
|
client->onConnect(onConnect, this);
|
||||||
client->connect(broker.c_str(), port);
|
client->connect(broker.c_str(), port, ka);
|
||||||
#else
|
#else
|
||||||
if (client->connect(broker.c_str(), port))
|
if (client->connect(broker.c_str(), port))
|
||||||
{
|
{
|
||||||
@@ -259,7 +259,7 @@ bool MqttBroker::compareString(
|
|||||||
|
|
||||||
void MqttMessage::getString(const char* &buff, uint16_t& len)
|
void MqttMessage::getString(const char* &buff, uint16_t& len)
|
||||||
{
|
{
|
||||||
len = (buff[0]<<8)|(buff[1]);
|
len = getSize(buff);
|
||||||
buff+=2;
|
buff+=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,8 +321,8 @@ void MqttClient::onConnect(void *mqttclient_ptr, TcpClient*)
|
|||||||
msg.add(0x4); // Mqtt protocol version 3.1.1
|
msg.add(0x4); // Mqtt protocol version 3.1.1
|
||||||
msg.add(0x0); // Connect flags TODO user / name
|
msg.add(0x0); // Connect flags TODO user / name
|
||||||
|
|
||||||
msg.add(0x00); // keep_alive
|
msg.add((char)(mqtt->keep_alive >> 8)); // keep_alive
|
||||||
msg.add((char)mqtt->keep_alive);
|
msg.add((char)(mqtt->keep_alive & 0xFF));
|
||||||
msg.add(mqtt->clientId);
|
msg.add(mqtt->clientId);
|
||||||
debug("cnx: mqtt connecting");
|
debug("cnx: mqtt connecting");
|
||||||
msg.sendTo(mqtt);
|
msg.sendTo(mqtt);
|
||||||
@@ -443,7 +443,7 @@ void MqttClient::processMessage(MqttMessage* mesg)
|
|||||||
}
|
}
|
||||||
payload = header+10;
|
payload = header+10;
|
||||||
mqtt_flags = header[7];
|
mqtt_flags = header[7];
|
||||||
keep_alive = (header[8]<<8)|(header[9]);
|
keep_alive = MqttMessage::getSize(header+8);
|
||||||
if (strncmp("MQTT", header+2,4))
|
if (strncmp("MQTT", header+2,4))
|
||||||
{
|
{
|
||||||
debug("bad mqtt header");
|
debug("bad mqtt header");
|
||||||
|
|||||||
@@ -104,6 +104,11 @@ class MqttMessage
|
|||||||
Create=6
|
Create=6
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline uint32_t getSize(const char* buffer)
|
||||||
|
{
|
||||||
|
const unsigned char* bun = (const unsigned char*)buffer;
|
||||||
|
return (*bun << 8) | bun[1]; }
|
||||||
|
|
||||||
MqttMessage() { reset(); }
|
MqttMessage() { reset(); }
|
||||||
MqttMessage(Type t, uint8_t bits_d3_d0=0) { create(t); buffer[0] |= bits_d3_d0; }
|
MqttMessage(Type t, uint8_t bits_d3_d0=0) { create(t); buffer[0] |= bits_d3_d0; }
|
||||||
void incoming(char byte);
|
void incoming(char byte);
|
||||||
@@ -250,6 +255,7 @@ class MqttClient
|
|||||||
#ifdef EPOXY_DUINO
|
#ifdef EPOXY_DUINO
|
||||||
static std::map<MqttMessage::Type, int> counters; // Number of processed messages
|
static std::map<MqttMessage::Type, int> counters; // Number of processed messages
|
||||||
#endif
|
#endif
|
||||||
|
uint32_t keepAlive() const { return keep_alive; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@@ -312,6 +318,8 @@ class MqttBroker
|
|||||||
client->dump(indent);
|
client->dump(indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<MqttClient*> getClients() const { return clients; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class MqttClient;
|
friend class MqttClient;
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TinyMqtt network unit tests.
|
* TinyMqtt network unit tests.
|
||||||
@@ -140,6 +141,41 @@ test(suback)
|
|||||||
assertEqual(MqttClient::counters[MqttMessage::Type::SubAck], 1);
|
assertEqual(MqttClient::counters[MqttMessage::Type::SubAck], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test(network_client_keep_alive_high)
|
||||||
|
{
|
||||||
|
const uint32_t keep_alive=1000;
|
||||||
|
start_servers(2, true);
|
||||||
|
assertEqual(WiFi.status(), WL_CONNECTED);
|
||||||
|
|
||||||
|
MqttBroker broker(1883);
|
||||||
|
broker.begin();
|
||||||
|
IPAddress broker_ip = WiFi.localIP();
|
||||||
|
|
||||||
|
ESP8266WiFiClass::selectInstance(2);
|
||||||
|
MqttClient client;
|
||||||
|
client.connect(broker_ip.toString().c_str(), 1883, keep_alive);
|
||||||
|
broker.loop();
|
||||||
|
|
||||||
|
assertTrue(broker.clientsCount() == 1);
|
||||||
|
assertTrue(client.connected());
|
||||||
|
|
||||||
|
MqttClient::counters[MqttMessage::Type::SubAck] = 0;
|
||||||
|
client.subscribe("a/b");
|
||||||
|
|
||||||
|
// TODO how to avoid these loops ???
|
||||||
|
broker.loop();
|
||||||
|
client.loop();
|
||||||
|
|
||||||
|
assertEqual(MqttClient::counters[MqttMessage::Type::SubAck], 1);
|
||||||
|
|
||||||
|
uint32_t sz = broker.getClients().size();
|
||||||
|
assertEqual(sz , (uint32_t)1);
|
||||||
|
|
||||||
|
uint32_t ka = broker.getClients()[0]->keepAlive();
|
||||||
|
assertEqual(ka, keep_alive);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
test(network_client_to_broker_connexion)
|
test(network_client_to_broker_connexion)
|
||||||
{
|
{
|
||||||
start_servers(2, true);
|
start_servers(2, true);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ EXTRA_CXXFLAGS=-g3 -O0
|
|||||||
CXXFLAGS = -Wextra -Wall -std=gnu++11 -fno-exceptions -fno-threadsafe-statics
|
CXXFLAGS = -Wextra -Wall -std=gnu++11 -fno-exceptions -fno-threadsafe-statics
|
||||||
|
|
||||||
APP_NAME := nowifi-tests
|
APP_NAME := nowifi-tests
|
||||||
ARDUINO_LIBS := AUnit AceCommon AceTime TinyMqtt EspMock ESP8266WiFi ESPAsyncTCP
|
ARDUINO_LIBS := AUnit AceCommon AceTime TinyMqtt EspMock ESP8266WiFi ESPAsyncTCP TinyConsole
|
||||||
ARDUINO_LIB_DIRS := ../../../EspMock/libraries
|
ARDUINO_LIB_DIRS := ../../../EspMock/libraries
|
||||||
EPOXY_CORE := EPOXY_CORE_ESP8266
|
EPOXY_CORE := EPOXY_CORE_ESP8266
|
||||||
include ../../../EpoxyDuino/EpoxyDuino.mk
|
include ../../../EpoxyDuino/EpoxyDuino.mk
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
EXTRA_CXXFLAGS=-g3 -O0
|
EXTRA_CXXFLAGS=-g3 -O0
|
||||||
|
|
||||||
APP_NAME := string-indexer-tests
|
APP_NAME := string-indexer-tests
|
||||||
ARDUINO_LIBS := AUnit AceCommon AceTime TinyMqtt EspMock ESP8266WiFi ESPAsync
|
ARDUINO_LIBS := AUnit AceCommon AceTime TinyMqtt EspMock ESP8266WiFi ESPAsync TinyConsole
|
||||||
ARDUINO_LIB_DIRS := ../../../EspMock/libraries
|
ARDUINO_LIB_DIRS := ../../../EspMock/libraries
|
||||||
EPOXY_CORE := EPOXY_CORE_ESP8266
|
EPOXY_CORE := EPOXY_CORE_ESP8266
|
||||||
include ../../../EpoxyDuino/EpoxyDuino.mk
|
include ../../../EpoxyDuino/EpoxyDuino.mk
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
EXTRA_CXXFLAGS=-g3 -O0
|
EXTRA_CXXFLAGS=-g3 -O0
|
||||||
|
|
||||||
APP_NAME := topic-tests
|
APP_NAME := topic-tests
|
||||||
ARDUINO_LIBS := AUnit AceCommon AceTime TinyMqtt EspMock ESP8266WiFi ESPAsync
|
ARDUINO_LIBS := AUnit AceCommon AceTime TinyMqtt EspMock ESP8266WiFi ESPAsync TinyConsole
|
||||||
ARDUINO_LIB_DIRS := ../../../EspMock/libraries
|
ARDUINO_LIB_DIRS := ../../../EspMock/libraries
|
||||||
EPOXY_CORE := EPOXY_CORE_ESP8266
|
EPOXY_CORE := EPOXY_CORE_ESP8266
|
||||||
include ../../../EpoxyDuino/EpoxyDuino.mk
|
include ../../../EpoxyDuino/EpoxyDuino.mk
|
||||||
|
|||||||
Reference in New Issue
Block a user