diff --git a/src/lib.rs b/src/lib.rs index 956de5c..9a88e87 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -52,7 +52,7 @@ use rs_matter::transport::network::btp::{AdvData, Btp}; use rs_matter::transport::network::mdns::zeroconf::ZeroconfMdnsResponder; use rs_matter::transport::network::wifi::wpa_supp::unix::DhClientCtl; use rs_matter::transport::network::wifi::wpa_supp::WpaSuppCtl; -use rs_matter::transport::network::NoNetwork; +use rs_matter::transport::network::{Address, ChainedNetwork}; use rs_matter::transport::MATTER_SOCKET_BIND_ADDR; use rs_matter::utils::select::Coalesce; use rs_matter::utils::storage::pooled::PooledBuffers; @@ -67,6 +67,8 @@ const DEFAULT_CREDS_DIR: &str = "./creds"; const DEFAULT_WIFI_IFACE: &str = "wlan0"; const LIGHT_ENDPOINT_ID: u16 = 1; const KV_BUF_SIZE: usize = 4096; +const BLE_SERVICE_NAME: &str = "TOES"; +const COMMISSIONING_HANDOFF_SECS: u64 = 20; const DEV_TYPE_EXTENDED_COLOR_LIGHT: rs_matter::dm::DeviceType = rs_matter::dm::DeviceType { dtype: 0x010d, @@ -360,28 +362,58 @@ where let btp = Btp::new(); btp.set_relaxed_mtu_nego(true); + let udp = async_io::Async::::bind(MATTER_SOCKET_BIND_ADDR)?; + let mut mdns_responder = ZeroconfMdnsResponder::new(); + let mut mdns = pin!(mdns_responder.run(&matter)); + let adv_data = AdvData::new(&TEST_DEV_DET, comm.discriminator); let mut bluetooth = pin!(bluez::run_peripheral( - connection, None, "TOES", &adv_data, &btp + connection, + None, + BLE_SERVICE_NAME, + &adv_data, + &btp, )); - let mut transport = pin!(matter.run(&crypto, &btp, &btp, NoNetwork)); - let mut wifi_prov_task = pin!(async { + let mut transport = pin!(matter.run( + &crypto, + ChainedNetwork::new(Address::is_udp, &udp, &btp), + ChainedNetwork::new(Address::is_udp, &udp, &btp), + &udp, + )); + info!("Running Matter over concurrent BLE commissioning and IP transport"); + + let mut commissioning_done_task = pin!(async { NetCtlState::wait_prov_ready(&net_ctl_state, &btp).await; + info!("Wi-Fi credentials accepted; waiting for Matter fabric setup"); + + while !matter.is_commissioned() { + embassy_time::Timer::after_secs(1).await; + } + + info!( + "Matter fabric added; keeping BLE/IP commissioning transports alive for {}s handoff", + COMMISSIONING_HANDOFF_SECS + ); + embassy_time::Timer::after_secs(COMMISSIONING_HANDOFF_SECS).await; + Ok(()) }); - select4( + let mut matter_tasks = pin!(select4( &mut transport, &mut bluetooth, - &mut wifi_prov_task, + &mut mdns, select(&mut respond, &mut dm_job).coalesce(), ) - .coalesce() - .await?; + .coalesce()); + + select(&mut matter_tasks, &mut commissioning_done_task) + .coalesce() + .await?; matter.reset_transport()?; - info!("Wi-Fi provisioning completed; call toes_matter::listen().await next"); + info!("Matter provisioning completed; call toes_matter::listen().await next"); Ok(()) }