Wi-Fi module
The wifi.rs code is the same as in the 'Access Website' chapter of the Wi-Fi section. I recommend referring to it for more details.
#![allow(unused)] fn main() { use crate::mk_static; use embassy_executor::Spawner; use embassy_net::{DhcpConfig, Runner, Stack, StackResources}; use embassy_time::{Duration, Timer}; use esp_hal::rng::Rng; use esp_println as _; use esp_println::println; use esp_radio::wifi::{ ClientConfig, ModeConfig, ScanConfig, WifiController, WifiDevice, WifiEvent, WifiStaState, }; const SSID: &str = env!("SSID"); const PASSWORD: &str = env!("PASSWORD"); #[embassy_executor::task] async fn connection(mut controller: WifiController<'static>) { println!("start connection task"); println!("Device capabilities: {:?}", controller.capabilities()); loop { match esp_radio::wifi::sta_state() { WifiStaState::Connected => { // wait until we're no longer connected controller.wait_for_event(WifiEvent::StaDisconnected).await; Timer::after(Duration::from_millis(5000)).await } _ => {} } if !matches!(controller.is_started(), Ok(true)) { let client_config = ModeConfig::Client( ClientConfig::default() .with_ssid(SSID.into()) .with_password(PASSWORD.into()), ); controller.set_config(&client_config).unwrap(); println!("Starting wifi"); controller.start_async().await.unwrap(); println!("Wifi started!"); println!("Scan"); let scan_config = ScanConfig::default().with_max(10); let result = controller .scan_with_config_async(scan_config) .await .unwrap(); for ap in result { println!("{:?}", ap); } } println!("About to connect..."); match controller.connect_async().await { Ok(_) => println!("Wifi connected!"), Err(e) => { println!("Failed to connect to wifi: {:?}", e); Timer::after(Duration::from_millis(5000)).await } } } } #[embassy_executor::task] async fn net_task(mut runner: Runner<'static, WifiDevice<'static>>) { runner.run().await } pub async fn start_wifi( radio_init: &'static esp_radio::Controller<'static>, wifi: esp_hal::peripherals::WIFI<'static>, rng: Rng, spawner: &Spawner, ) -> Stack<'static> { let (wifi_controller, interfaces) = esp_radio::wifi::new(radio_init, wifi, Default::default()) .expect("Failed to initialize Wi-Fi controller"); let wifi_interface = interfaces.sta; let net_seed = rng.random() as u64 | ((rng.random() as u64) << 32); let dhcp_config = DhcpConfig::default(); let net_config = embassy_net::Config::dhcpv4(dhcp_config); // Init network stack let (stack, runner) = embassy_net::new( wifi_interface, net_config, mk_static!(StackResources<3>, StackResources::<3>::new()), net_seed, ); spawner.spawn(connection(wifi_controller)).ok(); spawner.spawn(net_task(runner)).ok(); wait_for_connection(stack).await; stack } async fn wait_for_connection(stack: Stack<'_>) { println!("Waiting for link to be up"); loop { if stack.is_link_up() { break; } Timer::after(Duration::from_millis(500)).await; } println!("Waiting to get IP address..."); loop { if let Some(config) = stack.config_v4() { println!("Got IP: {}", config.address); break; } Timer::after(Duration::from_millis(500)).await; } } }