2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
46#include "lib/MqttMapper.h"
47#include "mqttbroker/lib/MqttModel.h"
49#include <iot/mqtt/packets/Publish.h>
50#include <iot/mqtt/packets/Subscribe.h>
51#include <iot/mqtt/packets/Unsubscribe.h>
52#include <iot/mqtt/server/broker/Broker.h>
54#ifndef DOXYGEN_SHOULD_SKIP_THIS
61namespace mqtt::mqttbroker::
lib {
71 const std::shared_ptr<iot::
mqtt::server::
broker::Broker>& broker,
73 : iot::
mqtt::server::Mqtt(connectionName, broker)
95 const auto now = utils::Timeval::currentTime();
101 mqtt->broker->publish(
102 mqtt->clientId, duePublish.getTopic(), duePublish.getMessage(), duePublish.getQoS(), duePublish.getRetain());
111 auto delay =
top().when - utils::Timeval::currentTime();
112 if (delay < utils::Timeval{}) {
113 delay = utils::Timeval{};
116 delayTimer = core::timer::Timer::singleshotTimer(
128 minHeap.push({utils::Timeval::currentTime() + delay,
nextSeq++, publish, delay});
145 broker->subscribe(clientId, topic, qoS);
150 broker->unsubscribe(clientId, topic);
161 if (mqttMapper !=
nullptr) {
168 for (
const iot::
mqtt::
packets::Publish& mappedPublish : mappedPublishes.first) {
170 clientId, mappedPublish.getTopic(), mappedPublish.getMessage(), mappedPublish.getQoS(), mappedPublish.getRetain());
178 for (
const iot::
mqtt::Topic& topic : subscribe.getTopics()) {
184 for (
const std::string& topic : unsubscribe.getTopics()) {
MappedPublishes getMappings(const iot::mqtt::packets::Publish &publish)
std::pair< std::vector< iot::mqtt::packets::Publish >, std::vector< ScheduledPublish > > MappedPublishes
void connectClient(Mqtt *mqtt)
void publishMessage(const std::string &topic, const std::string &message, uint8_t qoS, bool retain)
static MqttModel & instance()
void unsubscribeClient(const std::string &clientId, const std::string &topic)
void subscribeClient(const std::string &clientId, const std::string &topic, const uint8_t qos)
void disconnectClient(const std::string &clientId)
void delayPublish(const utils::Timeval &delay, const iot::mqtt::packets::Publish &publish)
const ScheduledPublish & top() const
std::priority_queue< ScheduledPublish, std::vector< ScheduledPublish >, EarlierFirst > minHeap
core::timer::Timer delayTimer
void unsubscribe(const std::string &topic)
void onPublish(const iot::mqtt::packets::Publish &publish) final
void onConnect(const iot::mqtt::packets::Connect &connect) final
void subscribe(const std::string &topic, uint8_t qoS)
void onDisconnected() final
std::shared_ptr< mqtt::lib::MqttMapper > mqttMapper
void onSubscribe(const iot::mqtt::packets::Subscribe &subscribe) final
void onUnsubscribe(const iot::mqtt::packets::Unsubscribe &unsubscribe) final
Mqtt(const std::string &connectionName, const std::shared_ptr< iot::mqtt::server::broker::Broker > &broker, const std::shared_ptr< mqtt::lib::MqttMapper > &mqttMapper)
DelayedQueue delayedQueue
iot::mqtt::packets::Publish publish
bool operator()(const ScheduledPublish &a, const ScheduledPublish &b) const
iot::mqtt::packets::Publish publish