120 lines
3.7 KiB
Python
120 lines
3.7 KiB
Python
import socket
|
|
import time
|
|
from machine import reset, Pin, Timer # 添加 Timer
|
|
import _thread
|
|
import gc
|
|
import network
|
|
|
|
import system
|
|
import shared_vars
|
|
from ConfigManager import ConfigManager
|
|
|
|
gc.enable()
|
|
|
|
# 初始化配置管理器
|
|
config_manager = ConfigManager()
|
|
|
|
# 看门狗变量
|
|
watchdog_last_reset = time.time()
|
|
|
|
def reset_watchdog():
|
|
"""重置看门狗计时"""
|
|
global watchdog_last_reset
|
|
watchdog_last_reset = time.time()
|
|
|
|
def watchdog_thread():
|
|
"""看门狗线程,超过 1 分钟未重置则重启设备"""
|
|
global watchdog_last_reset
|
|
while True:
|
|
if time.time() - watchdog_last_reset > 60: # 超过 1 分钟
|
|
print("看门狗超时,设备即将重启...")
|
|
reset()
|
|
time.sleep(1)
|
|
|
|
# 启动看门狗线程
|
|
_thread.start_new_thread(watchdog_thread, ())
|
|
|
|
def connect_to_stored_wifi():
|
|
"""
|
|
尝试连接存储的 WiFi 列表,如果全部失败,则连接默认 WiFi
|
|
"""
|
|
# 获取存储的 WiFi 列表
|
|
wifi_list = config_manager.get("wifi.list", [])
|
|
print("尝试连接存储的 WiFi 列表:", wifi_list)
|
|
|
|
wlan = None
|
|
for wifi in wifi_list:
|
|
ssid = wifi.get("ssid")
|
|
password = wifi.get("password")
|
|
if not ssid or password is None: # 只检查 SSID 是否有效
|
|
continue
|
|
|
|
print(f"尝试连接 WiFi: {ssid}")
|
|
try:
|
|
wlan = network.WLAN(network.STA_IF)
|
|
wlan.active(False)
|
|
wlan.active(True)
|
|
wlan.connect(ssid, password)
|
|
|
|
# 设置超时时间为 10 秒
|
|
start_time = time.time()
|
|
while not wlan.isconnected():
|
|
if time.time() - start_time > 10: # 超时 10 秒
|
|
print(f"连接 WiFi {ssid} 超时,尝试下一个")
|
|
break
|
|
time.sleep(1)
|
|
|
|
if wlan.isconnected():
|
|
print(f"成功连接到 WiFi: {ssid}")
|
|
|
|
# 将成功连接的 WiFi 移到列表最前面
|
|
wifi_list.remove(wifi)
|
|
wifi_list.insert(0, wifi)
|
|
config_manager.set("wifi.list", wifi_list)
|
|
reset_watchdog() # 重置看门狗
|
|
return wlan
|
|
except Exception as e:
|
|
print(f"连接 WiFi {ssid} 失败: {e}")
|
|
wlan.active(False)
|
|
# 如果所有存储的 WiFi 都连接失败,则连接默认 WiFi
|
|
print("所有存储的 WiFi 都连接失败,尝试连接默认 WiFi")
|
|
wlan = system.connect_wifi(shared_vars.WIFI_SSID, shared_vars.WIFI_PASSWORD)
|
|
reset_watchdog() # 重置看门狗
|
|
return wlan
|
|
|
|
# 启动接收数据的线程
|
|
_thread.start_new_thread(system.websocket_receive_thread, ())
|
|
|
|
def ws_client():
|
|
try:
|
|
# 尝试连接 WiFi
|
|
sta_if = connect_to_stored_wifi()
|
|
print(f"连接到 WebSocket 服务器 {shared_vars.WS_HOST}:{shared_vars.WS_PORT}...")
|
|
shared_vars.WS_SOCK = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
shared_vars.WS_SOCK.connect((shared_vars.WS_HOST, shared_vars.WS_PORT))
|
|
print("连接成功")
|
|
# 进行 WebSocket 握手
|
|
system.websocket_handshake()
|
|
while True:
|
|
time.sleep(30)
|
|
system.send_text(shared_vars.WS_SOCK, '{"action":"sys.ping"}')
|
|
reset_watchdog() # 重置看门狗
|
|
|
|
except OSError as e:
|
|
print(f"连接异常: {str(e)}")
|
|
if 'sta_if' in locals():
|
|
sta_if.active(False)
|
|
time.sleep(5)
|
|
reset()
|
|
except Exception as e:
|
|
print(f"发生错误:", e)
|
|
shared_vars.WS_SOCK.close()
|
|
time.sleep(5)
|
|
reset()
|
|
|
|
if __name__ == "__main__":
|
|
# 运行主函数
|
|
ws_client()
|
|
else:
|
|
# 作为模块导入时的处理逻辑
|
|
pass |