I have multiple devices on Azure IOT hub, which I am trying to connect, send telemetry message and disconnect. This process is happening in multithread operation i.e., each device's operation is taking place in single thread. After connecting to device, I am getting
Exception caught in background thread. Unable to handle.
['azure.iot.device.common.transport_exceptions.ConnectionDroppedError: Unexpected disconnection\n']until I call client.disconnect()
Even though the device shows connected on the IOT Explorer.How to avoid this error?
Logs:
INFO:azure.iot.device.common.mqtt_transport:disconnected with result code: 7DEBUG:azure.iot.device.common.mqtt_transport: File "C:\Users\mpatle\AppData\Local\Programs\Python\Python39\lib\threading.py", line 930, in _bootstrap self._bootstrap_inner() File "C:\Users\mpatle\AppData\Local\Programs\Python\Python39\lib\threading.py", line 973, in _bootstrap_inner self.run() File "C:\Users\mpatle\AppData\Local\Programs\Python\Python39\lib\threading.py", line 910, in run self._target(*self._args, **self._kwargs) File "C:\Users\mpatle\source\repos\GetliveSvanNt\env\lib\site-packages\paho\mqtt\client.py", line 3591, in _thread_main self.loop_forever(retry_first_connection=True) File "C:\Users\mpatle\source\repos\GetliveSvanNt\env\lib\site-packages\paho\mqtt\client.py", line 1756, in loop_forever rc = self._loop(timeout) File "C:\Users\mpatle\source\repos\GetliveSvanNt\env\lib\site-packages\paho\mqtt\client.py", line 1164, in _loop rc = self.loop_read() File "C:\Users\mpatle\source\repos\GetliveSvanNt\env\lib\site-packages\paho\mqtt\client.py", line 1558, in loop_read return self._loop_rc_handle(rc) File "C:\Users\mpatle\source\repos\GetliveSvanNt\env\lib\site-packages\paho\mqtt\client.py", line 2350, in _loop_rc_handle self._do_on_disconnect(rc, properties) File "C:\Users\mpatle\source\repos\GetliveSvanNt\env\lib\site-packages\paho\mqtt\client.py", line 3475, in _do_on_disconnect on_disconnect(self, self._userdata, rc) File "C:\Users\mpatle\source\repos\GetliveSvanNt\env\lib\site-packages\azure\iot\device\common\mqtt_transport.py", line 209, in on_disconnect logger.debug("".join(traceback.format_stack()))INFO:azure.iot.device.common.mqtt_transport:Forcing paho disconnect to prevent it from automatically reconnectingDEBUG:azure.iot.device.common.mqtt_transport:in paho thread. nulling _threadDEBUG:azure.iot.device.common.mqtt_transport:Done forcing paho disconnectDEBUG:azure.iot.device.common.mqtt_transport:Failing all subscribes and unsubscribes outstandingDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting _on_mqtt_disconnected in pipeline threadINFO:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage: _on_mqtt_disconnect called: The connection was lost.DEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage(DisconnectedEvent): State changes CONNECTED -> DISCONNECTED. Attempting to reconnectDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:PipelineRootStage: DisconnectedEvent received. Calling on_disconnected_handlerDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting _on_disconnected in callback threadINFO:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage: Unexpected disconnect (no pending connection op)INFO:azure.iot.device.iothub.abstract_clients:Connection State - DisconnectedDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:PipelineRootStage: BackgroundExceptionEvent received. Calling on_background_exception_handlerINFO:azure.iot.device.iothub.abstract_clients:Cleared all pending method requests due to disconnectDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting _on_background_exception in callback threadWARNING:azure.iot.device.common.handle_exceptions:Exception caught in background thread. Unable to handle.WARNING:azure.iot.device.common.handle_exceptions:['azure.iot.device.common.transport_exceptions.ConnectionDroppedError: Unexpected disconnection\n']DEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting on_reconnect_timer_expired in pipeline threadDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage: Reconnect timer expired. State is ConnectionState.DISCONNECTED.DEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage: Starting reconnectionDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage: State changes ConnectionState.DISCONNECTED -> CONNECTING. Sending new connect op down in reconnect attemptDEBUG:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage(ConnectOperation): connectingDEBUG:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage(ConnectOperation): Starting watchdogDEBUG:azure.iot.device.common.mqtt_transport:connecting to mqtt brokerINFO:azure.iot.device.common.mqtt_transport:Connect using port 8883 (TCP)DEBUG:paho:Sending CONNECT (u1, p1, wr0, wq0, wf0, c0, k60) client_id=b'SvanNet92810'DEBUG:azure.iot.device.common.mqtt_transport:_mqtt_client.connect returned rc=0DEBUG:paho:Received CONNACK (1, 0)INFO:azure.iot.device.common.mqtt_transport:connected with result code: 0DEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting _on_mqtt_connected in pipeline threadDEBUG:paho:Sending PUBLISH (d1, q1, r0, m1), 'b'devices/SvanNet92810/messages/events/'', ... (25981 bytes)INFO:azure.iot.device.common.pipeline.pipeline_stages_mqtt:_on_mqtt_connected calledDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage(ConnectedEvent): State changes CONNECTING -> CONNECTED. Connection establishedDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:PipelineRootStage: ConnectedEvent received. Calling on_connected_handlerDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting _on_connected in callback threadDEBUG:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage: completing connect opINFO:azure.iot.device.iothub.abstract_clients:Connection State - ConnectedDEBUG:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage(ConnectOperation): cancelling watchdogDEBUG:azure.iot.device.common.pipeline.pipeline_ops_base:ConnectOperation: completing without errorDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage(ConnectOperation): on_connect_complete error=None state=ConnectionState.CONNECTEDDEBUG:paho:Received PUBACK (Mid: 1)INFO:azure.iot.device.common.mqtt_transport:payload published for 1DEBUG:azure.iot.device.common.mqtt_transport:Response received for recognized MID: 1 - triggering callbackDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting on_complete in pipeline threadDEBUG:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage(MQTTPublishOperation): PUBACK received. completing op.DEBUG:azure.iot.device.common.pipeline.pipeline_ops_base:MQTTPublishOperation: completing without errorDEBUG:azure.iot.device.common.pipeline.pipeline_ops_base:SendD2CMessageOperation: Worker op (MQTTPublishOperation) has been completedDEBUG:azure.iot.device.common.pipeline.pipeline_ops_base:SendD2CMessageOperation: completing without errorDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting on_complete in callback threadDEBUG:azure.iot.device.common.evented_callback:Callback completed with result NoneINFO:azure.iot.device.iothub.sync_clients:Successfully sent message to HubINFO:azure.iot.device.iothub.sync_clients:Disconnecting from Hub...DEBUG:azure.iot.device.iothub.sync_clients:Executing initial disconnectDEBUG:azure.iot.device.iothub.pipeline.mqtt_pipeline:Starting DisconnectOperation on the pipelineDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting run_op in pipeline threadDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage(DisconnectOperation): State changes CONNECTED -> DISCONNECTING. Sending op down.DEBUG:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage(DisconnectOperation): disconnectingINFO:azure.iot.device.common.mqtt_transport:disconnecting MQTT clientDEBUG:paho:Sending DISCONNECTINFO:azure.iot.device.common.mqtt_transport:disconnected with result code: 0DEBUG:azure.iot.device.common.mqtt_transport:Failing all subscribes and unsubscribes outstandingDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting _on_mqtt_disconnected in pipeline threadDEBUG:azure.iot.device.common.mqtt_transport:_mqtt_client.disconnect returned rc=0DEBUG:azure.iot.device.common.mqtt_transport:Cancelling all pending operationsINFO:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage: _on_mqtt_disconnect calledDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage(DisconnectedEvent): State changes DISCONNECTING -> DISCONNECTED. Not attempting to reconnect (User-initiated disconnect)DEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:PipelineRootStage: DisconnectedEvent received. Calling on_disconnected_handlerDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting _on_disconnected in callback threadDEBUG:azure.iot.device.common.pipeline.pipeline_stages_mqtt:MQTTTransportStage: Expected disconnect - completing pending disconnect opINFO:azure.iot.device.iothub.abstract_clients:Connection State - DisconnectedDEBUG:azure.iot.device.common.pipeline.pipeline_ops_base:DisconnectOperation: completing without errorINFO:azure.iot.device.iothub.abstract_clients:Cleared all pending method requests due to disconnectDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting on_complete in callback threadDEBUG:azure.iot.device.common.evented_callback:Callback completed with result NoneDEBUG:azure.iot.device.iothub.sync_clients:Successfully executed initial disconnectDEBUG:azure.iot.device.iothub.sync_clients:Stopping handlers...DEBUG:azure.iot.device.iothub.sync_clients:Successfully stopped handlersDEBUG:azure.iot.device.iothub.sync_clients:Executing secondary disconnect...DEBUG:azure.iot.device.iothub.pipeline.mqtt_pipeline:Starting DisconnectOperation on the pipelineDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting run_op in pipeline threadDEBUG:azure.iot.device.common.pipeline.pipeline_stages_base:ConnectionStateStage(DisconnectOperation): State is already DISCONNECTED. Completing operationDEBUG:azure.iot.device.common.pipeline.pipeline_ops_base:DisconnectOperation: completing without errorDEBUG:azure.iot.device.common.pipeline.pipeline_thread:Starting on_complete in callback threadDEBUG:azure.iot.device.common.evented_callback:Callback completed with result NoneDEBUG:azure.iot.device.iothub.sync_clients:Successfully executed secondary disconnectINFO:azure.iot.device.iothub.sync_clients:Successfully disconnected from HubMessage sent to IoT HubI have tried immediately connecting and disconnecting the the device after sending telemetry message to the device, still getting same exception.
Code-
try: if not hasattr(self, '_device_client') or not self._device_client: self._device_client = IoTHubDeviceClient.create_from_connection_string(connection_string) if not self._device_client.connected: self._device_client.connect() self._device_client.send_message(message) print("Message sent to IoT Hub") except Exception as e: print(f"An unexpected error occurred: {e}") finally: try: if self._device_client and self._device_client.connected: self._device_client.disconnect() except Exception as disconnect_error: print(f"Error while disconnecting from IoT Hub: {disconnect_error}")I am getting errors immediately after the connect() is called-
if status == False: try: asyncio.run(device_instance.DPS_Device(device_key)) #client.connect() Azure_instance.send_message(connection_string,message_payload) time.sleep(5) #client.connect() #client.shutdown() #if status == False: device_instance.update_devicetwin(device_id,device_name, connection_string) except Exception as e: print(f"An error occurred: {e}")