use std::sync::{Arc, Mutex};
|
use once_cell::sync::Lazy;
|
use tokio::runtime::Runtime;
|
use tokio_tungstenite::connect_async;
|
use futures_util::{StreamExt};
|
|
// 全局缓存最新六维力数据
|
pub static LATEST_WS_DATA: Lazy<Arc<Mutex<Option<String>>>> = Lazy::new(|| Arc::new(Mutex::new(None)));
|
|
// WebSocket 服务端地址(可根据实际情况修改)
|
const WS_SERVER_URL: &str = "ws://192.168.21.25:5000";
|
|
pub fn start_ws_client() {
|
// 启动 tokio runtime
|
std::thread::spawn(|| {
|
let rt = Runtime::new().unwrap();
|
rt.block_on(async move {
|
if let Err(e) = ws_client_task().await {
|
eprintln!("WebSocket 客户端启动失败: {}", e);
|
}
|
});
|
});
|
}
|
|
async fn ws_client_task() -> anyhow::Result<()> {
|
println!("尝试连接 WebSocket 服务端: {}", WS_SERVER_URL);
|
let (ws_stream, _) = connect_async(WS_SERVER_URL).await?;
|
println!("WebSocket 已连接");
|
let (_, mut read) = ws_stream.split();
|
while let Some(msg) = read.next().await {
|
match msg {
|
Ok(tungstenite::Message::Text(text)) => {
|
// 假设服务端推送的就是六维力数据的 JSON 字符串
|
let mut data = LATEST_WS_DATA.lock().unwrap();
|
*data = Some(text.clone());
|
},
|
Ok(_) => {},
|
Err(e) => {
|
eprintln!("WebSocket 读取错误: {}", e);
|
break;
|
}
|
}
|
}
|
Ok(())
|
}
|