use std::collections::HashMap;
use std::sync::Arc;
use std::time::Duration;
use hive_discovery::{
DiscoveryEvent, DiscoveryImplementation, LocalServiceConfig, create_discovery_service,
};
use log::{debug, info, warn};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
let provider = create_provider_service()?;
provider.register_service()?; info!("提供者服务已注册");
provider.start_discovery()?; info!("提供者发现已启动");
tokio::time::sleep(Duration::from_secs(1)).await;
let discoverer_service = create_discoverer_config_only()?;
discoverer_service.register_service()?;
info!("发现者服务已注册 (用于自过滤)");
let mut receiver = discoverer_service.subscribe();
info!("发现者已订阅事件");
discoverer_service.start_discovery()?;
info!("发现者发现已启动");
tokio::spawn(async move {
while let Ok(event) = receiver.recv().await {
match event {
DiscoveryEvent::ServiceFound(service) => {
info!(
"发现服务: {} ({})",
service.instance_name, service.service_type
);
debug!("服务详情: {:?}", service);
}
DiscoveryEvent::ServiceLost(name) => {
warn!("服务离线: {}", name);
}
DiscoveryEvent::DiscoveryStarted => {
info!("服务发现已启动");
}
DiscoveryEvent::DiscoveryStopped => {
warn!("服务发现已停止");
}
}
}
});
info!("服务发现示例运行中...");
tokio::time::sleep(Duration::from_secs(30)).await;
info!("关闭服务发现示例...");
provider.shutdown()?;
discoverer_service.shutdown()?;
info!("示例程序已结束");
Ok(())
}
fn create_provider_service()
-> Result<Arc<dyn hive_discovery::DiscoveryService>, Box<dyn std::error::Error>> {
info!("创建服务提供者...");
let mut properties = HashMap::new();
properties.insert("device_id".to_string(), "provider-123456".to_string());
properties.insert("device_name".to_string(), "示例提供者".to_string());
properties.insert("version".to_string(), "1.0.0".to_string());
properties.insert("description".to_string(), "示例服务提供者".to_string());
properties.insert("capability".to_string(), "file-sharing".to_string());
let config = LocalServiceConfig {
service_type: "_hive-example._tcp.local.".to_string(),
port: 8080,
instance_name: "HiveExampleProvider".to_string(),
properties: Some(properties),
service_ttl: 60,
mdns_response_delay_ms: (20, 120),
refresh_interval: 30,
};
let service = create_discovery_service(DiscoveryImplementation::Mdns, config)?;
Ok(service)
}
fn create_discoverer_config_only()
-> Result<Arc<dyn hive_discovery::DiscoveryService>, Box<dyn std::error::Error>> {
info!("创建服务发现者实例 (仅配置)...");
let mut properties = HashMap::new();
properties.insert("device_id".to_string(), "discoverer-654321".to_string());
properties.insert("device_name".to_string(), "示例发现者".to_string());
properties.insert("version".to_string(), "1.0.0".to_string());
let config = LocalServiceConfig {
service_type: "_hive-example._tcp.local.".to_string(),
port: 8081, instance_name: "HiveExampleDiscoverer".to_string(),
properties: Some(properties),
service_ttl: 60,
mdns_response_delay_ms: (20, 120),
refresh_interval: 30,
};
let service = create_discovery_service(DiscoveryImplementation::Mdns, config)?;
info!("服务发现者实例已创建");
Ok(service)
}