remove rtt from wifi monitoring
This commit is contained in:
17
config.py
17
config.py
@@ -17,6 +17,13 @@ SERVER_IP = "www.shelingxingqiu.com"
|
|||||||
SERVER_PORT = 50005
|
SERVER_PORT = 50005
|
||||||
HEARTBEAT_INTERVAL = 15 # 心跳间隔(秒)
|
HEARTBEAT_INTERVAL = 15 # 心跳间隔(秒)
|
||||||
|
|
||||||
|
# WiFi 质量评估(开机先尝试 WiFi;质量差且 4G 可用则切到 4G,本次上电直至关机锁定 4G)
|
||||||
|
WIFI_QUALITY_RTT_SAMPLES = 3 # 到业务服务器 TCP 建连耗时采样次数,取中位数
|
||||||
|
WIFI_QUALITY_RTT_BAD_MS = 600.0 # 中位数超过此值认为延迟过高
|
||||||
|
WIFI_QUALITY_RTT_WARN_MS = 350.0 # 与 RSSI 联合:超过此值且信号弱也判为差
|
||||||
|
WIFI_QUALITY_RSSI_BAD_DBM = -80.0 # 低于此 dBm(更负更差)视为信号弱
|
||||||
|
WIFI_QUALITY_USE_RSSI = True # 是否把 RSSI 纳入综合判定(False 则仅看 RTT)
|
||||||
|
|
||||||
# ===== TCP over SSL(TLS) 配置 =====
|
# ===== TCP over SSL(TLS) 配置 =====
|
||||||
USE_TCP_SSL = False # True=按手册走 MSSLCFG/MIPCFG 绑定 SSL
|
USE_TCP_SSL = False # True=按手册走 MSSLCFG/MIPCFG 绑定 SSL
|
||||||
TCP_LINK_ID = 2 #
|
TCP_LINK_ID = 2 #
|
||||||
@@ -24,11 +31,11 @@ TCP_SSL_PORT = 443 # TLS 端口(不一定必须 443,以服务器为
|
|||||||
|
|
||||||
# SSL profile
|
# SSL profile
|
||||||
SSL_ID = 1 # ssl_id=1
|
SSL_ID = 1 # ssl_id=1
|
||||||
SSL_AUTH_MODE = 1 # 1=单向认证(验证服务器),2=双向
|
SSL_AUTH_MODE = 0 # 1=单向认证(验证服务器),2=双向
|
||||||
SSL_VERIFY_MODE = 1 # 1=写入并使用 CA 证书;0=不验(仅测试加密,风险大)
|
SSL_VERIFY_MODE = 1 # 0=不验(仅测试用);1=写入并使用 CA 证书
|
||||||
|
|
||||||
SSL_CERT_FILENAME = "test.cer" # 模组里证书名(MSSLCERTWR / MSSLCFG="cert" 用)
|
SSL_CERT_FILENAME = "www.shelingxingqiu.com.crt" # 模组里证书名(MSSLCERTWR / MSSLCFG="cert" 用)
|
||||||
SSL_CERT_PATH = "/root/test.cer" # 设备文件系统里 CA 证书路径(你自己放进去)
|
SSL_CERT_PATH = "/root/www.shelingxingqiu.com.crt" # 设备文件系统里 CA 证书路径(你自己放进去)
|
||||||
# MIPOPEN 末尾的参数在不同固件里含义可能不同;按你手册例子保留
|
# MIPOPEN 末尾的参数在不同固件里含义可能不同;按你手册例子保留
|
||||||
MIPOPEN_TAIL = ",,0"
|
MIPOPEN_TAIL = ",,0"
|
||||||
|
|
||||||
@@ -117,7 +124,7 @@ SAVE_IMAGE_ENABLED = True # 是否保存图像(True=保存,False=不保存
|
|||||||
PHOTO_DIR = "/root/phot" # 照片存储目录
|
PHOTO_DIR = "/root/phot" # 照片存储目录
|
||||||
MAX_IMAGES = 1000
|
MAX_IMAGES = 1000
|
||||||
|
|
||||||
SHOW_CAMERA_PHOTO_WHILE_SHOOTING = False # 是否在拍摄时显示摄像头图像(True=显示,False=不显示),建议在连着USB测试过程中打开
|
SHOW_CAMERA_PHOTO_WHILE_SHOOTING = True # 是否在拍摄时显示摄像头图像(True=显示,False=不显示),建议在连着USB测试过程中打开
|
||||||
|
|
||||||
# ==================== OTA配置 ====================
|
# ==================== OTA配置 ====================
|
||||||
MAX_BACKUPS = 5
|
MAX_BACKUPS = 5
|
||||||
|
|||||||
1
main.py
1
main.py
@@ -323,6 +323,7 @@ def cmd_str():
|
|||||||
hardware_manager.start_idle_timer() # 重新计时
|
hardware_manager.start_idle_timer() # 重新计时
|
||||||
diff_ms = current_time - last_adc_trigger
|
diff_ms = current_time - last_adc_trigger
|
||||||
if diff_ms < 3000:
|
if diff_ms < 3000:
|
||||||
|
logger.info(f"[MAIN] 扳机触发过于频繁, {diff_ms}ms")
|
||||||
continue
|
continue
|
||||||
last_adc_trigger = current_time
|
last_adc_trigger = current_time
|
||||||
# 触发前先把缓存刷出来,避免波形被长耗时处理截断
|
# 触发前先把缓存刷出来,避免波形被长耗时处理截断
|
||||||
|
|||||||
29
network.py
29
network.py
@@ -440,20 +440,19 @@ class NetworkManager:
|
|||||||
# 1) 开机先尝试 WiFi,并评估质量
|
# 1) 开机先尝试 WiFi,并评估质量
|
||||||
if prefer_wifi and self.is_wifi_connected():
|
if prefer_wifi and self.is_wifi_connected():
|
||||||
wifi_rssi_dbm = self._get_wifi_rssi_dbm()
|
wifi_rssi_dbm = self._get_wifi_rssi_dbm()
|
||||||
wifi_rtt_ms, wifi_reachable = self._measure_wifi_tcp_rtt_ms(
|
wifi_rtt_ms = 0
|
||||||
host, port,
|
wifi_reachable = True
|
||||||
samples=getattr(config, "WIFI_QUALITY_RTT_SAMPLES", 3),
|
# wifi_rtt_ms, wifi_reachable = self._measure_wifi_tcp_rtt_ms(
|
||||||
per_sample_timeout_ms=900,
|
# host, port,
|
||||||
)
|
# samples=getattr(config, "WIFI_QUALITY_RTT_SAMPLES", 3),
|
||||||
|
# per_sample_timeout_ms=900,
|
||||||
|
# )
|
||||||
wifi_bad = self._is_wifi_quality_bad(wifi_rtt_ms, wifi_rssi_dbm)
|
wifi_bad = self._is_wifi_quality_bad(wifi_rtt_ms, wifi_rssi_dbm)
|
||||||
|
|
||||||
try:
|
|
||||||
self.logger.info(
|
self.logger.info(
|
||||||
f"[NET] WiFi质量评估:rtt_ms(median)={wifi_rtt_ms:.1f}, rssi_dbm={wifi_rssi_dbm}, "
|
f"[NET] WiFi质量评估:rtt_ms(median)={wifi_rtt_ms:.1f}, rssi_dbm={wifi_rssi_dbm}, "
|
||||||
f"reachable={wifi_reachable}, bad={wifi_bad}"
|
f"reachable={wifi_reachable}, bad={wifi_bad}"
|
||||||
)
|
)
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# 如果质量差且 4G 可用 -> 切换 4G 并锁定本次会话
|
# 如果质量差且 4G 可用 -> 切换 4G 并锁定本次会话
|
||||||
if wifi_bad and self.is_4g_available():
|
if wifi_bad and self.is_4g_available():
|
||||||
@@ -623,7 +622,7 @@ class NetworkManager:
|
|||||||
self._tcp_connected = True
|
self._tcp_connected = True
|
||||||
self.logger.info("[WIFI-TCP] TCP 连接已建立")
|
self.logger.info("[WIFI-TCP] TCP 连接已建立")
|
||||||
|
|
||||||
# 启动 WiFi 质量后台监测
|
# 启动 WiFi 质量后台检测
|
||||||
self._start_wifi_quality_monitor()
|
self._start_wifi_quality_monitor()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
@@ -755,7 +754,7 @@ class NetworkManager:
|
|||||||
|
|
||||||
def _disconnect_tcp_via_wifi(self):
|
def _disconnect_tcp_via_wifi(self):
|
||||||
"""断开 WiFi TCP 连接并停止监测"""
|
"""断开 WiFi TCP 连接并停止监测"""
|
||||||
# 先停止监测线程
|
# 关闭wifi检测
|
||||||
self._stop_wifi_quality_monitor()
|
self._stop_wifi_quality_monitor()
|
||||||
|
|
||||||
# 再关闭 socket
|
# 再关闭 socket
|
||||||
@@ -1298,6 +1297,7 @@ class NetworkManager:
|
|||||||
data = self.receive_tcp_data_via_wifi(timeout_ms=50)
|
data = self.receive_tcp_data_via_wifi(timeout_ms=50)
|
||||||
if data:
|
if data:
|
||||||
# 将数据添加到缓冲区
|
# 将数据添加到缓冲区
|
||||||
|
self.logger.info(f"[NET] 接收WiFi数据, {time.time()}")
|
||||||
wifi_manager.recv_buffer += data
|
wifi_manager.recv_buffer += data
|
||||||
|
|
||||||
# 尝试从缓冲区解析完整的数据包
|
# 尝试从缓冲区解析完整的数据包
|
||||||
@@ -1315,10 +1315,12 @@ class NetworkManager:
|
|||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
# 数据包不完整,等待更多数据
|
# 数据包不完整,等待更多数据
|
||||||
|
self.logger.info(f"[NET] 接收WiFi数据不完整, {time.time()}")
|
||||||
break
|
break
|
||||||
except:
|
except:
|
||||||
# 解析失败,清空缓冲区
|
# 解析失败,清空缓冲区
|
||||||
wifi_manager.recv_buffer = b""
|
wifi_manager.recv_buffer = b""
|
||||||
|
self.logger.info(f"[NET] 接收WiFi数据解析失败, {time.time()}")
|
||||||
break
|
break
|
||||||
elif self._network_type == "4g":
|
elif self._network_type == "4g":
|
||||||
# 4G接收数据
|
# 4G接收数据
|
||||||
@@ -1399,7 +1401,6 @@ class NetworkManager:
|
|||||||
data_obj = body.get("data")
|
data_obj = body.get("data")
|
||||||
if isinstance(data_obj, dict):
|
if isinstance(data_obj, dict):
|
||||||
inner_cmd = data_obj.get("cmd")
|
inner_cmd = data_obj.get("cmd")
|
||||||
|
|
||||||
if inner_cmd == 2: # 开启激光并校准
|
if inner_cmd == 2: # 开启激光并校准
|
||||||
from laser_manager import laser_manager
|
from laser_manager import laser_manager
|
||||||
if not laser_manager.calibration_active:
|
if not laser_manager.calibration_active:
|
||||||
@@ -1501,7 +1502,7 @@ class NetworkManager:
|
|||||||
# ota_manager._start_update_thread()
|
# ota_manager._start_update_thread()
|
||||||
# _thread.start_new_thread(ota_manager.direct_ota_download, (ota_url_to_use,))
|
# _thread.start_new_thread(ota_manager.direct_ota_download, (ota_url_to_use,))
|
||||||
elif inner_cmd == 41:
|
elif inner_cmd == 41:
|
||||||
self.logger.info("[TEST] 收到TCP射箭触发命令")
|
self.logger.info(f"[TEST] 收到TCP射箭触发命令, {time.time()}")
|
||||||
self._manual_trigger_flag = True
|
self._manual_trigger_flag = True
|
||||||
self.safe_enqueue({"result": "trigger_ack"}, 2)
|
self.safe_enqueue({"result": "trigger_ack"}, 2)
|
||||||
hardware_manager.start_idle_timer() # 重新计时
|
hardware_manager.start_idle_timer() # 重新计时
|
||||||
@@ -1545,6 +1546,10 @@ class NetworkManager:
|
|||||||
self._upload_log_file,
|
self._upload_log_file,
|
||||||
(upload_url, wifi_ssid, wifi_password, include_rotated, max_files, archive_format)
|
(upload_url, wifi_ssid, wifi_password, include_rotated, max_files, archive_format)
|
||||||
)
|
)
|
||||||
|
else: # data的结构不是 dict
|
||||||
|
self.logger.info(f"[NET] body={body}, {time.time()}")
|
||||||
|
else:
|
||||||
|
self.logger.info(f"[NET] 未知数据 {body}, {time.time()}")
|
||||||
else:
|
else:
|
||||||
time.sleep_ms(5)
|
time.sleep_ms(5)
|
||||||
|
|
||||||
|
|||||||
28
wifi.py
28
wifi.py
@@ -121,8 +121,8 @@ class WiFiManager:
|
|||||||
# 优先用 MaixPy network(如果可用)
|
# 优先用 MaixPy network(如果可用)
|
||||||
try:
|
try:
|
||||||
from maix import network
|
from maix import network
|
||||||
wlan = network.WLAN(network.TYPE_WIFI)
|
wifi = network.wifi.Wifi()
|
||||||
if wlan.isconnected():
|
if wifi.is_connected():
|
||||||
self._wifi_connected = True
|
self._wifi_connected = True
|
||||||
return True
|
return True
|
||||||
except:
|
except:
|
||||||
@@ -480,16 +480,19 @@ class WiFiManager:
|
|||||||
# 只在 WiFi 连接时才测量
|
# 只在 WiFi 连接时才测量
|
||||||
network_type = self._network_type_callback()
|
network_type = self._network_type_callback()
|
||||||
if network_type == "wifi" and self._wifi_socket:
|
if network_type == "wifi" and self._wifi_socket:
|
||||||
# 测量 RTT(1 个样本,快速测量)
|
# # 测量 RTT(1 个样本,快速测量)
|
||||||
rtt_ms, reachable = self._measure_wifi_tcp_rtt_ms(
|
# rtt_ms, reachable = self._measure_wifi_tcp_rtt_ms(
|
||||||
self._server_ip, self._server_port,
|
# self._server_ip, self._server_port,
|
||||||
samples=1, per_sample_timeout_ms=600
|
# samples=1, per_sample_timeout_ms=600
|
||||||
)
|
# )
|
||||||
|
|
||||||
# 获取 RSSI
|
# 获取 RSSI
|
||||||
rssi_dbm = self._get_wifi_rssi_dbm()
|
rssi_dbm = self._get_wifi_rssi_dbm()
|
||||||
|
|
||||||
# 更新缓存
|
# 更新缓存
|
||||||
|
# 不使用 RTT 测量
|
||||||
|
rtt_ms = 0
|
||||||
|
reachable = True
|
||||||
self._last_wifi_rtt_ms = rtt_ms if reachable else None
|
self._last_wifi_rtt_ms = rtt_ms if reachable else None
|
||||||
self._last_wifi_rssi_dbm = rssi_dbm
|
self._last_wifi_rssi_dbm = rssi_dbm
|
||||||
self.logger.debug(f"[WiFi Monitor] - RTT={rtt_ms:.0f}ms, RSSI={rssi_dbm:.0f}dBm")
|
self.logger.debug(f"[WiFi Monitor] - RTT={rtt_ms:.0f}ms, RSSI={rssi_dbm:.0f}dBm")
|
||||||
@@ -506,10 +509,13 @@ class WiFiManager:
|
|||||||
|
|
||||||
for retry_idx in range(2):
|
for retry_idx in range(2):
|
||||||
time.sleep_ms(1000)
|
time.sleep_ms(1000)
|
||||||
rtt2, reachable2 = self._measure_wifi_tcp_rtt_ms(
|
# 不使用 RTT 测量
|
||||||
self._server_ip, self._server_port,
|
rtt2 = 0
|
||||||
samples=1, per_sample_timeout_ms=600
|
reachable2 = True
|
||||||
)
|
# rtt2, reachable2 = self._measure_wifi_tcp_rtt_ms(
|
||||||
|
# self._server_ip, self._server_port,
|
||||||
|
# samples=1, per_sample_timeout_ms=600
|
||||||
|
# )
|
||||||
rssi2 = self._get_wifi_rssi_dbm()
|
rssi2 = self._get_wifi_rssi_dbm()
|
||||||
|
|
||||||
# 更新缓存,便于外部查看最新状态
|
# 更新缓存,便于外部查看最新状态
|
||||||
|
|||||||
Reference in New Issue
Block a user