itpdp/esp32/src/net.rs
2026-05-11 19:18:41 +02:00

81 lines
2.6 KiB
Rust

use core::net::SocketAddrV4;
use core::str::FromStr;
use embassy_futures::join::join;
use embassy_net::tcp::TcpSocket;
use embassy_time::Duration;
use esp_hal::peripherals::WIFI;
use esp_hal::rng::Rng;
use esp_println::println;
use esp_radio::wifi::{scan::ScanConfig, Config, ControllerConfig};
use esp_radio::wifi::sta::StationConfig;
use crate::{buffer::wait_for_config, tcp_read_loop, tcp_write_loop};
pub struct NetworkConfig<'a> {
pub wifi: WIFI<'a>,
pub wifi_network: &'a str,
pub wifi_password: &'a str,
pub target_ip: &'a str,
pub target_port: u16,
}
#[embassy_executor::task]
async fn net_task(mut runner: embassy_net::Runner<'static, esp_radio::wifi::Interface<'static>>) -> ! {
runner.run().await
}
#[embassy_executor::task]
pub async fn network_setup_task(spawner: embassy_executor::Spawner, config: NetworkConfig<'static>) {
let wifi_config = Config::Station(
StationConfig::default()
.with_ssid(config.wifi_network)
.with_password(config.wifi_password.into()),
);
println!("Starting wifi");
let (mut controller, interfaces) = esp_radio::wifi::new(
config.wifi,
ControllerConfig::default().with_initial_config(wifi_config),
)
.unwrap();
println!("Wifi configured and started!");
let wifi_interface = interfaces.station;
let net_config = embassy_net::Config::dhcpv4(Default::default());
let rng = Rng::new();
let seed = (rng.random() as u64) << 32 | rng.random() as u64;
let (stack, runner) = embassy_net::new(
wifi_interface,
net_config,
crate::screen::stack_resources(),
seed,
);
spawner.spawn(net_task(runner).expect("spawn net task"));
println!("Scan");
let scan_config = ScanConfig::default().with_max(10);
let result = controller.scan_async(&scan_config).await.unwrap();
for ap in result {
println!("{:?}", ap);
}
stack.wait_config_up().await;
let cfg = wait_for_config(stack).await;
let local_addr = cfg.address.address();
println!("IP address: {:?}", local_addr);
let host_addr = embassy_net::Ipv4Address::from_str(config.target_ip).unwrap();
let mut rx_buffer = [0; 4096];
let mut tx_buffer = [0; 4096];
let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer);
socket.set_timeout(Some(Duration::from_secs(10)));
socket.set_keep_alive(Some(Duration::from_secs(1)));
if let Err(e) = socket.connect(SocketAddrV4::new(host_addr, config.target_port)).await {
println!("tcp connect error: {:?}", e);
}
let (read, write) = socket.split();
join(tcp_read_loop(read), tcp_write_loop(write)).await;
}