手机连接检查

This commit is contained in:
lhx
2026-06-15 16:27:35 +08:00
parent 2ad0488b26
commit 82e91c197c

View File

@@ -306,6 +306,21 @@ class BtSerial:
def total_tx(self) -> int: def total_tx(self) -> int:
return self._total_bytes_tx 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): def _read_loop(self):
"""后台读线程 — 非阻塞轮询""" """后台读线程 — 非阻塞轮询"""
buf = b"" buf = b""
@@ -321,9 +336,7 @@ class BtSerial:
self._total_bytes_rx += len(chunk) self._total_bytes_rx += len(chunk)
self._last_data_time = time.time() self._last_data_time = time.time()
if not self._phone_connected:
self._phone_connected = True self._phone_connected = True
self._log("*** 手机已连接 ***")
# 按已知协议标记对齐数据 # 按已知协议标记对齐数据
while True: while True:
@@ -349,7 +362,6 @@ class BtSerial:
if self._phone_connected and \ if self._phone_connected and \
(time.time() - self._last_data_time) > 30: (time.time() - self._last_data_time) > 30:
self._phone_connected = False self._phone_connected = False
self._log("*** 手机已断开 ***")
time.sleep(0.05) time.sleep(0.05)
except OSError: except OSError:
@@ -443,9 +455,19 @@ class MobileService:
self._poll_thread = None self._poll_thread = None
def _poll_loop(self): def _poll_loop(self):
"""后台轮询 — 处理收数据 + 自动响应握手/控制码""" """后台轮询 — 处理收数据 + 自动响应握手/控制码 + 连接状态检测"""
prev_phone_connected = False
while self.serial and self.serial.running: while self.serial and self.serial.running:
try: 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() data = self.serial.read_all()
if data: if data:
responses, _ = self.proto.feed(data) responses, _ = self.proto.feed(data)