MqttClient::unsubscribe implemented

This commit is contained in:
hsaturn
2021-03-29 20:35:55 +02:00
parent bd7fa8f39c
commit d5dd896b45
5 changed files with 37 additions and 19 deletions

View File

@@ -6,7 +6,7 @@
"type": "git", "type": "git",
"url": "https://github.com/hsaturn/TinyMqtt.git" "url": "https://github.com/hsaturn/TinyMqtt.git"
}, },
"version": "0.7.0", "version": "0.7.1",
"exclude": "", "exclude": "",
"examples": "examples/*/*.ino", "examples": "examples/*/*.ino",
"frameworks": "arduino", "frameworks": "arduino",

View File

@@ -1,5 +1,5 @@
name=TinyMqtt name=TinyMqtt
version=0.7.0 version=0.7.1
author=Francois BIOT, HSaturn, <hsaturn@gmail.com> author=Francois BIOT, HSaturn, <hsaturn@gmail.com>
maintainer=Francois BIOT, HSaturn, <hsaturn@gmail.com> maintainer=Francois BIOT, HSaturn, <hsaturn@gmail.com>
sentence=A tiny broker and client library for MQTT messaging. sentence=A tiny broker and client library for MQTT messaging.

View File

@@ -41,7 +41,6 @@ MqttClient::~MqttClient()
{ {
close(); close();
delete client; delete client;
Serial << "Client deleted" << endl;
} }
void MqttClient::close(bool bSendDisconnect) void MqttClient::close(bool bSendDisconnect)
@@ -269,10 +268,30 @@ MqttError MqttClient::subscribe(Topic topic, uint8_t qos)
subscriptions.insert(topic); subscriptions.insert(topic);
if (parent==nullptr) // remote broker ? if (parent==nullptr) // remote broker
{ {
debug("remote subscribe"); return sendTopic(topic, MqttMessage::Type::Subscribe, qos);
MqttMessage msg(MqttMessage::Type::Subscribe, 2); }
return ret;
}
MqttError MqttClient::unsubscribe(Topic topic)
{
auto it=subscriptions.find(topic);
if (it != subscriptions.end())
{
subscriptions.erase(it);
if (parent==nullptr) // remote broker
{
return sendTopic(topic, MqttMessage::Type::UnSubscribe, 0);
}
}
return MqttOk;
}
MqttError MqttClient::sendTopic(const Topic& topic, MqttMessage::Type type, uint8_t qos)
{
MqttMessage msg(type, 2);
// TODO manage packet identifier // TODO manage packet identifier
msg.add(0); msg.add(0);
@@ -280,11 +299,9 @@ MqttError MqttClient::subscribe(Topic topic, uint8_t qos)
msg.add(topic); msg.add(topic);
msg.add(qos); msg.add(qos);
ret = msg.sendTo(this);
// TODO we should wait (state machine) for SUBACK // TODO instead we should wait (state machine) for SUBACK / UNSUBACK ?
} return msg.sendTo(this);
return ret;
} }
long MqttClient::counter=0; long MqttClient::counter=0;

View File

@@ -149,7 +149,7 @@ class MqttClient
MqttError publish(const Topic& t) { return publish(t, nullptr, 0);}; MqttError publish(const Topic& t) { return publish(t, nullptr, 0);};
MqttError subscribe(Topic topic, uint8_t qos=0); MqttError subscribe(Topic topic, uint8_t qos=0);
MqttError unsubscribe(Topic& topic); MqttError unsubscribe(Topic topic);
// connected to local broker // connected to local broker
// TODO seems to be useless // TODO seems to be useless
@@ -178,6 +178,7 @@ class MqttClient
static long counter; // Number of messages sent static long counter; // Number of messages sent
private: private:
MqttError sendTopic(const Topic& topic, MqttMessage::Type type, uint8_t qos);
void resubscribe(); void resubscribe();
friend class MqttBroker; friend class MqttBroker;

View File

@@ -96,8 +96,9 @@ test(local_unsubscribe)
MqttClient publisher(&broker); MqttClient publisher(&broker);
publisher.publish("a/b"); publisher.publish("a/b");
// subscriber.unsubscribe("a/b"); TODO not yet implemented subscriber.unsubscribe("a/b");
publisher.publish("a/b");
publisher.publish("a/b"); publisher.publish("a/b");
assertTrue(published[""]["a/b"] == 1); // Only one publish has been received assertTrue(published[""]["a/b"] == 1); // Only one publish has been received
@@ -120,7 +121,6 @@ test(local_nocallback_when_destroyed)
assertEqual(published.size(), (size_t)0); // Only one publish has been received assertEqual(published.size(), (size_t)0); // Only one publish has been received
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
// setup() and loop() // setup() and loop()
void setup() { void setup() {