aws-crt-cpp
C++ wrapper around the aws-c-* libraries. Provides Cross-Platform Transport Protocols and SSL/TLS implementations for C++.
Mqtt5Client.h
Go to the documentation of this file.
1 #pragma once
2 
10 
11 namespace Aws
12 {
13  namespace Crt
14  {
15  namespace Mqtt
16  {
17  class IoTSDKMetricsEncoder;
18  } // namespace Mqtt
19 
20  namespace Mqtt5
21  {
22  class ConnectPacket;
23  class ConnAckPacket;
24  class DisconnectPacket;
25  class Mqtt5Client;
26  class Mqtt5ClientOptions;
27  class NegotiatedSettings;
28  class PublishResult;
29  class PublishPacket;
30  class PubAckPacket;
31  class SubscribePacket;
32  class SubAckPacket;
33  class UnsubscribePacket;
34  class UnSubAckPacket;
35  class Mqtt5ClientCore;
36 
37  class Mqtt5to3AdapterOptions;
38 
39  struct PublishAcknowledgementHandle;
40 
48  {
49 
54  Default = AWS_MQTT5_COTABT_DEFAULT,
55 
64  Manual = AWS_MQTT5_COTABT_MANUAL,
65 
70  LRU = AWS_MQTT5_COTABT_LRU,
71 
75  Disabled = AWS_MQTT5_COTABT_DISABLED,
76  };
77 
86  {
87 
92  Default = AWS_MQTT5_CITABT_DEFAULT,
93 
97  Enabled = AWS_MQTT5_CITABT_ENABLED,
98 
102  Disabled = AWS_MQTT5_CITABT_DISABLED,
103  };
104 
109  {
110 
120 
132 
140 
150  };
151 
153  {
159 
165 
171 
178  };
179 
184  {
190 
196 
202 
208  };
209 
215  {
217  };
218 
223  {
224  OnConnectionFailureEventData() : errorCode(AWS_ERROR_SUCCESS), connAckPacket(nullptr) {}
225 
227  std::shared_ptr<ConnAckPacket> connAckPacket;
228  };
229 
234  {
235  OnConnectionSuccessEventData() : connAckPacket(nullptr), negotiatedSettings(nullptr) {}
236 
237  std::shared_ptr<ConnAckPacket> connAckPacket;
238  std::shared_ptr<NegotiatedSettings> negotiatedSettings;
239  };
240 
245  {
246  OnDisconnectionEventData() : errorCode(AWS_ERROR_SUCCESS), disconnectPacket(nullptr) {}
247 
249  std::shared_ptr<DisconnectPacket> disconnectPacket;
250  };
251 
257  {
259  };
260 
265  {
266  PublishReceivedEventData() : publishPacket(nullptr) {}
267 
268  std::shared_ptr<PublishPacket> publishPacket;
269 
282  std::function<ScopedResource<PublishAcknowledgementHandle>()> acquirePublishAcknowledgement;
283  };
284 
289  using OnConnectionSuccessHandler = std::function<void(const OnConnectionSuccessEventData &)>;
290 
294  using OnConnectionFailureHandler = std::function<void(const OnConnectionFailureEventData &)>;
295 
299  using OnDisconnectionHandler = std::function<void(const OnDisconnectionEventData &)>;
300 
305  using OnAttemptingConnectHandler = std::function<void(const OnAttemptingConnectEventData &)>;
306 
311  using OnStoppedHandler = std::function<void(const OnStoppedEventData &)>;
312 
316  using OnPublishCompletionHandler = std::function<void(int, std::shared_ptr<PublishResult>)>;
317 
321  using OnSubscribeCompletionHandler = std::function<void(int, std::shared_ptr<SubAckPacket>)>;
322 
326  using OnUnsubscribeCompletionHandler = std::function<void(int, std::shared_ptr<UnSubAckPacket>)>;
327 
339  using OnPublishReceivedHandler = std::function<void(const PublishReceivedEventData &)>;
340 
346  std::function<void(const std::shared_ptr<Http::HttpRequest> &, int)>;
347 
355  std::function<void(std::shared_ptr<Http::HttpRequest>, const OnWebSocketHandshakeInterceptComplete &)>;
356 
362  class AWS_CRT_CPP_API Mqtt5Client final : public std::enable_shared_from_this<Mqtt5Client>
363  {
364  friend class Mqtt::MqttConnection;
365 
366  public:
374  static std::shared_ptr<Mqtt5Client> NewMqtt5Client(
375  const Mqtt5ClientOptions &options,
376  Allocator *allocator = ApiAllocator()) noexcept;
377 
384  std::shared_ptr<Mqtt5Client> getptr() { return shared_from_this(); }
385 
389  operator bool() const noexcept;
390 
394  int LastError() const noexcept;
395 
403  bool Start() const noexcept;
404 
411  bool Stop() noexcept;
412 
422  bool Stop(std::shared_ptr<DisconnectPacket> disconnectPacket) noexcept;
423 
432  bool Publish(
433  std::shared_ptr<PublishPacket> publishPacket,
434  OnPublishCompletionHandler onPublishCompletionCallback = NULL) noexcept;
435 
444  bool Subscribe(
445  std::shared_ptr<SubscribePacket> subscribePacket,
446  OnSubscribeCompletionHandler onSubscribeCompletionCallback = NULL) noexcept;
447 
456  bool Unsubscribe(
457  std::shared_ptr<UnsubscribePacket> unsubscribePacket,
458  OnUnsubscribeCompletionHandler onUnsubscribeCompletionCallback = NULL) noexcept;
459 
465  const Mqtt5ClientOperationStatistics &GetOperationStatistics() noexcept;
466 
478  bool InvokePublishAcknowledgement(
479  const PublishAcknowledgementHandle &publishAcknowledgementHandle) noexcept;
480 
481  ~Mqtt5Client();
482 
483  struct aws_mqtt5_client *GetUnderlyingHandle() const noexcept;
484 
485  private:
486  Mqtt5Client(const Mqtt5ClientOptions &options, Allocator *allocator = ApiAllocator()) noexcept;
487 
488  /* The client core to handle the user callbacks and c client termination */
489  std::shared_ptr<Mqtt5ClientCore> m_client_core;
490 
491  Mqtt5ClientOperationStatistics m_operationStatistics;
492  };
493 
498  {
499  friend class Mqtt5ClientCore;
500  friend class Mqtt5to3AdapterOptions;
501  friend class Mqtt::IoTSDKMetricsEncoder;
502 
503  public:
507  Mqtt5ClientOptions(Crt::Allocator *allocator = ApiAllocator()) noexcept;
508 
516  Mqtt5ClientOptions &WithHostName(Crt::String hostname);
517 
525  Mqtt5ClientOptions &WithPort(uint32_t port) noexcept;
526 
535  Mqtt5ClientOptions &WithBootstrap(Io::ClientBootstrap *bootStrap) noexcept;
536 
544  Mqtt5ClientOptions &WithSocketOptions(Io::SocketOptions socketOptions) noexcept;
545 
553  Mqtt5ClientOptions &WithTlsConnectionOptions(const Io::TlsConnectionOptions &tslOptions) noexcept;
554 
562  Mqtt5ClientOptions &WithHttpProxyOptions(
563  const Crt::Http::HttpClientConnectionProxyOptions &proxyOptions) noexcept;
564 
572  Mqtt5ClientOptions &WithConnectOptions(std::shared_ptr<ConnectPacket> connectPacket) noexcept;
573 
581  Mqtt5ClientOptions &WithSessionBehavior(ClientSessionBehaviorType sessionBehavior) noexcept;
582 
592  Mqtt5ClientOptions &WithClientExtendedValidationAndFlowControl(
593  ClientExtendedValidationAndFlowControl clientExtendedValidationAndFlowControl) noexcept;
594 
605  Mqtt5ClientOptions &WithOfflineQueueBehavior(
606  ClientOperationQueueBehaviorType offlineQueueBehavior) noexcept;
607 
616  Mqtt5ClientOptions &WithReconnectOptions(ReconnectOptions reconnectOptions) noexcept;
617 
624  Mqtt5ClientOptions &WithTopicAliasingOptions(TopicAliasingOptions topicAliasingOptions) noexcept;
625 
634  Mqtt5ClientOptions &WithPingTimeoutMs(uint32_t pingTimeoutMs) noexcept;
635 
644  Mqtt5ClientOptions &WithConnackTimeoutMs(uint32_t connackTimeoutMs) noexcept;
645 
656  Mqtt5ClientOptions &WithAckTimeoutSeconds(uint32_t ackTimeoutSec) noexcept;
657 
666  Mqtt5ClientOptions &WithAckTimeoutSec(uint32_t ackTimeoutSec) noexcept;
667 
679  Mqtt5ClientOptions &WithWebsocketHandshakeTransformCallback(
680  OnWebSocketHandshakeIntercept callback) noexcept;
681 
689  Mqtt5ClientOptions &WithClientConnectionSuccessCallback(OnConnectionSuccessHandler callback) noexcept;
690 
698  Mqtt5ClientOptions &WithClientConnectionFailureCallback(OnConnectionFailureHandler callback) noexcept;
699 
707  Mqtt5ClientOptions &WithClientDisconnectionCallback(OnDisconnectionHandler callback) noexcept;
708 
716  Mqtt5ClientOptions &WithClientStoppedCallback(OnStoppedHandler callback) noexcept;
717 
725  Mqtt5ClientOptions &WithClientAttemptingConnectCallback(OnAttemptingConnectHandler callback) noexcept;
726 
734  Mqtt5ClientOptions &WithPublishReceivedCallback(OnPublishReceivedHandler callback) noexcept;
735 
742  Mqtt5ClientOptions &WithMetricsCollection(bool enabled) noexcept;
743 
751  Mqtt5ClientOptions &WithSdkMetrics(const Mqtt::AWSIoTMetrics &sdkMetrics) noexcept;
752 
760  bool initializeRawOptions(aws_mqtt5_client_options &raw_options) const noexcept;
761 
763  Mqtt5ClientOptions(const Mqtt5ClientOptions &) = delete;
765  Mqtt5ClientOptions &operator=(const Mqtt5ClientOptions &) = delete;
766  Mqtt5ClientOptions &operator=(Mqtt5ClientOptions &&) = delete;
767 
768  private:
775  OnWebSocketHandshakeIntercept websocketHandshakeTransform;
776 
780  OnConnectionSuccessHandler onConnectionSuccess;
781 
785  OnConnectionFailureHandler onConnectionFailure;
786 
790  OnDisconnectionHandler onDisconnection;
791 
797  OnStoppedHandler onStopped;
798 
804  OnAttemptingConnectHandler onAttemptingConnect;
805 
812  OnPublishReceivedHandler onPublishReceived;
813 
817  Crt::String m_hostName;
818 
822  uint32_t m_port;
823 
827  Io::ClientBootstrap *m_bootstrap;
828 
833  Crt::Io::SocketOptions m_socketOptions;
834 
839  Crt::Optional<Crt::Io::TlsConnectionOptions> m_tlsConnectionOptions;
840 
844  Crt::Optional<Crt::Http::HttpClientConnectionProxyOptions> m_proxyOptions;
845 
850  std::shared_ptr<ConnectPacket> m_connectOptions;
851 
855  ClientSessionBehaviorType m_sessionBehavior;
856 
861  ClientExtendedValidationAndFlowControl m_extendedValidationAndFlowControlOptions;
862 
869  ClientOperationQueueBehaviorType m_offlineQueueBehavior;
870 
874  ReconnectOptions m_reconnectionOptions;
875 
879  aws_mqtt5_client_topic_alias_options m_topicAliasingOptions;
880 
885  uint32_t m_pingTimeoutMs;
886 
891  uint32_t m_connackTimeoutMs;
892 
897  uint32_t m_ackTimeoutSec;
898 
899  bool m_enableMetrics = true;
900  Crt::Optional<Crt::Mqtt::AWSIoTMetrics> m_sdkMetrics;
901 
902  /* Underlying Parameters */
903  Crt::Allocator *m_allocator;
904  aws_http_proxy_options m_httpProxyOptionsStorage;
905  aws_mqtt5_packet_connect_view m_packetConnectViewStorage;
906 
914  mutable Mqtt::AWSIoTMetrics m_finalMetrics;
915  mutable struct aws_mqtt_iot_metrics m_metricsStorage;
916  };
917 
918  } // namespace Mqtt5
919  } // namespace Crt
920 } // namespace Aws
std::shared_ptr< ConnAckPacket > connAckPacket
Definition: Mqtt5Client.h:227
Definition: Mqtt5Client.h:244
Definition: Mqtt5Client.h:256
#define AWS_CRT_CPP_API
Definition: Exports.h:36
std::function< void(const OnStoppedEventData &)> OnStoppedHandler
Definition: Mqtt5Client.h:311
Crt::Optional< uint16_t > m_outboundCacheMaxSize
Definition: Mqtt5Client.h:131
Definition: Mqtt5Packets.h:2037
Definition: Mqtt5Client.h:108
std::function< void(const OnConnectionFailureEventData &)> OnConnectionFailureHandler
Definition: Mqtt5Client.h:294
Definition: Mqtt5Packets.h:671
OnAttemptingConnectEventData()
Definition: Mqtt5Client.h:216
std::function< void(const std::shared_ptr< Http::HttpRequest > &, int)> OnWebSocketHandshakeInterceptComplete
Definition: Mqtt5Client.h:346
Definition: StringView.h:861
uint64_t incompleteOperationCount
Definition: Mqtt5Client.h:189
std::basic_string< char, std::char_traits< char >, StlAllocator< char >> String
Definition: Types.h:45
Crt::Optional< uint16_t > m_inboundCacheMaxSize
Definition: Mqtt5Client.h:149
aws_allocator Allocator
Definition: Allocator.h:14
Crt::Optional< InboundTopicAliasBehaviorType > m_inboundBehavior
Definition: Mqtt5Client.h:139
uint64_t unackedOperationSize
Definition: Mqtt5Client.h:207
OnConnectionFailureEventData()
Definition: Mqtt5Client.h:224
Definition: Mqtt5Packets.h:1559
std::shared_ptr< ConnAckPacket > connAckPacket
Definition: Mqtt5Client.h:237
aws_mqtt5_extended_validation_and_flow_control_options ClientExtendedValidationAndFlowControl
Definition: Mqtt5Types.h:200
std::function< void(int, std::shared_ptr< UnSubAckPacket >)> OnUnsubscribeCompletionHandler
Definition: Mqtt5Client.h:326
OutboundTopicAliasBehaviorType
Definition: Mqtt5Client.h:47
std::shared_ptr< PublishPacket > publishPacket
Definition: Mqtt5Client.h:268
aws_mqtt5_client_operation_queue_behavior_type ClientOperationQueueBehaviorType
Definition: Mqtt5Types.h:223
std::function< void(const OnConnectionSuccessEventData &)> OnConnectionSuccessHandler
Definition: Mqtt5Client.h:289
std::shared_ptr< DisconnectPacket > disconnectPacket
Definition: Mqtt5Client.h:249
aws_mqtt5_client_session_behavior_type ClientSessionBehaviorType
Definition: Mqtt5Types.h:186
Definition: Mqtt5Packets.h:2243
AWS_CRT_CPP_API Allocator * ApiAllocator() noexcept
Definition: Allocator.cpp:24
ExponentialBackoffJitterMode m_reconnectMode
Definition: Mqtt5Client.h:158
uint64_t incompleteOperationSize
Definition: Mqtt5Client.h:195
Definition: Mqtt5Client.h:152
uint64_t unackedOperationCount
Definition: Mqtt5Client.h:201
uint64_t m_maxReconnectDelayMs
Definition: Mqtt5Client.h:170
uint64_t m_minReconnectDelayMs
Definition: Mqtt5Client.h:164
OnDisconnectionEventData()
Definition: Mqtt5Client.h:246
Definition: Mqtt5Client.h:264
std::function< void(int, std::shared_ptr< PublishResult >)> OnPublishCompletionHandler
Definition: Mqtt5Client.h:316
OnConnectionSuccessEventData()
Definition: Mqtt5Client.h:235
AWS_CRT_CPP_API int LastError() noexcept
Definition: Api.cpp:469
PublishReceivedEventData()
Definition: Mqtt5Client.h:266
std::function< void(int, std::shared_ptr< SubAckPacket >)> OnSubscribeCompletionHandler
Definition: Mqtt5Client.h:321
aws_exponential_backoff_jitter_mode ExponentialBackoffJitterMode
Definition: Mqtt5Types.h:242
uint64_t m_minConnectedTimeToResetReconnectDelayMs
Definition: Mqtt5Client.h:177
OnStoppedEventData()
Definition: Mqtt5Client.h:258
std::function< void(const OnDisconnectionEventData &)> OnDisconnectionHandler
Definition: Mqtt5Client.h:299
Definition: Mqtt5Client.h:497
std::function< void(const OnAttemptingConnectEventData &)> OnAttemptingConnectHandler
Definition: Mqtt5Client.h:305
std::function< void(const PublishReceivedEventData &)> OnPublishReceivedHandler
Definition: Mqtt5Client.h:339
InboundTopicAliasBehaviorType
Definition: Mqtt5Client.h:85
Definition: Mqtt5Client.h:362
Crt::Optional< OutboundTopicAliasBehaviorType > m_outboundBehavior
Definition: Mqtt5Client.h:119
std::function< void(std::shared_ptr< Http::HttpRequest >, const OnWebSocketHandshakeInterceptComplete &)> OnWebSocketHandshakeIntercept
Definition: Mqtt5Client.h:355
std::shared_ptr< NegotiatedSettings > negotiatedSettings
Definition: Mqtt5Client.h:238
Definition: Mqtt5Packets.h:52
int errorCode
Definition: Mqtt5Client.h:248
Definition: MqttConnection.h:157
Definition: Allocator.h:10
int errorCode
Definition: Mqtt5Client.h:226