def main(self, args): # logging.debug("Spinning up Shadow awsiot resources") event_loop_group = io.EventLoopGroup(1) host_resolver = io.DefaultHostResolver(event_loop_group) client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver) # logging.debug("Shadow resources up") if args.use_websocket == True: proxy_options = None if (args.proxy_host): proxy_options = http.HttpProxyOptions( host_name=args.proxy_host, port=args.proxy_port) credentials_provider = auth.AwsCredentialsProvider.new_default_chain( client_bootstrap) self.mqtt_connection = mqtt_connection_builder.websockets_with_default_aws_signing( endpoint=args.endpoint, client_bootstrap=client_bootstrap, region=args.signing_region, credentials_provider=credentials_provider, websocket_proxy_options=proxy_options, ca_filepath=args.root_ca, client_id=args.client_id, clean_session=False, keep_alive_secs=6) else: # attrs = vars(args) # print(', '.join("%s: %s" % item for item in list(attrs.items()))) self.mqtt_connection = mqtt_connection_builder.mtls_from_path( endpoint=args.endpoint, cert_filepath=args.cert, pri_key_filepath=args.key, client_bootstrap=client_bootstrap, ca_filepath=args.root_ca, client_id=args.client_id, clean_session=False, keep_alive_secs=6) print("Connecting to {} with client ID '{}'...".format( args.endpoint, args.client_id)) logging.debug("Connecting to {} with client ID '{}'...".format( args.endpoint, args.client_id)) connected_future = self.mqtt_connection.connect() self.shadow_client = iotshadow.IotShadowClient(self.mqtt_connection) # Wait for connection to be fully established. # Note that it's not necessary to wait, commands issued to the # mqtt_connection before its fully connected will simply be queued. # But this sample waits here so it's obvious when a connection # fails or succeeds. connected_future.result() print("Connected!") logging.debug("Connected!") try: # Subscribe to necessary topics. # Note that is **is** important to wait for "accepted/rejected" subscriptions # to succeed before publishing the corresponding "request". # print("Subscribing to Delta events...") delta_subscribed_future, _ = self.shadow_client.subscribe_to_shadow_delta_updated_events( request=iotshadow.ShadowDeltaUpdatedSubscriptionRequest( args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=self.on_shadow_delta_updated) # Wait for subscription to succeed delta_subscribed_future.result() # print("Subscribing to Update responses...") update_accepted_subscribed_future, _ = self.shadow_client.subscribe_to_update_shadow_accepted( request=iotshadow.UpdateShadowSubscriptionRequest( args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=self.on_update_shadow_accepted) update_rejected_subscribed_future, _ = self.shadow_client.subscribe_to_update_shadow_rejected( request=iotshadow.UpdateShadowSubscriptionRequest( args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=self.on_update_shadow_rejected) # Wait for subscriptions to succeed update_accepted_subscribed_future.result() update_rejected_subscribed_future.result() # print("Subscribing to Get responses...") get_accepted_subscribed_future, _ = self.shadow_client.subscribe_to_get_shadow_accepted( request=iotshadow.GetShadowSubscriptionRequest( args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=self.on_get_shadow_accepted) get_rejected_subscribed_future, _ = self.shadow_client.subscribe_to_get_shadow_rejected( request=iotshadow.GetShadowSubscriptionRequest( args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=self.on_get_shadow_rejected) # Wait for subscriptions to succeed get_accepted_subscribed_future.result() get_rejected_subscribed_future.result() # The rest of the sample runs asyncronously. # Issue request for shadow's current state. # The response will be received by the on_get_accepted() callback # print("Requesting current shadow state...") publish_get_future = self.shadow_client.publish_get_shadow( request=iotshadow.GetShadowRequest(args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE) # Ensure that publish succeeds publish_get_future.result() # Launch thread to handle user input. # A "daemon" thread won't prevent the program from shutting down. # print("Launching thread to read user input...") # user_input_thread = threading.Thread(target=user_input_thread_fn, name='user_input_thread') # user_input_thread.daemon = True # user_input_thread.start() # Launch thread to send telemetry updates to shadow self.telemetry_thread = threading.Thread( target=self.get_robot_telemetry, name='Robot Telemetry Thread', args=(args.robot_url, args.robot_ca)) # self.telemetry_thread.daemon = True self.telemetry_thread.start() except Exception as e: self.exit(e) # Wait for the sample to finish (user types 'quit', or an error occurs) self.is_sample_done.wait()
def device_main(): """ main loop for dummy device """ global device_name, mqtt_connection, shadow_client sensor = SenseHat() init_info = arg_check() device_name = init_info['device_name'] iot_endpoint = init_info['endpoint'] rootca_file = init_info['certs'][0] private_key_file = init_info['certs'][1] certificate_file = init_info['certs'][2] logger.info("device_name: %s", device_name) logger.info("endpoint: %s", iot_endpoint) logger.info("rootca cert: %s", rootca_file) logger.info("private key: %s", private_key_file) logger.info("certificate: %s", certificate_file) # Spin up resources event_loop_group = io.EventLoopGroup(1) host_resolver = io.DefaultHostResolver(event_loop_group) client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver) mqtt_connection = mqtt_connection_builder.mtls_from_path( endpoint=iot_endpoint, cert_filepath=certificate_file, pri_key_filepath=private_key_file, client_bootstrap=client_bootstrap, ca_filepath=rootca_file, client_id=device_name, clean_session=False, keep_alive_secs=KEEP_ALIVE) connected_future = mqtt_connection.connect() shadow_client = iotshadow.IotShadowClient(mqtt_connection) connected_future.result() print("Check latest Shadow status") get_accepted_subscribed_future, _ = shadow_client.subscribe_to_get_shadow_accepted( request=iotshadow.GetShadowSubscriptionRequest(device_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_get_shadow_accepted) get_rejected_subscribed_future, _ = shadow_client.subscribe_to_get_shadow_rejected( request=iotshadow.GetShadowSubscriptionRequest(device_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_get_shadow_rejected) # Wait for subscriptions to succeed get_accepted_subscribed_future.result() get_rejected_subscribed_future.result() publish_get_future = shadow_client.publish_get_shadow( request=iotshadow.GetShadowRequest(device_name), qos=mqtt.QoS.AT_LEAST_ONCE) # Ensure that publish succeeds publish_get_future.result() logger.info("Subscribing to Shadow Delta events...") delta_subscribed_future, _ = shadow_client.subscribe_to_shadow_delta_updated_events( request=iotshadow.ShadowDeltaUpdatedSubscriptionRequest(device_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_shadow_delta_updated) # Wait for subscription to succeed delta_subscribed_future.result() logger.info("Subscribing to Shadow Update responses...") update_accepted_subscribed_future, _ = shadow_client.subscribe_to_update_shadow_accepted( request=iotshadow.UpdateShadowSubscriptionRequest(device_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_update_shadow_accepted) update_rejected_subscribed_future, _ = shadow_client.subscribe_to_update_shadow_rejected( request=iotshadow.UpdateShadowSubscriptionRequest(device_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_update_shadow_rejected) # Wait for subscriptions to succeed update_accepted_subscribed_future.result() update_rejected_subscribed_future.result() # Start sending dummy data topic = BASE_TOPIC + device_name logging.info("topic: %s", topic) while True: now = datetime.now().strftime('%Y-%m-%dT%H:%M:%S') humi = sensor.temperature temp = sensor.humidity payload = { "DEVICE_NAME": device_name, "TIMESTAMP": now, "TEMPERATURE": int(temp), "HUMIDITY": int(humi) } logger.debug(" payload: %s", payload) mqtt_connection.publish(topic=topic, payload=json.dumps(payload), qos=mqtt.QoS.AT_LEAST_ONCE) time.sleep(wait_time)
get_rejected_subscribed_future, _ = shadow_client.subscribe_to_get_shadow_rejected( request=iotshadow.GetShadowSubscriptionRequest(thing_name=args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_get_shadow_rejected) # Wait for subscriptions to succeed get_accepted_subscribed_future.result() get_rejected_subscribed_future.result() # The rest of the sample runs asyncronously. # Issue request for shadow's current state. # The response will be received by the on_get_accepted() callback print("Requesting current shadow state...") publish_get_future = shadow_client.publish_get_shadow( request=iotshadow.GetShadowRequest(thing_name=args.thing_name), qos=mqtt.QoS.AT_LEAST_ONCE) # Ensure that publish succeeds publish_get_future.result() # Launch thread to handle user input. # A "daemon" thread won't prevent the program from shutting down. print("Launching thread to read user input...") user_input_thread = threading.Thread(target=user_input_thread_fn, name='user_input_thread') user_input_thread.daemon = True user_input_thread.start() except Exception as e: exit(e)
callback=on_shadow_delta_updated) # Wait for subscription to succeed delta_subscribed_future.result() # Issue request for shadow's current state. # The response will be received by the on_get_accepted() callback pStdErr("Requesting current {} shadow state...".format(thing_name)) with locked_data.lock: # use a unique token so we can correlate this "request" message to # any "response" messages received on the /accepted and /rejected topics token = str(uuid4()) publish_get_future = shadow_client.publish_get_shadow( request=iotshadow.GetShadowRequest(thing_name=thing_name, client_token=token), qos=mqtt.QoS.AT_LEAST_ONCE) locked_data.request_tokens.add(token) # Ensure that publish succeeds publish_get_future.result() #start our monitor loops print("Launching thread to flowmeter input...") flowmeter_input_thread = threading.Thread( target=flowmeter_input_thread_fn, name='flowmeter_input_thread') flowmeter_input_thread.daemon = True flowmeter_input_thread.start() except Exception as e: