use auto_discovery::{
config::DiscoveryConfig,
service::ServiceInfo,
types::{ServiceType, ProtocolType},
ServiceDiscovery,
};
use std::time::Duration;
use tracing::info;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
info!("Starting cross-protocol discovery example");
let config = DiscoveryConfig::new()
.with_timeout(Duration::from_secs(10))
.with_verify_services(true)
.with_service_type(ServiceType::new("_http._tcp")?) .with_service_type(ServiceType::new("_ssh._tcp")?) .with_protocol(ProtocolType::Mdns)
.with_protocol(ProtocolType::Upnp)
.with_protocol(ProtocolType::DnsSd)
.with_cross_protocol(true);
info!("Configuration created with multiple protocols enabled");
let discovery = ServiceDiscovery::new(config).await?;
info!("Service discovery created with cross-protocol support");
let service = ServiceInfo::new(
"Cross-Protocol Web Service",
"_http._tcp",
8080,
Some(vec![
("version", "1.0"),
("protocol", "multi"),
("discovery", "cross-protocol"),
])
)?;
info!("Registering service: {}", service.name());
discovery.register_service(service.clone()).await?;
info!("Service registered successfully");
info!("Discovering services via mDNS...");
let mdns_services = discovery.discover_services(Some(ProtocolType::Mdns)).await?;
info!("Found {} services via mDNS", mdns_services.len());
for service in &mdns_services {
info!(" mDNS: {} at {}:{}", service.name(), service.address(), service.port());
}
info!("Discovering services via UPnP...");
let upnp_services = discovery.discover_services(Some(ProtocolType::Upnp)).await?;
info!("Found {} services via UPnP", upnp_services.len());
for service in &upnp_services {
info!(" UPnP: {} at {}:{}", service.name(), service.address(), service.port());
}
info!("Discovering services across all protocols...");
let all_services = discovery.discover_services(None).await?;
info!("Found {} total services across all protocols", all_services.len());
let mut protocol_counts = std::collections::HashMap::new();
for service in &all_services {
let count = protocol_counts.entry(service.protocol_type()).or_insert(0);
*count += 1;
}
info!("Services by protocol:");
for (protocol, count) in protocol_counts {
info!(" {:?}: {} services", protocol, count);
}
let mut service_names = std::collections::HashMap::new();
for service in &all_services {
let protocols = service_names.entry(service.name().to_string()).or_insert(Vec::new());
protocols.push(service.protocol_type());
}
info!("Services discoverable via multiple protocols:");
for (name, protocols) in service_names {
if protocols.len() > 1 {
info!(" {}: {:?}", name, protocols);
}
}
discovery.unregister_service(&service).await?;
info!("Service unregistered");
Ok(())
}