baoshiwei
6 天以前 5bf14aed888cd0e258e325c65f14022dad02985b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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(())
}