From 1f93264fede86bd249f6dca3aa1e2f826bc7e838 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Mon, 10 May 2021 17:07:13 -0700 Subject: [PATCH 1/3] update awscrt dependency for raspberry pi fix --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1d2d47c8..429b327b 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ "Operating System :: OS Independent", ], install_requires=[ - 'awscrt==0.11.14', + 'awscrt==0.11.17', ], python_requires='>=3.5', ) From 74666fcccecf08f2473058f9a3896eb617243a3c Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Mon, 10 May 2021 17:19:49 -0700 Subject: [PATCH 2/3] add --port to pubsub sample The Greengrass MQTT broker only supports port 8883 Also, update mqtt_connection_builder so that passing None for any arg gets you the default value. --- awsiot/mqtt_connection_builder.py | 83 ++++++++++++++++++------------- samples/pubsub.py | 2 + 2 files changed, 51 insertions(+), 34 deletions(-) diff --git a/awsiot/mqtt_connection_builder.py b/awsiot/mqtt_connection_builder.py index 215faa97..5c4cc7ce 100644 --- a/awsiot/mqtt_connection_builder.py +++ b/awsiot/mqtt_connection_builder.py @@ -106,6 +106,20 @@ def _check_required_kwargs(**kwargs): raise TypeError("Builder needs keyword-only argument '{}'".format(required)) +def _get(kwargs, name, default=None): + """ + Returns kwargs['name'] if it exists and is not None. + Otherwise returns default. + + This function exists so users can pass some_arg=None to get its default + value, instead of literally passing None. + """ + val = kwargs.get(name) + if val is None: + val = default + return val + + _metrics_str = None @@ -132,64 +146,65 @@ def _builder( websocket_proxy_options=None, **kwargs): - ca_bytes = kwargs.get('ca_bytes') - ca_filepath = kwargs.get('ca_filepath') - ca_dirpath = kwargs.get('ca_dirpath') + ca_bytes = _get(kwargs, 'ca_bytes') + ca_filepath = _get(kwargs, 'ca_filepath') + ca_dirpath = _get(kwargs, 'ca_dirpath') if ca_bytes: tls_ctx_options.override_default_trust_store(ca_bytes) elif ca_filepath or ca_dirpath: tls_ctx_options.override_default_trust_store_from_path(ca_dirpath, ca_filepath) if use_websockets: - port = 443 + default_port = 443 if awscrt.io.is_alpn_available(): tls_ctx_options.alpn_list = ['http/1.1'] else: - port = 8883 + default_port = 8883 if awscrt.io.is_alpn_available(): - port = 443 + default_port = 443 tls_ctx_options.alpn_list = ['x-amzn-mqtt-ca'] - port = kwargs.get('port', port) + port = _get(kwargs, 'port', default_port) socket_options = awscrt.io.SocketOptions() - socket_options.connect_timeout_ms = kwargs.get('tcp_connect_timeout_ms', 5000) + socket_options.connect_timeout_ms = _get(kwargs, 'tcp_connect_timeout_ms', 5000) # These have been inconsistent between keepalive/keep_alive. Resolve both for now to ease transition. - socket_options.keep_alive = kwargs.get('tcp_keep_alive', kwargs.get('tcp_keepalive', False)) - socket_options.keep_alive_timeout_secs = kwargs.get( - 'tcp_keep_alive_timeout_secs', kwargs.get( - 'tcp_keepalive_timeout_secs', 0)) - socket_options.keep_alive_interval_secs = kwargs.get( - 'tcp_keep_alive_interval_secs', kwargs.get( - 'tcp_keepalive_interval_secs', 0)) - socket_options.keep_alive_max_probes = kwargs.get( - 'tcp_keep_alive_max_probes', kwargs.get( - 'tcp_keepalive_max_probes', 0)) - - username = kwargs.get('username', '') - if kwargs.get('enable_metrics_collection', True): + socket_options.keep_alive = \ + _get(kwargs, 'tcp_keep_alive', _get(kwargs, 'tcp_keepalive', False)) + + socket_options.keep_alive_timeout_secs = \ + _get(kwargs, 'tcp_keep_alive_timeout_secs', _get(kwargs, 'tcp_keepalive_timeout_secs', 0)) + + socket_options.keep_alive_interval_secs = \ + _get(kwargs, 'tcp_keep_alive_interval_secs', _get(kwargs, 'tcp_keepalive_interval_secs', 0)) + + socket_options.keep_alive_max_probes = \ + _get(kwargs, 'tcp_keep_alive_max_probes', _get(kwargs, 'tcp_keepalive_max_probes', 0)) + + username = _get(kwargs, 'username', '') + if _get(kwargs, 'enable_metrics_collection', True): username += _get_metrics_str() - client_bootstrap = kwargs.get('client_bootstrap') + client_bootstrap = _get(kwargs, 'client_bootstrap') tls_ctx = awscrt.io.ClientTlsContext(tls_ctx_options) mqtt_client = awscrt.mqtt.Client(client_bootstrap, tls_ctx) return awscrt.mqtt.Connection( client=mqtt_client, - on_connection_interrupted=kwargs.get('on_connection_interrupted'), - on_connection_resumed=kwargs.get('on_connection_resumed'), - client_id=kwargs.get('client_id'), - host_name=kwargs.get('endpoint'), + on_connection_interrupted=_get(kwargs, 'on_connection_interrupted'), + on_connection_resumed=_get(kwargs, 'on_connection_resumed'), + client_id=_get(kwargs, 'client_id'), + host_name=_get(kwargs, 'endpoint'), port=port, - clean_session=kwargs.get('clean_session', False), - reconnect_min_timeout_secs=kwargs.get('reconnect_min_timeout_secs', 5), - reconnect_max_timeout_secs=kwargs.get('reconnect_max_timeout_secs', 60), - keep_alive_secs=kwargs.get('keep_alive_secs', 1200), - ping_timeout_ms=kwargs.get('ping_timeout_ms', 3000), - protocol_operation_timeout_ms=kwargs.get('protocol_operation_timeout_ms', 0), - will=kwargs.get('will'), + clean_session=_get(kwargs, 'clean_session', False), + reconnect_min_timeout_secs=_get(kwargs, 'reconnect_min_timeout_secs', 5), + reconnect_max_timeout_secs=_get(kwargs, 'reconnect_max_timeout_secs', 60), + keep_alive_secs=_get(kwargs, 'keep_alive_secs', 1200), + ping_timeout_ms=_get(kwargs, 'ping_timeout_ms', 3000), + protocol_operation_timeout_ms=_get(kwargs, 'protocol_operation_timeout_ms', 0), + will=_get(kwargs, 'will'), username=username, - password=kwargs.get('password'), + password=_get(kwargs, 'password'), socket_options=socket_options, use_websockets=use_websockets, websocket_handshake_transform=websocket_handshake_transform, diff --git a/samples/pubsub.py b/samples/pubsub.py index 655f9a15..9e7a95d4 100644 --- a/samples/pubsub.py +++ b/samples/pubsub.py @@ -18,6 +18,7 @@ parser = argparse.ArgumentParser(description="Send and receive messages through and MQTT connection.") parser.add_argument('--endpoint', required=True, help="Your AWS IoT custom endpoint, not including a port. " + "Ex: \"abcd123456wxyz-ats.iot.us-east-1.amazonaws.com\"") +parser.add_argument('--port', type=int, help="Port to connect to. AWS IoT supports 443 and 8883.") parser.add_argument('--cert', help="File path to your client certificate, in PEM format.") parser.add_argument('--key', help="File path to your private key, in PEM format.") parser.add_argument('--root-ca', help="File path to root certificate authority, in PEM format. " + @@ -111,6 +112,7 @@ def on_message_received(topic, payload, dup, qos, retain, **kwargs): else: mqtt_connection = mqtt_connection_builder.mtls_from_path( endpoint=args.endpoint, + port=args.port, cert_filepath=args.cert, pri_key_filepath=args.key, client_bootstrap=client_bootstrap, From 3f0c41eb889298dd876aaae3c72b79a9b5f54919 Mon Sep 17 00:00:00 2001 From: Michael Graeb Date: Mon, 10 May 2021 17:31:15 -0700 Subject: [PATCH 3/3] Revert "add --port to pubsub sample" This reverts commit 74666fcccecf08f2473058f9a3896eb617243a3c. --- awsiot/mqtt_connection_builder.py | 83 +++++++++++++------------------ samples/pubsub.py | 2 - 2 files changed, 34 insertions(+), 51 deletions(-) diff --git a/awsiot/mqtt_connection_builder.py b/awsiot/mqtt_connection_builder.py index 5c4cc7ce..215faa97 100644 --- a/awsiot/mqtt_connection_builder.py +++ b/awsiot/mqtt_connection_builder.py @@ -106,20 +106,6 @@ def _check_required_kwargs(**kwargs): raise TypeError("Builder needs keyword-only argument '{}'".format(required)) -def _get(kwargs, name, default=None): - """ - Returns kwargs['name'] if it exists and is not None. - Otherwise returns default. - - This function exists so users can pass some_arg=None to get its default - value, instead of literally passing None. - """ - val = kwargs.get(name) - if val is None: - val = default - return val - - _metrics_str = None @@ -146,65 +132,64 @@ def _builder( websocket_proxy_options=None, **kwargs): - ca_bytes = _get(kwargs, 'ca_bytes') - ca_filepath = _get(kwargs, 'ca_filepath') - ca_dirpath = _get(kwargs, 'ca_dirpath') + ca_bytes = kwargs.get('ca_bytes') + ca_filepath = kwargs.get('ca_filepath') + ca_dirpath = kwargs.get('ca_dirpath') if ca_bytes: tls_ctx_options.override_default_trust_store(ca_bytes) elif ca_filepath or ca_dirpath: tls_ctx_options.override_default_trust_store_from_path(ca_dirpath, ca_filepath) if use_websockets: - default_port = 443 + port = 443 if awscrt.io.is_alpn_available(): tls_ctx_options.alpn_list = ['http/1.1'] else: - default_port = 8883 + port = 8883 if awscrt.io.is_alpn_available(): - default_port = 443 + port = 443 tls_ctx_options.alpn_list = ['x-amzn-mqtt-ca'] - port = _get(kwargs, 'port', default_port) + port = kwargs.get('port', port) socket_options = awscrt.io.SocketOptions() - socket_options.connect_timeout_ms = _get(kwargs, 'tcp_connect_timeout_ms', 5000) + socket_options.connect_timeout_ms = kwargs.get('tcp_connect_timeout_ms', 5000) # These have been inconsistent between keepalive/keep_alive. Resolve both for now to ease transition. - socket_options.keep_alive = \ - _get(kwargs, 'tcp_keep_alive', _get(kwargs, 'tcp_keepalive', False)) - - socket_options.keep_alive_timeout_secs = \ - _get(kwargs, 'tcp_keep_alive_timeout_secs', _get(kwargs, 'tcp_keepalive_timeout_secs', 0)) - - socket_options.keep_alive_interval_secs = \ - _get(kwargs, 'tcp_keep_alive_interval_secs', _get(kwargs, 'tcp_keepalive_interval_secs', 0)) - - socket_options.keep_alive_max_probes = \ - _get(kwargs, 'tcp_keep_alive_max_probes', _get(kwargs, 'tcp_keepalive_max_probes', 0)) - - username = _get(kwargs, 'username', '') - if _get(kwargs, 'enable_metrics_collection', True): + socket_options.keep_alive = kwargs.get('tcp_keep_alive', kwargs.get('tcp_keepalive', False)) + socket_options.keep_alive_timeout_secs = kwargs.get( + 'tcp_keep_alive_timeout_secs', kwargs.get( + 'tcp_keepalive_timeout_secs', 0)) + socket_options.keep_alive_interval_secs = kwargs.get( + 'tcp_keep_alive_interval_secs', kwargs.get( + 'tcp_keepalive_interval_secs', 0)) + socket_options.keep_alive_max_probes = kwargs.get( + 'tcp_keep_alive_max_probes', kwargs.get( + 'tcp_keepalive_max_probes', 0)) + + username = kwargs.get('username', '') + if kwargs.get('enable_metrics_collection', True): username += _get_metrics_str() - client_bootstrap = _get(kwargs, 'client_bootstrap') + client_bootstrap = kwargs.get('client_bootstrap') tls_ctx = awscrt.io.ClientTlsContext(tls_ctx_options) mqtt_client = awscrt.mqtt.Client(client_bootstrap, tls_ctx) return awscrt.mqtt.Connection( client=mqtt_client, - on_connection_interrupted=_get(kwargs, 'on_connection_interrupted'), - on_connection_resumed=_get(kwargs, 'on_connection_resumed'), - client_id=_get(kwargs, 'client_id'), - host_name=_get(kwargs, 'endpoint'), + on_connection_interrupted=kwargs.get('on_connection_interrupted'), + on_connection_resumed=kwargs.get('on_connection_resumed'), + client_id=kwargs.get('client_id'), + host_name=kwargs.get('endpoint'), port=port, - clean_session=_get(kwargs, 'clean_session', False), - reconnect_min_timeout_secs=_get(kwargs, 'reconnect_min_timeout_secs', 5), - reconnect_max_timeout_secs=_get(kwargs, 'reconnect_max_timeout_secs', 60), - keep_alive_secs=_get(kwargs, 'keep_alive_secs', 1200), - ping_timeout_ms=_get(kwargs, 'ping_timeout_ms', 3000), - protocol_operation_timeout_ms=_get(kwargs, 'protocol_operation_timeout_ms', 0), - will=_get(kwargs, 'will'), + clean_session=kwargs.get('clean_session', False), + reconnect_min_timeout_secs=kwargs.get('reconnect_min_timeout_secs', 5), + reconnect_max_timeout_secs=kwargs.get('reconnect_max_timeout_secs', 60), + keep_alive_secs=kwargs.get('keep_alive_secs', 1200), + ping_timeout_ms=kwargs.get('ping_timeout_ms', 3000), + protocol_operation_timeout_ms=kwargs.get('protocol_operation_timeout_ms', 0), + will=kwargs.get('will'), username=username, - password=_get(kwargs, 'password'), + password=kwargs.get('password'), socket_options=socket_options, use_websockets=use_websockets, websocket_handshake_transform=websocket_handshake_transform, diff --git a/samples/pubsub.py b/samples/pubsub.py index 9e7a95d4..655f9a15 100644 --- a/samples/pubsub.py +++ b/samples/pubsub.py @@ -18,7 +18,6 @@ parser = argparse.ArgumentParser(description="Send and receive messages through and MQTT connection.") parser.add_argument('--endpoint', required=True, help="Your AWS IoT custom endpoint, not including a port. " + "Ex: \"abcd123456wxyz-ats.iot.us-east-1.amazonaws.com\"") -parser.add_argument('--port', type=int, help="Port to connect to. AWS IoT supports 443 and 8883.") parser.add_argument('--cert', help="File path to your client certificate, in PEM format.") parser.add_argument('--key', help="File path to your private key, in PEM format.") parser.add_argument('--root-ca', help="File path to root certificate authority, in PEM format. " + @@ -112,7 +111,6 @@ def on_message_received(topic, payload, dup, qos, retain, **kwargs): else: mqtt_connection = mqtt_connection_builder.mtls_from_path( endpoint=args.endpoint, - port=args.port, cert_filepath=args.cert, pri_key_filepath=args.key, client_bootstrap=client_bootstrap,