|
|
@@ -97,7 +97,7 @@ impl OkxSwapWs {
|
|
|
login_param,
|
|
|
symbol_s: vec![],
|
|
|
subscribe_types: vec![],
|
|
|
- heartbeat_time: 1000 * 5,
|
|
|
+ heartbeat_time: 1000 * 10,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -319,249 +319,46 @@ impl OkxSwapWs {
|
|
|
|
|
|
Ok(())
|
|
|
}
|
|
|
-
|
|
|
- // async fn run(&mut self, bool_v1: Arc<AtomicBool>)
|
|
|
- // {
|
|
|
- // //订阅信息组装
|
|
|
- // let subscription = self.get_subscription();
|
|
|
- // loop {
|
|
|
- // trace!("要连接咯~~!!{}", self.address_url);
|
|
|
- //
|
|
|
- // let address_url = Url::parse(self.address_url.as_str()).unwrap();
|
|
|
- // //1. 判断是否需要代理,根据代理地址是否存来选择
|
|
|
- // if self.proxy.ip_address.len() > 0 {
|
|
|
- // let ip_array: Vec<&str> = self.proxy.ip_address.split(".").collect();
|
|
|
- // let proxy_address = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(
|
|
|
- // ip_array[0].parse().unwrap(),
|
|
|
- // ip_array[1].parse().unwrap(),
|
|
|
- // ip_array[2].parse().unwrap(),
|
|
|
- // ip_array[3].parse().unwrap())
|
|
|
- // ), self.proxy.port.parse().unwrap());
|
|
|
- // let websocket_config = Some(WebSocketConfig {
|
|
|
- // max_send_queue: Some(16),
|
|
|
- // max_message_size: Some(16 * 1024 * 1024),
|
|
|
- // max_frame_size: Some(16 * 1024 * 1024),
|
|
|
- // accept_unmasked_frames: false,
|
|
|
- // });
|
|
|
- // let max_redirects = 5;
|
|
|
- // match connect_with_proxy(address_url.clone(),
|
|
|
- // proxy_address, websocket_config, max_redirects) {
|
|
|
- // Ok(ws) => {
|
|
|
- // let bool_v1_clone = Arc::clone(&bool_v1);
|
|
|
- // self.proxy_subscription(bool_v1_clone, ws.0, subscription.clone()).await;
|
|
|
- // }
|
|
|
- // Err(err) => {
|
|
|
- // trace!("Can't connect(无法连接): {}", err);
|
|
|
- // }
|
|
|
- // };
|
|
|
- // } else {
|
|
|
- // match connect(address_url.clone()) {
|
|
|
- // Ok(ws) => {
|
|
|
- // let bool_v1_clone = Arc::clone(&bool_v1);
|
|
|
- // self.subscription(bool_v1_clone, ws.0, subscription.clone()).await;
|
|
|
- // }
|
|
|
- // Err(err) => {
|
|
|
- // // 连接失败时执行的操作
|
|
|
- // trace!("Can't connect(无法连接): {}", err);
|
|
|
- // // 返回一个默认的 WebSocket 对象或其他适当的值
|
|
|
- // // 或者根据需要触发 panic 或返回错误信息
|
|
|
- // }
|
|
|
- // };
|
|
|
- // }
|
|
|
- // trace!("退出来咯");
|
|
|
- //
|
|
|
- // let bool_v1_clone = Arc::clone(&bool_v1);
|
|
|
- // let bool_v1_v = bool_v1_clone.load(Ordering::SeqCst);
|
|
|
- // if !bool_v1_v {
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
- //
|
|
|
- // //代理
|
|
|
- // async fn proxy_subscription(&self, bool_v1: Arc<AtomicBool>, mut web_socket: WebSocket<ProxyAutoStream>,
|
|
|
- // subscription: String)
|
|
|
- // {
|
|
|
- // let lable = self.label.clone();
|
|
|
- // /*****登陆***/
|
|
|
- // let login_str = self.log_in_to_str();
|
|
|
- // if login_str != "" {
|
|
|
- // let _ = web_socket.write_message(Message::Text(login_str));
|
|
|
- // thread::sleep(Duration::from_secs(3));
|
|
|
- // }
|
|
|
- // /*****订阅***/
|
|
|
- // web_socket.write_message(Message::Text(subscription))
|
|
|
- // .unwrap();
|
|
|
- // /*****消息溜***/
|
|
|
- // let mut ping_timeout = chrono::Utc::now().timestamp_millis();
|
|
|
- // loop {
|
|
|
- // tokio::time::sleep(Duration::from_millis(1)).await;
|
|
|
- // let msg = web_socket.read_message();
|
|
|
- // match msg {
|
|
|
- // Ok(Message::Text(text)) => {
|
|
|
- // let get_time = chrono::Utc::now().timestamp_millis();
|
|
|
- // if (get_time - ping_timeout) >= (1000 * 30) {
|
|
|
- // trace!("30s 一次主动发送心跳包!");
|
|
|
- // let _ = web_socket.write_message(Message::Ping(Vec::from("ping")));
|
|
|
- // ping_timeout = get_time;
|
|
|
- // }
|
|
|
- //
|
|
|
- // let mut res_data = Self::ok_text(lable.to_string(), text);
|
|
|
- // res_data.time = get_time_microsecond();
|
|
|
- // if res_data.code == "-201" {
|
|
|
- // trace!("登陆成功!");
|
|
|
- // } else if res_data.code == "-200" {
|
|
|
- // trace!("订阅成功:{:?}", res_data.data);
|
|
|
- // } else {
|
|
|
- // self.sender.send(res_data).await.unwrap();
|
|
|
- // }
|
|
|
- // }
|
|
|
- // Ok(Message::Ping(s)) => {
|
|
|
- // trace!( "Ping-响应--{:?}", String::from_utf8(s.clone()));
|
|
|
- // let _ = web_socket.write_message(Message::Pong(Vec::from("pong")));
|
|
|
- // trace!( "回应-pong---{:?}", String::from_utf8(s.clone()));
|
|
|
- // }
|
|
|
- // Ok(Message::Pong(s)) => {
|
|
|
- // // trace!("Pong-响应--{:?}", String::from_utf8(s));
|
|
|
- // trace!( "Pong-响应--{:?}", String::from_utf8(s.clone()));
|
|
|
- // }
|
|
|
- // Ok(Message::Close(_)) => {
|
|
|
- // // trace!("socket 关闭: ");
|
|
|
- // trace!( "Close-响应");
|
|
|
- // }
|
|
|
- // Err(e) => {
|
|
|
- // // trace!("Error receiving message: {}", error);
|
|
|
- // trace!("Err-响应{}", e);
|
|
|
- // error!( "Err-响应{}", e);
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // _ => {}
|
|
|
- // }
|
|
|
- //
|
|
|
- // let bool_v1_v = bool_v1.load(Ordering::SeqCst);
|
|
|
- // if !bool_v1_v {
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // web_socket.close(None).unwrap();
|
|
|
- // }
|
|
|
- //
|
|
|
- // //非代理
|
|
|
- // async fn subscription(&self, bool_v1: Arc<AtomicBool>, mut web_socket: WebSocket<AutoStream>,
|
|
|
- // subscription: String)
|
|
|
- // {
|
|
|
- // let lable = self.label.clone();
|
|
|
- // /*****订阅***/
|
|
|
- // web_socket.write_message(Message::Text(subscription))
|
|
|
- // .unwrap();
|
|
|
- // /*****消息溜***/
|
|
|
- // let mut ping_timeout = chrono::Utc::now().timestamp_millis();
|
|
|
- // loop {
|
|
|
- // tokio::time::sleep(Duration::from_millis(1)).await;
|
|
|
- // let msg = web_socket.read_message();
|
|
|
- // match msg {
|
|
|
- // Ok(Message::Text(text)) => {
|
|
|
- // let get_time = chrono::Utc::now().timestamp_millis();
|
|
|
- // if (get_time - ping_timeout) >= (1000 * 30) {
|
|
|
- // trace!("30s 一次主动发送心跳包!");
|
|
|
- // let _ = web_socket.write_message(Message::Ping(Vec::from("ping")));
|
|
|
- // ping_timeout = get_time;
|
|
|
- // }
|
|
|
- //
|
|
|
- // let mut res_data = Self::ok_text(lable.to_string(), text);
|
|
|
- // res_data.time = get_time_microsecond();
|
|
|
- // if res_data.code == "-201" {
|
|
|
- // trace!("登陆成功!");
|
|
|
- // } else if res_data.code == "-200" {
|
|
|
- // trace!("订阅成功:{:?}", res_data.data);
|
|
|
- // } else {
|
|
|
- // self.sender.send(res_data).await.unwrap();
|
|
|
- // }
|
|
|
- // }
|
|
|
- // Ok(Message::Ping(s)) => {
|
|
|
- // trace!( "Ping-响应--{:?}", String::from_utf8(s.clone()));
|
|
|
- // let _ = web_socket.write_message(Message::Pong(Vec::from("pong")));
|
|
|
- // trace!( "回应-pong---{:?}", String::from_utf8(s.clone()));
|
|
|
- // }
|
|
|
- // Ok(Message::Pong(s)) => {
|
|
|
- // // trace!("Pong-响应--{:?}", String::from_utf8(s));
|
|
|
- // trace!( "Pong-响应--{:?}", String::from_utf8(s.clone()));
|
|
|
- // }
|
|
|
- // Ok(Message::Close(_)) => {
|
|
|
- // // trace!("socket 关闭: ");
|
|
|
- // trace!( "Close-响应");
|
|
|
- // }
|
|
|
- // Err(e) => {
|
|
|
- // // trace!("Error receiving message: {}", error);
|
|
|
- // trace!("Err-响应{}", e);
|
|
|
- // error!( "Err-响应{}", e);
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // _ => {}
|
|
|
- // }
|
|
|
- //
|
|
|
- // let bool_v1_v = bool_v1.load(Ordering::SeqCst);
|
|
|
- // if !bool_v1_v {
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // web_socket.close(None).unwrap();
|
|
|
- // }
|
|
|
/*******************************************************************************************************/
|
|
|
/*****************************************数据解析*****************************************************/
|
|
|
/*******************************************************************************************************/
|
|
|
//数据解析-Text
|
|
|
pub fn message_text(text: String) -> Option<ResponseData> {
|
|
|
- let mut response_data = Self::ok_text(text);
|
|
|
- response_data.time = get_time_microsecond();
|
|
|
- match response_data.code.as_str() {
|
|
|
- "200" => Option::from(response_data),
|
|
|
- "-200" => {
|
|
|
- trace!("订阅成功:{:?}", response_data);
|
|
|
- None
|
|
|
- }
|
|
|
- "-201" => {
|
|
|
- trace!("登录成功:{:?}", response_data);
|
|
|
- None
|
|
|
- }
|
|
|
- _ => None
|
|
|
- }
|
|
|
+ let response_data = Self::ok_text(text);
|
|
|
+ Option::from(response_data)
|
|
|
}
|
|
|
//数据解析-ping
|
|
|
pub fn message_ping(_pi: Vec<u8>) -> Option<ResponseData> {
|
|
|
- trace!("服务器响应-ping");
|
|
|
- return None;
|
|
|
+ return Option::from(ResponseData::new("".to_string(), "-300".to_string(), "success".to_string(), "".to_string()));
|
|
|
}
|
|
|
//数据解析-pong
|
|
|
pub fn message_pong(_po: Vec<u8>) -> Option<ResponseData> {
|
|
|
- trace!("服务器响应-pong");
|
|
|
- return None;
|
|
|
+ return Option::from(ResponseData::new("".to_string(), "-301".to_string(), "success".to_string(), "".to_string()));
|
|
|
}
|
|
|
//数据解析
|
|
|
pub fn ok_text(text: String) -> ResponseData
|
|
|
{
|
|
|
// trace!("元数据:{}",text);
|
|
|
- let mut res_data = ResponseData::new("".to_string(), "200".to_string(), "success".to_string(), "".to_string());
|
|
|
+ let mut res_data = ResponseData::new("".to_string(), "".to_string(), "success".to_string(), "".to_string());
|
|
|
let json_value: serde_json::Value = serde_json::from_str(&text).unwrap();
|
|
|
if json_value.get("event").is_some() {//订阅返回
|
|
|
if json_value["event"].as_str() == Option::from("login") &&
|
|
|
json_value["code"].as_str() == Option::from("0") {
|
|
|
- res_data.code = "-201".to_string();
|
|
|
+ res_data.code = "-200".to_string();
|
|
|
res_data.message = format!("登陆成功!");
|
|
|
} else if json_value["event"].as_str() == Option::from("error") {
|
|
|
res_data.code = json_value["code"].to_string();
|
|
|
res_data.message = format!("订阅失败:{}", json_value["msg"].to_string());
|
|
|
} else if json_value["event"].as_str() == Option::from("subscribe") {
|
|
|
- res_data.code = "-200".to_string();
|
|
|
+ res_data.code = "-201".to_string();
|
|
|
res_data.data = text;
|
|
|
res_data.message = format!("订阅成功!");
|
|
|
- } else {
|
|
|
- res_data.data = text;
|
|
|
}
|
|
|
} else {
|
|
|
if json_value.get("arg").is_some() && json_value.get("data").is_some() {
|
|
|
res_data.channel = format!("{}", json_value["arg"]["channel"].as_str().unwrap());
|
|
|
res_data.data = json_value["data"].to_string();
|
|
|
+ res_data.code = "200".to_string();
|
|
|
// res_data.reach_time = json_value["data"][0]["ts"].as_str().unwrap().parse().unwrap()
|
|
|
} else {
|
|
|
res_data.data = text;
|