mirror of
https://github.com/laanwj/k210-sdk-stuff.git
synced 2024-11-26 11:23:32 +04:00
bfe58fe72b
Add library for communicating with WiFi using the ESP8266 using AT commands. This really should have its own repo at some point.
107 lines
3.7 KiB
Rust
107 lines
3.7 KiB
Rust
use std::fmt;
|
|
use std::str;
|
|
use std::time::Duration;
|
|
|
|
use clap::{App, AppSettings, Arg};
|
|
use serialport::prelude::*;
|
|
|
|
use esp8266at::handler::{NetworkEvent, SerialNetworkHandler};
|
|
use esp8266at::mainloop::mainloop;
|
|
use esp8266at::response::ConnectionType;
|
|
use esp8266at::traits::Write;
|
|
|
|
struct StdoutDebug {}
|
|
impl fmt::Write for StdoutDebug {
|
|
fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> {
|
|
print!("{}", s);
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let matches = App::new("Serialport Example - Receive Data")
|
|
.about("Reads data from a serial port and echoes it to stdout")
|
|
.setting(AppSettings::DisableVersion)
|
|
.arg(
|
|
Arg::with_name("port")
|
|
.help("The device path to a serial port")
|
|
.use_delimiter(false)
|
|
.required(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name("baud")
|
|
.help("The baud rate to connect at")
|
|
.use_delimiter(false)
|
|
.required(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name("apname")
|
|
.help("Access point name")
|
|
.use_delimiter(false)
|
|
.required(true),
|
|
)
|
|
.arg(
|
|
Arg::with_name("appass")
|
|
.help("Access point password")
|
|
.use_delimiter(false)
|
|
.required(true),
|
|
)
|
|
.get_matches();
|
|
let port_name = matches.value_of("port").unwrap();
|
|
let baud_rate = matches.value_of("baud").unwrap();
|
|
let apname = matches.value_of("apname").unwrap();
|
|
let appass = matches.value_of("appass").unwrap();
|
|
|
|
let mut settings: SerialPortSettings = Default::default();
|
|
settings.timeout = Duration::from_millis(10);
|
|
if let Ok(rate) = baud_rate.parse::<u32>() {
|
|
settings.baud_rate = rate.into();
|
|
} else {
|
|
eprintln!("Error: Invalid baud rate '{}' specified", baud_rate);
|
|
::std::process::exit(1);
|
|
}
|
|
|
|
match serialport::open_with_settings(&port_name, &settings) {
|
|
Ok(mut tx) => {
|
|
// Split into TX and RX halves
|
|
let mut rx = tx.try_clone().unwrap();
|
|
println!("Receiving data on {} at {} baud:", &port_name, &baud_rate);
|
|
let mut sh = SerialNetworkHandler::new(&mut tx, apname.as_bytes(), appass.as_bytes());
|
|
|
|
sh.start(true).unwrap();
|
|
|
|
mainloop(&mut sh, &mut rx, |port, ev, debug| {
|
|
match ev {
|
|
NetworkEvent::Ready => {
|
|
writeln!(debug, "--Ready--").unwrap();
|
|
port.connect(ConnectionType::TCP, b"wttr.in", 80).unwrap();
|
|
//port.connect(0, ConnectionType::SSL, b"wttr.in", 443);
|
|
true
|
|
}
|
|
NetworkEvent::Error => {
|
|
writeln!(debug, "--Could not connect to AP--").unwrap();
|
|
false
|
|
}
|
|
NetworkEvent::ConnectionEstablished(_) => {
|
|
port.write_all(b"GET /?0qA HTTP/1.1\r\nHost: wttr.in\r\nConnection: close\r\nUser-Agent: Weather-Spy\r\n\r\n").unwrap();
|
|
port.send(0).unwrap();
|
|
true
|
|
}
|
|
NetworkEvent::Data(_, data) => {
|
|
write!(debug, "{}", str::from_utf8(data).unwrap()).unwrap();
|
|
true
|
|
}
|
|
NetworkEvent::ConnectionClosed(_) => {
|
|
false
|
|
}
|
|
_ => { true }
|
|
}
|
|
}, &mut StdoutDebug {}).unwrap();
|
|
}
|
|
Err(e) => {
|
|
eprintln!("Failed to open \"{}\". Error: {}", port_name, e);
|
|
::std::process::exit(1);
|
|
}
|
|
}
|
|
}
|