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

View File

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