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 
9 
10 namespace Aws
11 {
12  namespace Crt
13  {
14  namespace Mqtt
15  {
16  struct IoTDeviceSDKMetrics;
17  }
18  namespace Mqtt5
19  {
20  class ConnectPacket;
21  class ConnAckPacket;
22  class DisconnectPacket;
23  class Mqtt5Client;
24  class Mqtt5ClientOptions;
25  class NegotiatedSettings;
26  class PublishResult;
27  class PublishPacket;
28  class PubAckPacket;
29  class SubscribePacket;
30  class SubAckPacket;
31  class UnsubscribePacket;
32  class UnSubAckPacket;
33  class Mqtt5ClientCore;
34 
35  class Mqtt5to3AdapterOptions;
36 
37  struct PublishAcknowledgementHandle;
38 
46  {
47 
52  Default = AWS_MQTT5_COTABT_DEFAULT,
53 
62  Manual = AWS_MQTT5_COTABT_MANUAL,
63 
68  LRU = AWS_MQTT5_COTABT_LRU,
69 
73  Disabled = AWS_MQTT5_COTABT_DISABLED,
74  };
75 
84  {
85 
90  Default = AWS_MQTT5_CITABT_DEFAULT,
91 
95  Enabled = AWS_MQTT5_CITABT_ENABLED,
96 
100  Disabled = AWS_MQTT5_CITABT_DISABLED,
101  };
102 
107  {
108 
118 
130 
138 
148  };
149 
151  {
157 
163 
169 
176  };
177 
182  {
188 
194 
200 
206  };
207 
213  {
215  };
216 
221  {
222  OnConnectionFailureEventData() : errorCode(AWS_ERROR_SUCCESS), connAckPacket(nullptr) {}
223 
225  std::shared_ptr<ConnAckPacket> connAckPacket;
226  };
227 
232  {
233  OnConnectionSuccessEventData() : connAckPacket(nullptr), negotiatedSettings(nullptr) {}
234 
235  std::shared_ptr<ConnAckPacket> connAckPacket;
236  std::shared_ptr<NegotiatedSettings> negotiatedSettings;
237  };
238 
243  {
244  OnDisconnectionEventData() : errorCode(AWS_ERROR_SUCCESS), disconnectPacket(nullptr) {}
245 
247  std::shared_ptr<DisconnectPacket> disconnectPacket;
248  };
249 
255  {
257  };
258 
263  {
264  PublishReceivedEventData() : publishPacket(nullptr) {}
265 
266  std::shared_ptr<PublishPacket> publishPacket;
267 
280  std::function<ScopedResource<PublishAcknowledgementHandle>()> acquirePublishAcknowledgement;
281  };
282 
287  using OnConnectionSuccessHandler = std::function<void(const OnConnectionSuccessEventData &)>;
288 
292  using OnConnectionFailureHandler = std::function<void(const OnConnectionFailureEventData &)>;
293 
297  using OnDisconnectionHandler = std::function<void(const OnDisconnectionEventData &)>;
298 
303  using OnAttemptingConnectHandler = std::function<void(const OnAttemptingConnectEventData &)>;
304 
309  using OnStoppedHandler = std::function<void(const OnStoppedEventData &)>;
310 
314  using OnPublishCompletionHandler = std::function<void(int, std::shared_ptr<PublishResult>)>;
315 
319  using OnSubscribeCompletionHandler = std::function<void(int, std::shared_ptr<SubAckPacket>)>;
320 
324  using OnUnsubscribeCompletionHandler = std::function<void(int, std::shared_ptr<UnSubAckPacket>)>;
325 
337  using OnPublishReceivedHandler = std::function<void(const PublishReceivedEventData &)>;
338 
344  std::function<void(const std::shared_ptr<Http::HttpRequest> &, int)>;
345 
353  std::function<void(std::shared_ptr<Http::HttpRequest>, const OnWebSocketHandshakeInterceptComplete &)>;
354 
360  class AWS_CRT_CPP_API Mqtt5Client final : public std::enable_shared_from_this<Mqtt5Client>
361  {
362  friend class Mqtt::MqttConnection;
363 
364  public:
372  static std::shared_ptr<Mqtt5Client> NewMqtt5Client(
373  const Mqtt5ClientOptions &options,
374  Allocator *allocator = ApiAllocator()) noexcept;
375 
382  std::shared_ptr<Mqtt5Client> getptr() { return shared_from_this(); }
383 
387  operator bool() const noexcept;
388 
392  int LastError() const noexcept;
393 
401  bool Start() const noexcept;
402 
409  bool Stop() noexcept;
410 
420  bool Stop(std::shared_ptr<DisconnectPacket> disconnectPacket) noexcept;
421 
430  bool Publish(
431  std::shared_ptr<PublishPacket> publishPacket,
432  OnPublishCompletionHandler onPublishCompletionCallback = NULL) noexcept;
433 
442  bool Subscribe(
443  std::shared_ptr<SubscribePacket> subscribePacket,
444  OnSubscribeCompletionHandler onSubscribeCompletionCallback = NULL) noexcept;
445 
454  bool Unsubscribe(
455  std::shared_ptr<UnsubscribePacket> unsubscribePacket,
456  OnUnsubscribeCompletionHandler onUnsubscribeCompletionCallback = NULL) noexcept;
457 
463  const Mqtt5ClientOperationStatistics &GetOperationStatistics() noexcept;
464 
476  bool InvokePublishAcknowledgement(
477  const PublishAcknowledgementHandle &publishAcknowledgementHandle) noexcept;
478 
479  ~Mqtt5Client();
480 
481  struct aws_mqtt5_client *GetUnderlyingHandle() const noexcept;
482 
483  private:
484  Mqtt5Client(const Mqtt5ClientOptions &options, Allocator *allocator = ApiAllocator()) noexcept;
485 
486  /* The client core to handle the user callbacks and c client termination */
487  std::shared_ptr<Mqtt5ClientCore> m_client_core;
488 
489  Mqtt5ClientOperationStatistics m_operationStatistics;
490  };
491 
496  {
497  friend class Mqtt5ClientCore;
498  friend class Mqtt5to3AdapterOptions;
499 
500  public:
504  Mqtt5ClientOptions(Crt::Allocator *allocator = ApiAllocator()) noexcept;
505 
513  Mqtt5ClientOptions &WithHostName(Crt::String hostname);
514 
522  Mqtt5ClientOptions &WithPort(uint32_t port) noexcept;
523 
532  Mqtt5ClientOptions &WithBootstrap(Io::ClientBootstrap *bootStrap) noexcept;
533 
541  Mqtt5ClientOptions &WithSocketOptions(Io::SocketOptions socketOptions) noexcept;
542 
550  Mqtt5ClientOptions &WithTlsConnectionOptions(const Io::TlsConnectionOptions &tslOptions) noexcept;
551 
559  Mqtt5ClientOptions &WithHttpProxyOptions(
560  const Crt::Http::HttpClientConnectionProxyOptions &proxyOptions) noexcept;
561 
569  Mqtt5ClientOptions &WithConnectOptions(std::shared_ptr<ConnectPacket> connectPacket) noexcept;
570 
578  Mqtt5ClientOptions &WithSessionBehavior(ClientSessionBehaviorType sessionBehavior) noexcept;
579 
589  Mqtt5ClientOptions &WithClientExtendedValidationAndFlowControl(
590  ClientExtendedValidationAndFlowControl clientExtendedValidationAndFlowControl) noexcept;
591 
602  Mqtt5ClientOptions &WithOfflineQueueBehavior(
603  ClientOperationQueueBehaviorType offlineQueueBehavior) noexcept;
604 
613  Mqtt5ClientOptions &WithReconnectOptions(ReconnectOptions reconnectOptions) noexcept;
614 
621  Mqtt5ClientOptions &WithTopicAliasingOptions(TopicAliasingOptions topicAliasingOptions) noexcept;
622 
631  Mqtt5ClientOptions &WithPingTimeoutMs(uint32_t pingTimeoutMs) noexcept;
632 
641  Mqtt5ClientOptions &WithConnackTimeoutMs(uint32_t connackTimeoutMs) noexcept;
642 
653  Mqtt5ClientOptions &WithAckTimeoutSeconds(uint32_t ackTimeoutSec) noexcept;
654 
663  Mqtt5ClientOptions &WithAckTimeoutSec(uint32_t ackTimeoutSec) noexcept;
664 
676  Mqtt5ClientOptions &WithWebsocketHandshakeTransformCallback(
677  OnWebSocketHandshakeIntercept callback) noexcept;
678 
686  Mqtt5ClientOptions &WithClientConnectionSuccessCallback(OnConnectionSuccessHandler callback) noexcept;
687 
695  Mqtt5ClientOptions &WithClientConnectionFailureCallback(OnConnectionFailureHandler callback) noexcept;
696 
704  Mqtt5ClientOptions &WithClientDisconnectionCallback(OnDisconnectionHandler callback) noexcept;
705 
713  Mqtt5ClientOptions &WithClientStoppedCallback(OnStoppedHandler callback) noexcept;
714 
722  Mqtt5ClientOptions &WithClientAttemptingConnectCallback(OnAttemptingConnectHandler callback) noexcept;
723 
731  Mqtt5ClientOptions &WithPublishReceivedCallback(OnPublishReceivedHandler callback) noexcept;
732 
739  Mqtt5ClientOptions &WithMetricsCollection(bool enabled) noexcept;
740 
748  bool initializeRawOptions(aws_mqtt5_client_options &raw_options) const noexcept;
749 
751  Mqtt5ClientOptions(const Mqtt5ClientOptions &) = delete;
753  Mqtt5ClientOptions &operator=(const Mqtt5ClientOptions &) = delete;
754  Mqtt5ClientOptions &operator=(Mqtt5ClientOptions &&) = delete;
755 
756  private:
763  OnWebSocketHandshakeIntercept websocketHandshakeTransform;
764 
768  OnConnectionSuccessHandler onConnectionSuccess;
769 
773  OnConnectionFailureHandler onConnectionFailure;
774 
778  OnDisconnectionHandler onDisconnection;
779 
785  OnStoppedHandler onStopped;
786 
792  OnAttemptingConnectHandler onAttemptingConnect;
793 
800  OnPublishReceivedHandler onPublishReceived;
801 
805  Crt::String m_hostName;
806 
810  uint32_t m_port;
811 
815  Io::ClientBootstrap *m_bootstrap;
816 
821  Crt::Io::SocketOptions m_socketOptions;
822 
827  Crt::Optional<Crt::Io::TlsConnectionOptions> m_tlsConnectionOptions;
828 
832  Crt::Optional<Crt::Http::HttpClientConnectionProxyOptions> m_proxyOptions;
833 
838  std::shared_ptr<ConnectPacket> m_connectOptions;
839 
843  ClientSessionBehaviorType m_sessionBehavior;
844 
849  ClientExtendedValidationAndFlowControl m_extendedValidationAndFlowControlOptions;
850 
857  ClientOperationQueueBehaviorType m_offlineQueueBehavior;
858 
862  ReconnectOptions m_reconnectionOptions;
863 
867  aws_mqtt5_client_topic_alias_options m_topicAliasingOptions;
868 
873  uint32_t m_pingTimeoutMs;
874 
879  uint32_t m_connackTimeoutMs;
880 
885  uint32_t m_ackTimeoutSec;
886 
887  bool m_enableMetrics = true;
888  Crt::ScopedResource<Mqtt::IoTDeviceSDKMetrics> m_sdkMetrics;
889 
890  /* Underlying Parameters */
891  Crt::Allocator *m_allocator;
892  aws_http_proxy_options m_httpProxyOptionsStorage;
893  aws_mqtt5_packet_connect_view m_packetConnectViewStorage;
894  struct aws_mqtt_iot_metrics m_metricsStorage;
895  };
896 
897  } // namespace Mqtt5
898  } // namespace Crt
899 } // namespace Aws
std::shared_ptr< ConnAckPacket > connAckPacket
Definition: Mqtt5Client.h:225
Definition: Mqtt5Client.h:242
Definition: Mqtt5Client.h:254
#define AWS_CRT_CPP_API
Definition: Exports.h:36
std::function< void(const OnStoppedEventData &)> OnStoppedHandler
Definition: Mqtt5Client.h:309
Crt::Optional< uint16_t > m_outboundCacheMaxSize
Definition: Mqtt5Client.h:129
Definition: Mqtt5Packets.h:2037
Definition: Mqtt5Client.h:106
std::function< void(const OnConnectionFailureEventData &)> OnConnectionFailureHandler
Definition: Mqtt5Client.h:292
Definition: Mqtt5Packets.h:671
OnAttemptingConnectEventData()
Definition: Mqtt5Client.h:214
std::function< void(const std::shared_ptr< Http::HttpRequest > &, int)> OnWebSocketHandshakeInterceptComplete
Definition: Mqtt5Client.h:344
Definition: StringView.h:861
uint64_t incompleteOperationCount
Definition: Mqtt5Client.h:187
std::basic_string< char, std::char_traits< char >, StlAllocator< char >> String
Definition: Types.h:45
Crt::Optional< uint16_t > m_inboundCacheMaxSize
Definition: Mqtt5Client.h:147
aws_allocator Allocator
Definition: Allocator.h:14
Crt::Optional< InboundTopicAliasBehaviorType > m_inboundBehavior
Definition: Mqtt5Client.h:137
uint64_t unackedOperationSize
Definition: Mqtt5Client.h:205
OnConnectionFailureEventData()
Definition: Mqtt5Client.h:222
Definition: Mqtt5Packets.h:1559
std::shared_ptr< ConnAckPacket > connAckPacket
Definition: Mqtt5Client.h:235
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:324
OutboundTopicAliasBehaviorType
Definition: Mqtt5Client.h:45
std::shared_ptr< PublishPacket > publishPacket
Definition: Mqtt5Client.h:266
aws_mqtt5_client_operation_queue_behavior_type ClientOperationQueueBehaviorType
Definition: Mqtt5Types.h:223
std::function< void(const OnConnectionSuccessEventData &)> OnConnectionSuccessHandler
Definition: Mqtt5Client.h:287
std::shared_ptr< DisconnectPacket > disconnectPacket
Definition: Mqtt5Client.h:247
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:156
uint64_t incompleteOperationSize
Definition: Mqtt5Client.h:193
Definition: Mqtt5Client.h:150
uint64_t unackedOperationCount
Definition: Mqtt5Client.h:199
uint64_t m_maxReconnectDelayMs
Definition: Mqtt5Client.h:168
uint64_t m_minReconnectDelayMs
Definition: Mqtt5Client.h:162
OnDisconnectionEventData()
Definition: Mqtt5Client.h:244
Definition: Mqtt5Client.h:262
std::function< void(int, std::shared_ptr< PublishResult >)> OnPublishCompletionHandler
Definition: Mqtt5Client.h:314
OnConnectionSuccessEventData()
Definition: Mqtt5Client.h:233
AWS_CRT_CPP_API int LastError() noexcept
Definition: Api.cpp:464
PublishReceivedEventData()
Definition: Mqtt5Client.h:264
std::function< void(int, std::shared_ptr< SubAckPacket >)> OnSubscribeCompletionHandler
Definition: Mqtt5Client.h:319
aws_exponential_backoff_jitter_mode ExponentialBackoffJitterMode
Definition: Mqtt5Types.h:242
uint64_t m_minConnectedTimeToResetReconnectDelayMs
Definition: Mqtt5Client.h:175
OnStoppedEventData()
Definition: Mqtt5Client.h:256
std::function< void(const OnDisconnectionEventData &)> OnDisconnectionHandler
Definition: Mqtt5Client.h:297
Definition: Mqtt5Client.h:495
std::unique_ptr< T, std::function< void(T *)>> ScopedResource
Definition: Types.h:163
std::function< void(const OnAttemptingConnectEventData &)> OnAttemptingConnectHandler
Definition: Mqtt5Client.h:303
std::function< void(const PublishReceivedEventData &)> OnPublishReceivedHandler
Definition: Mqtt5Client.h:337
InboundTopicAliasBehaviorType
Definition: Mqtt5Client.h:83
Definition: Mqtt5Client.h:360
Crt::Optional< OutboundTopicAliasBehaviorType > m_outboundBehavior
Definition: Mqtt5Client.h:117
std::function< void(std::shared_ptr< Http::HttpRequest >, const OnWebSocketHandshakeInterceptComplete &)> OnWebSocketHandshakeIntercept
Definition: Mqtt5Client.h:353
std::shared_ptr< NegotiatedSettings > negotiatedSettings
Definition: Mqtt5Client.h:236
Definition: Mqtt5Packets.h:52
int errorCode
Definition: Mqtt5Client.h:246
Definition: MqttConnection.h:157
Definition: Allocator.h:10
int errorCode
Definition: Mqtt5Client.h:224