From 82e91c197c94d2bd88162770da902bdbf8c66fb1 Mon Sep 17 00:00:00 2001 From: lhx Date: Mon, 15 Jun 2026 16:27:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E6=9C=BA=E8=BF=9E=E6=8E=A5=E6=A3=80?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shouji/main.py | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/shouji/main.py b/shouji/main.py index 7522a56..0d4103b 100644 --- a/shouji/main.py +++ b/shouji/main.py @@ -306,6 +306,21 @@ class BtSerial: def total_tx(self) -> int: return self._total_bytes_tx + def is_connected(self) -> bool: + """检测手机是否连上 — 用缓存值 + CD 信号, 不阻塞""" + if not self.ser or not self.ser.is_open: + return False + if self._phone_connected: + return True + # 尝试 CD (Carrier Detect) — 蓝牙SPP连接时此信号会拉高 + try: + if self.ser.cd: + self._phone_connected = True + return True + except Exception: + pass + return self._phone_connected + def _read_loop(self): """后台读线程 — 非阻塞轮询""" buf = b"" @@ -321,9 +336,7 @@ class BtSerial: self._total_bytes_rx += len(chunk) self._last_data_time = time.time() - if not self._phone_connected: - self._phone_connected = True - self._log("*** 手机已连接 ***") + self._phone_connected = True # 按已知协议标记对齐数据 while True: @@ -349,7 +362,6 @@ class BtSerial: if self._phone_connected and \ (time.time() - self._last_data_time) > 30: self._phone_connected = False - self._log("*** 手机已断开 ***") time.sleep(0.05) except OSError: @@ -443,9 +455,19 @@ class MobileService: self._poll_thread = None def _poll_loop(self): - """后台轮询 — 处理收数据 + 自动响应握手/控制码""" + """后台轮询 — 处理收数据 + 自动响应握手/控制码 + 连接状态检测""" + prev_phone_connected = False while self.serial and self.serial.running: try: + # ── 连接状态检测 (通过 CD 信号 + 数据接收) ── + conn = self.serial.is_connected() + if conn and not prev_phone_connected: + self._log("*** 手机已连接! ***") + prev_phone_connected = True + elif not conn and prev_phone_connected: + self._log("*** 手机已断开 ***") + prev_phone_connected = False + data = self.serial.read_all() if data: responses, _ = self.proto.feed(data)