手机连接检查
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user