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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#![allow(dead_code)]
#![allow(unused_mut)]
use super::*;
use crate::wifi::dto::*;
use anyhow::anyhow;
use std::io;
use std::path::PathBuf;
pub(crate) struct EventConn {
conn: Conn<1024>,
sender: mpsc::Sender<Event>,
}
impl EventConn {
pub(crate) async fn new(server_path: &PathBuf) -> AppResult<(Self, mpsc::Receiver<Event>)> {
let conn = Conn::connect(server_path, "wap_cli_evt.sock").await?;
let (evt_sender, evt_receiver) = mpsc::channel(32);
Ok((
Self {
conn,
sender: evt_sender,
},
evt_receiver,
))
}
async fn send(&self, event: Event) -> AppResult {
self.sender
.send(event)
.await
.map_err(|_| anyhow!("EventChannelClosed"))?;
Ok(())
}
//启动鉴听进入sokcet 的 事件
pub(crate) async fn listening(mut self) -> AppResult {
log::debug!("[wpa] event listening...");
#[cfg(target_os = "linux")]
{
//进入事件
self.conn.socket.send(b"ATTACH").await?;
loop {
self.conn.socket.readable().await?;
match self.conn.socket.try_recv(&mut self.conn.buffer) {
Ok(n) => {
let msg = std::str::from_utf8(&self.conn.buffer[..n])?.trim_end();
log::trace!("[wpa] revc event:{}", msg);
//扫描有结果了
if msg.ends_with("CTRL-EVENT-SCAN-RESULTS") {
log::debug!("[wpa] revc event:{}", msg);
self.send(Event::ScanComplete).await?;
continue;
}
//成功连接 AP
if msg.contains("CTRL-EVENT-CONNECTED") {
log::debug!("[wpa] revc event:{}", msg);
self.send(Event::Connected).await?;
continue;
}
//断开连接
if msg.contains("CTRL-EVENT-DISCONNECTED") {
log::debug!("[wpa] revc event:{}", msg);
self.send(Event::Disconnected).await?;
continue;
}
//关联请求被拒绝
//认证失败
// (msg.contains("CTRL-EVENT-SSID-TEMP-DISABLED")&& msg.contains("reason=WRONG_KEY"))
if msg.contains("CTRL-EVENT-ASSOC-REJECT")
|| msg.contains("CTRL-EVENT-SSID-TEMP-DISABLED")
|| msg.contains("CTRL-EVENT-AUTH-REJECT")
|| msg.contains("CTRL-EVENT-EAP-FAILURE")
{
log::debug!("[wpa] revc event:{}", msg);
self.send(Event::WrongPsk).await?;
continue;
}
// if msg.contains("CTRL-EVENT-NETWORK-NOT-FOUND") {
// self.send(Event::NetworkNotFound).await?;
// continue;
// }
// self.send(Event::Unknown(msg.into())).await?;
}
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
continue;
}
Err(e) => {
log::warn!("[wpa] event revc err:{}", e);
return Err(anyhow!("[wpa] event revc err:({})", e));
}
}
}
}
#[cfg(target_os = "windows")]
return Err(anyhow!("Implemented"));
}
}