diff --git a/at_client.py b/at_client.py index 40f967a..5bb003d 100644 --- a/at_client.py +++ b/at_client.py @@ -76,10 +76,11 @@ class ATClient: """ expect_b = expect.encode() if isinstance(expect, str) else expect with self._cmd_lock: - # 初始化等待 - self._waiting = True - self._expect = expect_b - self._resp = b"" + with self._q_lock: + # 初始化等待 + self._waiting = True + self._expect = expect_b + self._resp = b"" # 发送 if cmd: @@ -300,8 +301,8 @@ class ATClient: if len(self._rx) > 512 * 1024: self._rx = self._rx[-256 * 1024:] else: - if len(self._rx) > 16384: - self._rx = self._rx[-4096:] + if len(self._rx) > 32768: + self._rx = self._rx[-16384:] diff --git a/network.py b/network.py index f18a763..e5beefb 100644 --- a/network.py +++ b/network.py @@ -721,7 +721,7 @@ class NetworkManager: if self._network_type == "wifi": return self._check_wifi_connection() elif self._network_type == "4g": - return True # 4G连接状态由AT命令维护 + return self._check_4g_connection() return False # 自动选择网络 @@ -738,6 +738,37 @@ class NetworkManager: return self._connect_tcp_via_4g() return False + def _check_4g_connection(self): + """检查4G TCP连接是否仍然有效(通过查询PDP地址验证网络附着状态)""" + try: + atc = hardware_manager.at_client + if atc is None: + return False + if not self._uart4g_lock.acquire(timeout=3000): + # 获取锁超时说明有其他操作在进行,视为连接仍有效 + return True + try: + r = atc.send("AT+CGPADDR=1", "OK", 3000) + m = re.search(r'\+CGPADDR:\s*1,"([^"]+)"', r) + ip = m.group(1) if m else "" + if ip and ip != "0.0.0.0": + return True + # 无IP或IP无效,尝试重新激活PDP + self.logger.warning("[4G-TCP] PDP地址无效,尝试重新激活") + atc.send("AT+MIPCALL=1,1", "OK", 15000) + r2 = atc.send("AT+CGPADDR=1", "OK", 3000) + m2 = re.search(r'\+CGPADDR:\s*1,"([^"]+)"', r2) + ip2 = m2.group(1) if m2 else "" + if ip2 and ip2 != "0.0.0.0": + return True + self.logger.error("[4G-TCP] 重新激活PDP仍无有效IP,连接已断开") + return False + finally: + self._uart4g_lock.release() + except Exception as e: + self.logger.warning(f"[4G-TCP] 连接检查异常: {e}") + return True # 异常时不误判断线 + def _wrap_wifi_tls(self, plain_sock, hostname): """ 在已建立的 TCP socket 上做 TLS(WiFi 走主机 ssl 库;4G 仍用模组 AT+SSL)。 @@ -1085,6 +1116,8 @@ class NetworkManager: total += n hardware_manager.uart4g.write(b"\x1A") + with hardware_manager.at_client._q_lock: + hardware_manager.at_client._rx = b"" r = hardware_manager.at_client.send("", "OK", 8000) if ("SEND OK" in r) or ("OK" in r) or ("+MIPSEND" in r): return True