收到 welcome 后才发 GetFileVer ✅ 2. 日志格式统一为 yyyy-MM-dd HH:mm:ss.fff 收到/发送消息:json
This commit is contained in:
@@ -151,36 +151,61 @@ async fn run_updater(debug_mode: bool) {
|
||||
let mut client = WebSocketClient::new(config);
|
||||
|
||||
// 设置连接成功回调
|
||||
let debug_clone = debug_mode;
|
||||
let debug_connected = debug_mode;
|
||||
client.on_connected(move |url| {
|
||||
if debug_clone {
|
||||
println!("[已连接] {}", url);
|
||||
if debug_connected {
|
||||
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
println!("{} 收到消息:{}", ts, url);
|
||||
}
|
||||
});
|
||||
|
||||
// 设置消息接收回调
|
||||
let debug_for_msg = debug_mode;
|
||||
client.on_message(move |msg_type, data| {
|
||||
if debug_for_msg {
|
||||
// 以标准 JSON 字符串格式输出日志
|
||||
println!("[消息] {}", serde_json::to_string(&data).unwrap_or_else(|_| data.to_string()));
|
||||
let debug_msg = debug_mode;
|
||||
let device_number = resolve_device_number();
|
||||
client.on_message(move |msg_type, data, sender| {
|
||||
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
if debug_msg {
|
||||
// 收到消息日志:Type 在前
|
||||
let data_str = serde_json::to_string(&data).unwrap_or_else(|_| "{}".to_string());
|
||||
println!("{} 收到消息:{{\"Type\":{},\"Data\":{}}}",
|
||||
ts,
|
||||
serde_json::to_string(&msg_type).unwrap_or_default(),
|
||||
data_str
|
||||
);
|
||||
}
|
||||
|
||||
// 收到 welcome 后,发送 GetFileVer
|
||||
if msg_type == "welcome" {
|
||||
if !device_number.is_empty() && device_number != "UNKNOWN" {
|
||||
let msg_str = format!(
|
||||
r#"{{"Type":"GetFileVer","Data":{{"DeviceNumber":"{}","file_list":["BootLoader.exe"]}}}}"#,
|
||||
device_number
|
||||
);
|
||||
if debug_msg {
|
||||
let ts2 = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
println!("{} 发送消息:{}", ts2, msg_str);
|
||||
}
|
||||
sender.send(msg_str);
|
||||
}
|
||||
}
|
||||
|
||||
// 处理 FileVer 响应
|
||||
if msg_type == "FileVer" {
|
||||
if let Some(file_versions) = data.get("Data").and_then(|d| d.get("file_versions")).and_then(|v| v.as_object()) {
|
||||
for (filename, version) in file_versions {
|
||||
let ver_str = version.as_str().unwrap_or("");
|
||||
println!("[版本] {} = {}", filename, if ver_str.is_empty() { "未知" } else { ver_str });
|
||||
println!("{} [版本] {} = {}", ts, filename, if ver_str.is_empty() { "未知" } else { ver_str });
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// 设置断开连接回调
|
||||
let debug_for_disconnect = debug_mode;
|
||||
let debug_disconnect = debug_mode;
|
||||
client.on_disconnected(move || {
|
||||
if debug_for_disconnect {
|
||||
println!("[断开] 连接已断开");
|
||||
if debug_disconnect {
|
||||
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
println!("{} [断开] 连接已断开", ts);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -189,90 +214,57 @@ async fn run_updater(debug_mode: bool) {
|
||||
eprintln!("[错误] WebSocket: {}", error);
|
||||
});
|
||||
|
||||
// 设置首次连接回调 - 发送 GetFileVer 命令
|
||||
let debug_for_first = debug_mode;
|
||||
let device_number = resolve_device_number();
|
||||
client.on_first_connect(move |_url, sender| {
|
||||
let device_number = device_number.clone();
|
||||
// 设置首次连接回调(GetFileVer 改到收到 welcome 后发送)
|
||||
let debug_first = debug_mode;
|
||||
let device_number_first = resolve_device_number();
|
||||
client.on_first_connect(move |_url, _sender| {
|
||||
let device_number = device_number_first.clone();
|
||||
Box::pin(async move {
|
||||
// 仅当有有效的 DeviceNumber 时才发送 GetFileVer 命令
|
||||
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
if device_number.is_empty() || device_number == "UNKNOWN" {
|
||||
if debug_for_first {
|
||||
println!("[首次连接] 未配置设备号,仅维持心跳连接");
|
||||
if debug_first {
|
||||
println!("{} [连接] 已连接,未配置设备号,仅维持心跳", ts);
|
||||
}
|
||||
} else {
|
||||
if debug_first {
|
||||
println!("{} [连接] 已连接,等待服务器欢迎消息...", ts);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if debug_for_first {
|
||||
println!("[首次连接] 发送 GetFileVer 命令...");
|
||||
}
|
||||
// 构造 GetFileVer 消息 - Type在前,DeviceNumber 放在 Data 内部
|
||||
// 注意:手动拼接字符串确保 Type 在 JSON 的第一位(serde_json::json! 会按字母排序)
|
||||
let msg_str = format!(
|
||||
r#"{{"Type":"GetFileVer","Data":{{"DeviceNumber":"{}","file_list":["BootLoader.exe"]}}}}"#,
|
||||
device_number
|
||||
);
|
||||
|
||||
if debug_for_first {
|
||||
println!("[首次连接] GetFileVer 已发送: {}", msg_str);
|
||||
}
|
||||
|
||||
// 通过 sender 发送消息 (使用 .lock().await)
|
||||
let sender_guard = sender.lock().await;
|
||||
if let Some(ref tx) = *sender_guard {
|
||||
let _ = tx.try_send(cube_lib::websocket::OutgoingMessage::Text(msg_str));
|
||||
}
|
||||
}) as Pin<Box<dyn std::future::Future<Output = ()> + Send + Sync>>
|
||||
});
|
||||
|
||||
// 设置重连回调 - 在每次重连前重新加载配置
|
||||
let debug_for_reconnect = debug_mode;
|
||||
// 设置重连回调
|
||||
let debug_reconnect = debug_mode;
|
||||
client.on_reconnecting(move |attempt, url_arc| {
|
||||
Box::pin(async move {
|
||||
if debug_for_reconnect {
|
||||
println!("[重连] 第 {} 次重连中...", attempt);
|
||||
if debug_reconnect {
|
||||
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
println!("{} [重连] 第 {} 次重连中...", ts, attempt);
|
||||
}
|
||||
// 重新读取配置文件并更新 URL
|
||||
let new_url = resolve_ws_url();
|
||||
// 更新 CubeLib 内部的 URL (使用 .lock().await)
|
||||
*url_arc.lock().await = new_url.clone();
|
||||
if debug_for_reconnect {
|
||||
println!("[配置] 已重新加载,服务器地址: {}", new_url);
|
||||
if debug_reconnect {
|
||||
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
println!("{} [重连] 配置已更新,服务器: {}", ts, new_url);
|
||||
}
|
||||
}) as Pin<Box<dyn std::future::Future<Output = ()> + Send + Sync>>
|
||||
});
|
||||
|
||||
// 设置重连成功回调 - 每次重连成功后也发送 GetFileVer
|
||||
let debug_for_reconnected = debug_mode;
|
||||
let device_number = resolve_device_number();
|
||||
client.on_reconnected(move |_url, sender| {
|
||||
let device_number = device_number.clone();
|
||||
// 设置重连成功回调
|
||||
let debug_reconnected = debug_mode;
|
||||
let device_number_reconn = resolve_device_number();
|
||||
client.on_reconnected(move |_url, _sender| {
|
||||
let device_number = device_number_reconn.clone();
|
||||
Box::pin(async move {
|
||||
// 仅当有有效的 DeviceNumber 时才发送 GetFileVer 命令
|
||||
let ts = chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f");
|
||||
if device_number.is_empty() || device_number == "UNKNOWN" {
|
||||
if debug_for_reconnected {
|
||||
println!("[重连成功] 未配置设备号,仅维持心跳连接");
|
||||
if debug_reconnected {
|
||||
println!("{} [重连] 已重连,未配置设备号", ts);
|
||||
}
|
||||
} else {
|
||||
if debug_reconnected {
|
||||
println!("{} [重连] 已重连,等待服务器欢迎消息...", ts);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if debug_for_reconnected {
|
||||
println!("[重连成功] 发送 GetFileVer 命令...");
|
||||
}
|
||||
// 构造 GetFileVer 消息 - Type在前,DeviceNumber 放在 Data 内部
|
||||
let msg_str = format!(
|
||||
r#"{{"Type":"GetFileVer","Data":{{"DeviceNumber":"{}","file_list":["BootLoader.exe"]}}}}"#,
|
||||
device_number
|
||||
);
|
||||
|
||||
if debug_for_reconnected {
|
||||
println!("[重连成功] GetFileVer 已发送: {}", msg_str);
|
||||
}
|
||||
|
||||
// 通过 sender 发送消息
|
||||
let sender_guard = sender.lock().await;
|
||||
if let Some(ref tx) = *sender_guard {
|
||||
let _ = tx.try_send(cube_lib::websocket::OutgoingMessage::Text(msg_str));
|
||||
}
|
||||
}) as Pin<Box<dyn std::future::Future<Output = ()> + Send + Sync>>
|
||||
});
|
||||
@@ -281,15 +273,9 @@ async fn run_updater(debug_mode: bool) {
|
||||
if debug_mode {
|
||||
println!("[启动] 开始连接...");
|
||||
}
|
||||
|
||||
// connect() 会等待 websocket_loop 完全结束(包括所有重连)
|
||||
client.connect().await;
|
||||
|
||||
if debug_mode {
|
||||
println!("[启动] 连接已结束");
|
||||
}
|
||||
|
||||
if debug_mode {
|
||||
println!("Updater 已停止");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user