fix: fix mips re-connect error

This commit is contained in:
topsworld 2025-01-10 14:13:00 +08:00
parent 36bf686629
commit 00a8c69f4b
2 changed files with 41 additions and 38 deletions

View File

@ -356,7 +356,7 @@ class MIoTClient:
# Cloud mips # Cloud mips
self._mips_cloud.unsub_mips_state( self._mips_cloud.unsub_mips_state(
key=f'{self._uid}-{self._cloud_server}') key=f'{self._uid}-{self._cloud_server}')
self._mips_cloud.disconnect() self._mips_cloud.deinit()
# Cancel refresh cloud devices # Cancel refresh cloud devices
if self._refresh_cloud_devices_timer: if self._refresh_cloud_devices_timer:
self._refresh_cloud_devices_timer.cancel() self._refresh_cloud_devices_timer.cancel()
@ -369,7 +369,7 @@ class MIoTClient:
for mips in self._mips_local.values(): for mips in self._mips_local.values():
mips.on_dev_list_changed = None mips.on_dev_list_changed = None
mips.unsub_mips_state(key=mips.group_id) mips.unsub_mips_state(key=mips.group_id)
mips.disconnect() mips.deinit()
if self._mips_local_state_changed_timers: if self._mips_local_state_changed_timers:
for timer_item in ( for timer_item in (
self._mips_local_state_changed_timers.values()): self._mips_local_state_changed_timers.values()):

View File

@ -229,6 +229,7 @@ class _MipsClient(ABC):
_ca_file: Optional[str] _ca_file: Optional[str]
_cert_file: Optional[str] _cert_file: Optional[str]
_key_file: Optional[str] _key_file: Optional[str]
_tls_done: bool
_mqtt_logger: Optional[logging.Logger] _mqtt_logger: Optional[logging.Logger]
_mqtt: Client _mqtt: Client
@ -271,6 +272,7 @@ class _MipsClient(ABC):
self._ca_file = ca_file self._ca_file = ca_file
self._cert_file = cert_file self._cert_file = cert_file
self._key_file = key_file self._key_file = key_file
self._tls_done = False
self._mqtt_logger = None self._mqtt_logger = None
self._mqtt_fd = -1 self._mqtt_fd = -1
@ -328,19 +330,36 @@ class _MipsClient(ABC):
self._client_id if thread_name is None else thread_name) self._client_id if thread_name is None else thread_name)
self._mips_thread.start() self._mips_thread.start()
@final async def connect_async(self) -> None:
def close(self) -> None: """mips connect async."""
self._internal_loop.call_soon_threadsafe(self.__mips_close) self.connect()
if self._mips_thread: await self._event_connect.wait()
self._mips_thread.join()
def disconnect(self) -> None:
"""mips disconnect."""
if not self._mips_thread:
return
self._internal_loop.call_soon_threadsafe(self.__mips_disconnect)
self._mips_thread.join()
self._mips_thread = None
self._internal_loop.close() self._internal_loop.close()
async def disconnect_async(self) -> None:
"""mips disconnect async."""
self.disconnect()
await self._event_disconnect.wait()
@final
def deinit(self) -> None:
self.disconnect()
self._logger = None self._logger = None
self._username = None self._username = None
self._password = None self._password = None
self._ca_file = None self._ca_file = None
self._cert_file = None self._cert_file = None
self._key_file = None self._key_file = None
self._tls_done = False
self._mqtt_logger = None self._mqtt_logger = None
with self._mips_state_sub_map_lock: with self._mips_state_sub_map_lock:
self._mips_state_sub_map.clear() self._mips_state_sub_map.clear()
@ -375,20 +394,6 @@ class _MipsClient(ABC):
else: else:
self._mqtt.disable_logger() self._mqtt.disable_logger()
async def connect_async(self) -> None:
"""mips connect async."""
self.connect()
await self._event_connect.wait()
def disconnect(self) -> None:
"""mips disconnect."""
self._internal_loop.call_soon_threadsafe(self.__mips_disconnect)
async def disconnect_async(self) -> None:
"""mips disconnect async."""
self.disconnect()
await self._event_disconnect.wait()
@final @final
def sub_mips_state( def sub_mips_state(
self, key: str, handler: Callable[[str, bool], Coroutine] self, key: str, handler: Callable[[str, bool], Coroutine]
@ -586,19 +591,21 @@ class _MipsClient(ABC):
if self._username: if self._username:
self._mqtt.username_pw_set( self._mqtt.username_pw_set(
username=self._username, password=self._password) username=self._username, password=self._password)
if ( if not self._tls_done:
self._ca_file if (
and self._cert_file self._ca_file
and self._key_file and self._cert_file
): and self._key_file
self._mqtt.tls_set( ):
tls_version=ssl.PROTOCOL_TLS_CLIENT, self._mqtt.tls_set(
ca_certs=self._ca_file, tls_version=ssl.PROTOCOL_TLS_CLIENT,
certfile=self._cert_file, ca_certs=self._ca_file,
keyfile=self._key_file) certfile=self._cert_file,
else: keyfile=self._key_file)
self._mqtt.tls_set(tls_version=ssl.PROTOCOL_TLS_CLIENT) else:
self._mqtt.tls_insecure_set(True) self._mqtt.tls_set(tls_version=ssl.PROTOCOL_TLS_CLIENT)
self._mqtt.tls_insecure_set(True)
self._tls_done = True
self._mqtt.on_connect = self.__on_connect self._mqtt.on_connect = self.__on_connect
self._mqtt.on_connect_fail = self.__on_connect_failed self._mqtt.on_connect_fail = self.__on_connect_failed
self._mqtt.on_disconnect = self.__on_disconnect self._mqtt.on_disconnect = self.__on_disconnect
@ -776,10 +783,6 @@ class _MipsClient(ABC):
self._internal_loop.remove_writer(self._mqtt_fd) self._internal_loop.remove_writer(self._mqtt_fd)
self._mqtt_fd = -1 self._mqtt_fd = -1
self._mqtt.disconnect() self._mqtt.disconnect()
def __mips_close(self) -> None:
self.log_info('mips client closing')
self.__mips_disconnect()
self._internal_loop.stop() self._internal_loop.stop()
def __get_next_reconnect_time(self) -> float: def __get_next_reconnect_time(self) -> float: