SNode.C
Loading...
Searching...
No Matches
Mqtt.cpp
Go to the documentation of this file.
1/*
2 * SNode.C - A Slim Toolkit for Network Communication
3 * Copyright (C) Volker Christian <me@vchrist.at>
4 * 2020, 2021, 2022, 2023, 2024, 2025, 2026
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published
8 * by the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20/*
21 * MIT License
22 *
23 * Permission is hereby granted, free of charge, to any person obtaining a copy
24 * of this software and associated documentation files (the "Software"), to deal
25 * in the Software without restriction, including without limitation the rights
26 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
27 * copies of the Software, and to permit persons to whom the Software is
28 * furnished to do so, subject to the following conditions:
29 *
30 * The above copyright notice and this permission notice shall be included in
31 * all copies or substantial portions of the Software.
32 *
33 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
39 * THE SOFTWARE.
40 */
41
42#include "iot/mqtt/server/Mqtt.h"
43
44#include "iot/mqtt/MqttContext.h"
45#include "iot/mqtt/packets/Connack.h"
46#include "iot/mqtt/packets/Pingresp.h"
47#include "iot/mqtt/packets/Suback.h"
48#include "iot/mqtt/packets/Unsuback.h"
49#include "iot/mqtt/server/broker/Broker.h"
50#include "iot/mqtt/server/packets/Connect.h"
51#include "iot/mqtt/server/packets/Disconnect.h"
52#include "iot/mqtt/server/packets/Pingreq.h"
53#include "iot/mqtt/server/packets/Puback.h"
54#include "iot/mqtt/server/packets/Pubcomp.h"
55#include "iot/mqtt/server/packets/Publish.h"
56#include "iot/mqtt/server/packets/Pubrec.h"
57#include "iot/mqtt/server/packets/Pubrel.h"
58#include "iot/mqtt/server/packets/Subscribe.h"
59#include "iot/mqtt/server/packets/Unsubscribe.h"
60
61#ifndef DOXYGEN_SHOULD_SKIP_THIS
62
63#include "log/Logger.h"
64
65#include <cstdint>
66#include <iomanip>
67
68#endif // DOXYGEN_SHOULD_SKIP_THIS
69
70namespace iot::mqtt::server {
71
72 Mqtt::Mqtt(const std::string& connectionName, const std::shared_ptr<broker::Broker>& broker)
73 : Super(connectionName)
74 , broker(broker) {
75 }
76
84
85 bool Mqtt::onSignal([[maybe_unused]] int sig) {
86 willFlag = false;
87 return true;
88 }
89
90 iot::mqtt::ControlPacketDeserializer* Mqtt::createControlPacketDeserializer(iot::mqtt::FixedHeader& fixedHeader) const {
91 iot::mqtt::ControlPacketDeserializer* controlPacketDeserializer = nullptr; // NOLINT
92
93 switch (fixedHeader.getType()) {
94 case MQTT_CONNECT:
95 controlPacketDeserializer =
96 new iot::mqtt::server::packets::Connect(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
97 break;
98 case MQTT_PUBLISH:
99 controlPacketDeserializer =
100 new iot::mqtt::server::packets::Publish(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
101 break;
102 case MQTT_PUBACK:
103 controlPacketDeserializer =
104 new iot::mqtt::server::packets::Puback(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
105 break;
106 case MQTT_PUBREC:
107 controlPacketDeserializer =
108 new iot::mqtt::server::packets::Pubrec(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
109 break;
110 case MQTT_PUBREL:
111 controlPacketDeserializer =
112 new iot::mqtt::server::packets::Pubrel(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
113 break;
114 case MQTT_PUBCOMP:
115 controlPacketDeserializer =
116 new iot::mqtt::server::packets::Pubcomp(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
117 break;
118 case MQTT_SUBSCRIBE:
119 controlPacketDeserializer =
120 new iot::mqtt::server::packets::Subscribe(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
121 break;
122 case MQTT_UNSUBSCRIBE:
123 controlPacketDeserializer =
124 new iot::mqtt::server::packets::Unsubscribe(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
125 break;
126 case MQTT_PINGREQ:
127 controlPacketDeserializer =
128 new iot::mqtt::server::packets::Pingreq(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
129 break;
130 case MQTT_DISCONNECT:
131 controlPacketDeserializer =
132 new iot::mqtt::server::packets::Disconnect(fixedHeader.getRemainingLength(), fixedHeader.getFlags());
133 break;
134 default:
135 controlPacketDeserializer = nullptr;
136 break;
137 }
138
139 return controlPacketDeserializer;
140 }
141
142 void Mqtt::deliverPacket(iot::mqtt::ControlPacketDeserializer* controlPacketDeserializer) {
143 static_cast<iot::mqtt::server::ControlPacketDeserializer*>(controlPacketDeserializer)->deliverPacket(this); // NOLINT
144 }
145
146 bool Mqtt::initSession(const utils::Timeval& keepAlive) {
147 bool success = true;
148
149 if (broker->hasActiveSession(clientId)) {
150 LOG(ERROR) << connectionName << " MQTT Broker: Existing session found for ClientId = " << clientId;
151 LOG(ERROR) << connectionName << " MQTT Broker: closing";
153
154 willFlag = false;
155 success = false;
156 } else if (broker->hasRetainedSession(clientId)) {
157 LOG(INFO) << connectionName << " MQTT Broker: Retained session found for ClientId = " << clientId;
158 if (cleanSession) {
159 LOG(DEBUG) << connectionName << " New SessionId = " << this;
161
162 broker->unsubscribe(clientId);
163 initSession(broker->newSession(clientId, this), keepAlive);
164 } else {
165 LOG(DEBUG) << connectionName << " Renew SessionId = " << this;
167
168 initSession(broker->renewSession(clientId, this), keepAlive);
170 }
171 } else {
172 LOG(INFO) << connectionName << " MQTT Broker: No session found for ClientId = " << clientId;
173 LOG(INFO) << connectionName << " MQTT Broker: new SessionId = " << this;
174
176
177 initSession(broker->newSession(clientId, this), keepAlive);
178 }
179
180 return success;
181 }
182
184 if (broker->isActiveSession(clientId, this)) {
185 if (cleanSession) {
186 LOG(DEBUG) << connectionName << " MQTT Broker: Delete session for ClientId = " << clientId;
187 LOG(DEBUG) << connectionName << " MQTT Broker: SessionId = " << this;
189 } else {
190 LOG(DEBUG) << connectionName << " MQTT Broker: Retain session for ClientId = " << clientId;
191 LOG(DEBUG) << connectionName << " MQTT Broker: SessionId = " << this;
193 }
194 }
195 }
196
197 void Mqtt::distributePublish(const iot::mqtt::packets::Publish& publish) {
198 broker->publish(clientId, publish.getTopic(), publish.getMessage(), publish.getQoS(), publish.getRetain());
199
200 onPublish(publish);
201 }
202
203 void Mqtt::onConnect([[maybe_unused]] const iot::mqtt::packets::Connect& connect) {
204 }
205
206 void Mqtt::onSubscribe([[maybe_unused]] const iot::mqtt::packets::Subscribe& subscribe) {
207 }
208
209 void Mqtt::onUnsubscribe([[maybe_unused]] const iot::mqtt::packets::Unsubscribe& unsubscribe) {
210 }
211
212 void Mqtt::onPingreq([[maybe_unused]] const iot::mqtt::packets::Pingreq& pingreq) {
213 }
214
215 void Mqtt::onDisconnect([[maybe_unused]] const iot::mqtt::packets::Disconnect& disconnect) {
216 }
217
218 void Mqtt::_onConnect(const iot::mqtt::server::packets::Connect& connect) {
219 LOG(INFO) << connectionName << " MQTT Broker: Protocol: " << connect.getProtocol();
220 LOG(INFO) << connectionName << " MQTT Broker: Version: " << static_cast<uint16_t>(connect.getLevel());
221 LOG(INFO) << connectionName << " MQTT Broker: ConnectFlags: 0x" << std::hex << std::setfill('0') << std::setw(2)
222 << static_cast<uint16_t>(connect.getConnectFlags()) << std::dec << std::setw(0);
223 LOG(INFO) << connectionName << " MQTT Broker: KeepAlive: " << connect.getKeepAlive();
224 LOG(INFO) << connectionName << " MQTT Broker: ClientID: " << connect.getClientId();
225 LOG(INFO) << connectionName << " MQTT Broker: CleanSession: " << connect.getCleanSession();
226
227 if (connect.getWillFlag()) {
228 LOG(INFO) << connectionName << " MQTT Broker: WillTopic: " << connect.getWillTopic();
229 LOG(INFO) << connectionName << " MQTT Broker: WillMessage: " << connect.getWillMessage();
230 LOG(INFO) << connectionName << " MQTT Broker: WillQoS: " << static_cast<uint16_t>(connect.getWillQoS());
231 LOG(INFO) << connectionName << " MQTT Broker: WillRetain: " << connect.getWillRetain();
232 }
233 if (connect.getUsernameFlag()) {
234 LOG(INFO) << connectionName << " MQTT Broker: Username: " << connect.getUsername();
235 }
236 if (connect.getPasswordFlag()) {
237 LOG(INFO) << connectionName << " MQTT Broker: Password: " << connect.getPassword();
238 }
239
240 if (connect.getProtocol() != "MQTT") {
241 LOG(ERROR) << connectionName << " MQTT Broker: Wrong Protocol: " << connect.getProtocol();
243 } else if ((connect.getLevel()) != MQTT_VERSION_3_1_1) {
244 LOG(ERROR) << connectionName << " MQTT Broker: Wrong Protocol Level: " << MQTT_VERSION_3_1_1 << " != " << connect.getLevel();
246
248 } else if (connect.isFakedClientId() && !connect.getCleanSession()) {
249 LOG(ERROR) << connectionName << " MQTT Broker: Resume session but no ClientId present";
251
253 } else if (!connect.getWillFlag() && (connect.getWillQoS() != 0 || connect.getWillRetain())) {
254 LOG(ERROR) << connectionName << " MQTT Broker: WillFlag not set but WillQoS or WillRetain set";
255
257 } else if (connect.getWillQoS() > 2) {
258 LOG(ERROR) << connectionName << " MQTT Broker: WillQoS larger than 2";
259
261 } else if (connect.getPasswordFlag() && !connect.getUsernameFlag()) {
262 LOG(ERROR) << connectionName << " MQTT Broker: Password flag set but username flag not";
263
265 } else {
266 // V-Header
267 protocol = connect.getProtocol();
268 level = connect.getLevel();
269 reflect = connect.getReflect();
271 keepAlive = connect.getKeepAlive();
272
273 // Payload
274 clientId = connect.getClientId();
275 willTopic = connect.getWillTopic();
277 username = connect.getUsername();
278 password = connect.getPassword();
279
280 // Derived from flags
284 willQoS = connect.getWillQoS();
285 willFlag = connect.getWillFlag();
287
289 onConnect(connect);
290 } else {
292 }
293 }
294 }
295
296 void Mqtt::_onPublish(const iot::mqtt::server::packets::Publish& publish) {
297 if (Super::_onPublish(publish)) {
298 distributePublish(publish);
299 }
300 }
301
302 void Mqtt::_onSubscribe(const iot::mqtt::server::packets::Subscribe& subscribe) {
303 if (subscribe.getPacketIdentifier() == 0) {
304 LOG(ERROR) << connectionName << " MQTT Broker: PackageIdentifier missing";
306 } else {
307 LOG(DEBUG) << connectionName << " MQTT Broker: PacketIdentifier: 0x" << std::hex << std::setfill('0') << std::setw(4)
308 << subscribe.getPacketIdentifier() << std::dec;
309
310 for (const iot::mqtt::Topic& topic : subscribe.getTopics()) {
311 LOG(INFO) << connectionName << " MQTT Broker: Topic filter: '" << topic.getName()
312 << "', QoS: " << static_cast<uint16_t>(topic.getQoS());
313 }
314
315 std::list<uint8_t> returnCodes;
316 for (const iot::mqtt::Topic& topic : subscribe.getTopics()) {
317 const uint8_t returnCode = broker->subscribe(clientId, topic.getName(), topic.getQoS());
318 returnCodes.push_back(returnCode);
319 }
320
321 sendSuback(subscribe.getPacketIdentifier(), returnCodes);
322
323 onSubscribe(subscribe);
324 }
325 }
326
327 void Mqtt::_onUnsubscribe(const iot::mqtt::server::packets::Unsubscribe& unsubscribe) {
328 if (unsubscribe.getPacketIdentifier() == 0) {
329 LOG(ERROR) << connectionName << " MQTT Broker: PackageIdentifier missing";
331 } else {
332 LOG(DEBUG) << connectionName << " MQTT Broker: PacketIdentifier: 0x" << std::hex << std::setfill('0') << std::setw(4)
333 << unsubscribe.getPacketIdentifier() << std::dec;
334
335 for (const std::string& topic : unsubscribe.getTopics()) {
336 LOG(INFO) << connectionName << " MQTT Broker: Topic: " << topic;
337 }
338
339 for (const std::string& topic : unsubscribe.getTopics()) {
340 broker->unsubscribe(clientId, topic);
341 }
342
344
345 onUnsubscribe(unsubscribe);
346 }
347 }
348
349 void Mqtt::_onPingreq(const iot::mqtt::server::packets::Pingreq& pingreq) {
351
352 onPingreq(pingreq);
353 }
354
355 void Mqtt::_onDisconnect(const iot::mqtt::server::packets::Disconnect& disconnect) {
356 willFlag = false;
357
358 onDisconnect(disconnect);
359
361 }
362
363 void Mqtt::sendConnack(uint8_t returnCode, uint8_t flags) const { // Server
364 send(iot::mqtt::packets::Connack(returnCode, flags));
365 }
366
367 void Mqtt::sendSuback(uint16_t packetIdentifier, const std::list<uint8_t>& returnCodes) const { // Server
368 send(iot::mqtt::packets::Suback(packetIdentifier, returnCodes));
369 }
370
371 void Mqtt::sendUnsuback(uint16_t packetIdentifier) const { // Server
372 send(iot::mqtt::packets::Unsuback(packetIdentifier));
373 }
374
375 void Mqtt::sendPingresp() const { // Server
377 }
378
379 std::list<std::string> Mqtt::getSubscriptions() const {
380 return broker->getSubscriptions(clientId);
381 }
382
383 std::string Mqtt::getProtocol() const {
384 return protocol;
385 }
386
387 uint8_t Mqtt::getLevel() const {
388 return level;
389 }
390
391 uint8_t Mqtt::getConnectFlags() const {
392 return connectFlags;
393 }
394
395 uint16_t Mqtt::getKeepAlive() const {
396 return keepAlive;
397 }
398
399 std::string Mqtt::getClientId() const {
400 return clientId;
401 }
402
403 std::string Mqtt::getWillTopic() const {
404 return willTopic;
405 }
406
407 std::string Mqtt::getWillMessage() const {
408 return willMessage;
409 }
410
411 std::string Mqtt::getUsername() const {
412 return username;
413 }
414
415 std::string Mqtt::getPassword() const {
416 return password;
417 }
418
419 bool Mqtt::getUsernameFlag() const {
420 return usernameFlag;
421 }
422
423 bool Mqtt::getPasswordFlag() const {
424 return passwordFlag;
425 }
426
427 bool Mqtt::getWillRetain() const {
428 return willRetain;
429 }
430
431 uint8_t Mqtt::getWillQoS() const {
432 return willQoS;
433 }
434
435 bool Mqtt::getWillFlag() const {
436 return willFlag;
437 }
438
439 bool Mqtt::getCleanSession() const {
440 return cleanSession;
441 }
442
443 bool Mqtt::getReflect() const {
444 return reflect;
445 }
446
447} // namespace iot::mqtt::server
#define LOG(level)
Definition Logger.h:148
uint8_t getType() const
uint32_t getRemainingLength() const
uint8_t getFlags() const
virtual void close()=0
MqttContext * mqttContext
Definition Mqtt.h:160
virtual void onPublish(const iot::mqtt::packets::Publish &publish)
Definition Mqtt.cpp:250
std::string connectionName
Definition Mqtt.h:144
bool _onPublish(const iot::mqtt::packets::Publish &publish)
Definition Mqtt.cpp:265
void send(const iot::mqtt::ControlPacket &controlPacket) const
Definition Mqtt.cpp:204
std::string clientId
Definition Mqtt.h:145
Mqtt(const std::string &connectionName)
Definition Mqtt.cpp:68
void initSession(Session *session, utils::Timeval keepAlive)
Definition Mqtt.cpp:173
const std::string & getName() const
Definition Topic.cpp:58
uint8_t getQoS() const
Definition Topic.cpp:62
Connack(uint8_t returncode, uint8_t acknowledgeFlags)
Definition Connack.cpp:57
uint8_t getLevel() const
Definition Connect.cpp:124
uint8_t getWillQoS() const
Definition Connect.cpp:152
std::string getClientId() const
Definition Connect.cpp:136
std::string getWillTopic() const
Definition Connect.cpp:168
uint16_t getKeepAlive() const
Definition Connect.cpp:132
std::string getUsername() const
Definition Connect.cpp:176
uint8_t getConnectFlags() const
Definition Connect.cpp:128
std::string getPassword() const
Definition Connect.cpp:180
std::string getWillMessage() const
Definition Connect.cpp:172
std::string getProtocol() const
Definition Connect.cpp:120
uint8_t getQoS() const
Definition Publish.cpp:85
std::string getTopic() const
Definition Publish.cpp:93
std::string getMessage() const
Definition Publish.cpp:97
Suback(uint16_t packetIdentifier, const std::list< uint8_t > &returnCodes)
Definition Suback.cpp:57
const std::list< iot::mqtt::Topic > & getTopics() const
Definition Subscribe.cpp:86
uint16_t getPacketIdentifier() const
Definition Subscribe.cpp:82
Unsuback(uint16_t packetIdentifier)
Definition Unsuback.cpp:57
uint16_t getPacketIdentifier() const
const std::list< std::string > & getTopics() const
virtual void deliverPacket(iot::mqtt::server::Mqtt *mqtt)=0
bool getReflect() const
Definition Mqtt.cpp:443
virtual void onConnect(const iot::mqtt::packets::Connect &connect)
Definition Mqtt.cpp:203
ControlPacketDeserializer * createControlPacketDeserializer(iot::mqtt::FixedHeader &fixedHeader) const final
Definition Mqtt.cpp:90
uint8_t getLevel() const
Definition Mqtt.cpp:387
bool getPasswordFlag() const
Definition Mqtt.cpp:423
void sendSuback(uint16_t packetIdentifier, const std::list< uint8_t > &returnCodes) const
Definition Mqtt.cpp:367
bool getCleanSession() const
Definition Mqtt.cpp:439
std::string password
Definition Mqtt.h:156
bool onSignal(int sig) override
Definition Mqtt.cpp:85
uint8_t getConnectFlags() const
Definition Mqtt.cpp:391
virtual void onSubscribe(const iot::mqtt::packets::Subscribe &subscribe)
Definition Mqtt.cpp:206
uint16_t getKeepAlive() const
Definition Mqtt.cpp:395
void _onPingreq(const iot::mqtt::server::packets::Pingreq &pingreq)
Definition Mqtt.cpp:349
virtual void onPingreq(const iot::mqtt::packets::Pingreq &pingreq)
Definition Mqtt.cpp:212
bool getWillRetain() const
Definition Mqtt.cpp:427
std::string getProtocol() const
Definition Mqtt.cpp:383
void _onUnsubscribe(const iot::mqtt::server::packets::Unsubscribe &unsubscribe)
Definition Mqtt.cpp:327
bool getUsernameFlag() const
Definition Mqtt.cpp:419
virtual void onDisconnect(const iot::mqtt::packets::Disconnect &disconnect)
Definition Mqtt.cpp:215
void _onPublish(const iot::mqtt::server::packets::Publish &publish)
Definition Mqtt.cpp:296
void deliverPacket(iot::mqtt::ControlPacketDeserializer *controlPacketDeserializer) override
Definition Mqtt.cpp:142
void _onSubscribe(const iot::mqtt::server::packets::Subscribe &subscribe)
Definition Mqtt.cpp:302
bool initSession(const utils::Timeval &keepAlive)
Definition Mqtt.cpp:146
std::list< std::string > getSubscriptions() const
Definition Mqtt.cpp:379
iot::mqtt::Mqtt Super
Definition Mqtt.h:89
std::string getWillMessage() const
Definition Mqtt.cpp:407
void _onConnect(const iot::mqtt::server::packets::Connect &connect)
Definition Mqtt.cpp:218
void sendPingresp() const
Definition Mqtt.cpp:375
std::string willMessage
Definition Mqtt.h:154
void sendConnack(uint8_t returnCode, uint8_t flags) const
Definition Mqtt.cpp:363
std::string username
Definition Mqtt.h:155
std::string protocol
Definition Mqtt.h:148
std::string getClientId() const
Definition Mqtt.cpp:399
uint8_t getWillQoS() const
Definition Mqtt.cpp:431
virtual void onUnsubscribe(const iot::mqtt::packets::Unsubscribe &unsubscribe)
Definition Mqtt.cpp:209
std::string getWillTopic() const
Definition Mqtt.cpp:403
bool getWillFlag() const
Definition Mqtt.cpp:435
void distributePublish(const iot::mqtt::packets::Publish &publish) final
Definition Mqtt.cpp:197
std::string willTopic
Definition Mqtt.h:153
void sendUnsuback(uint16_t packetIdentifier) const
Definition Mqtt.cpp:371
void _onDisconnect(const iot::mqtt::server::packets::Disconnect &disconnect)
Definition Mqtt.cpp:355
Mqtt(const std::string &connectionName, const std::shared_ptr< broker::Broker > &broker)
Definition Mqtt.cpp:72
std::string getUsername() const
Definition Mqtt.cpp:411
std::string getPassword() const
Definition Mqtt.cpp:415
void restartSession(const std::string &clientId)
Definition Broker.cpp:165
uint8_t subscribe(const std::string &clientId, const std::string &topic, uint8_t qoS)
Definition Broker.cpp:202
bool hasActiveSession(const std::string &clientId)
Definition Broker.cpp:186
bool isActiveSession(const std::string &clientId, const Mqtt *mqtt)
Definition Broker.cpp:194
void publish(const std::string &originClientId, const std::string &topic, const std::string &message, uint8_t qoS, bool retain)
Definition Broker.cpp:147
std::list< std::string > getSubscriptions(const std::string &clientId) const
Definition Broker.cpp:225
void unsubscribe(const std::string &clientId, const std::string &topic)
Definition Broker.cpp:221
Session * renewSession(const std::string &clientId, iot::mqtt::server::Mqtt *mqtt)
Definition Broker.cpp:161
void deleteSession(const std::string &clientId)
Definition Broker.cpp:177
void unsubscribe(const std::string &clientId)
Definition Broker.cpp:217
bool hasRetainedSession(const std::string &clientId)
Definition Broker.cpp:190
Session * newSession(const std::string &clientId, iot::mqtt::server::Mqtt *mqtt)
Definition Broker.cpp:155
void retainSession(const std::string &clientId)
Definition Broker.cpp:173
Connect(uint32_t remainingLength, uint8_t flags)
Definition Connect.cpp:56
Disconnect(uint32_t remainingLength, uint8_t flags)
Pingreq(uint32_t remainingLength, uint8_t flags)
Definition Pingreq.cpp:52
Puback(uint32_t remainingLength, uint8_t flags)
Definition Puback.cpp:52
Pubcomp(uint32_t remainingLength, uint8_t flags)
Definition Pubcomp.cpp:52
Publish(uint32_t remainingLength, uint8_t flags)
Definition Publish.cpp:52
Pubrec(uint32_t remainingLength, uint8_t flags)
Definition Pubrec.cpp:52
Pubrel(uint32_t remainingLength, uint8_t flags)
Definition Pubrel.cpp:52
Subscribe(uint32_t remainingLength, uint8_t flags)
Definition Subscribe.cpp:54
Unsubscribe(uint32_t remainingLength, uint8_t flags)
LogMessage(Level level, int verboseLevel=-1, bool withErrno=false)
Definition Logger.cpp:280
#define MQTT_SESSION_NEW
Definition Connack.h:66
#define MQTT_CONNACK_ACCEPT
Definition Connack.h:59
#define MQTT_CONNACK_UNACEPTABLEVERSION
Definition Connack.h:60
#define MQTT_SESSION_PRESENT
Definition Connack.h:67
#define MQTT_CONNACK_IDENTIFIERREJECTED
Definition Connack.h:61
#define MQTT_CONNECT
Definition Connect.h:58
#define MQTT_VERSION_3_1_1
Definition Connect.h:60
#define MQTT_DISCONNECT
Definition Disconnect.h:55
#define MQTT_PINGREQ
Definition Pingreq.h:55
#define MQTT_PUBACK
Definition Puback.h:57
#define MQTT_PUBCOMP
Definition Pubcomp.h:57
#define MQTT_PUBLISH
Definition Publish.h:58
#define MQTT_PUBREC
Definition Pubrec.h:57
#define MQTT_PUBREL
Definition Pubrel.h:57
#define MQTT_SUBSCRIBE
Definition Subscribe.h:59
#define MQTT_UNSUBSCRIBE
Definition Unsubscribe.h:59