Expand description
Mesh Topology Management
This module provides mesh topology management for PEAT-BTLE, including:
- Topology tracking: Parent/child/peer relationships
- Connection management: Connect, disconnect, failover
- Message routing: Upward aggregation, downward dissemination
- RSSI-based selection: Best parent/peer selection
§Architecture
┌─────────────────────────────────────────────────────────┐
│ MeshManager │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Topology │ │ Router │ │ Parent Failover │ │
│ │ State │ │ │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────┐
│ TopologyEvents │
│ • ParentConnected │
│ • ChildConnected │
│ • TopologyChanged │
└──────────────────────────────┘§Usage
ⓘ
use peat_btle::mesh::{MeshManager, TopologyConfig, TopologyEvent};
use peat_btle::{NodeId, HierarchyLevel};
// Create mesh manager
let manager = MeshManager::new(
NodeId::new(0x12345678),
HierarchyLevel::Platform,
TopologyConfig::default(),
);
// Register for topology events
manager.on_topology_event(Box::new(|event| {
match event {
TopologyEvent::ParentConnected { node_id, .. } => {
println!("Connected to parent: {}", node_id);
}
_ => {}
}
}));
// Start the manager
manager.start()?;
// Process discovered beacons
manager.process_beacon(&beacon, rssi);
// Select and connect to best parent
if let Some(candidate) = manager.select_best_parent() {
manager.connect_parent(candidate.node_id, candidate.level, candidate.rssi)?;
}§Parent Failover
When parent connection is lost:
start_failover()is called- Manager enters
Failoverstate ParentFailoverStartedevent is emitted- Application scans for new parent candidates
complete_failover()connects to new parent (or gives up)ParentFailoverCompletedevent is emitted
§Message Routing
The MeshRouter provides routing decisions:
- Upward: To parent (aggregation)
- Downward: To children (dissemination)
- Broadcast: To all connected peers
- Targeted: To a specific node
ⓘ
use peat_btle::mesh::{MeshRouter, RouteDirection};
let router = MeshRouter::new(node_id, my_level);
let topology = manager.topology();
let decision = router.route(RouteDirection::Upward, &topology);
if decision.routed {
for next_hop in decision.next_hops {
send_to(&next_hop, &message);
}
}Structs§
- HopTracker
- Message hop tracking for loop prevention
- Mesh
Manager - Manages the BLE mesh topology
- Mesh
Router - Router for mesh messages
- Mesh
Topology - Current mesh topology state
- Parent
Candidate - Candidate for parent selection
- Peer
Info - Information about a peer in the mesh
- Route
Decision - A routing decision for a message
- Topology
Config - Configuration for topology management
Enums§
- Connection
State - State of a connection to a peer
- Disconnect
Reason - Reason for a disconnection
- Manager
State - Mesh manager state
- Peer
Role - Role of a peer in the mesh topology
- Route
Direction - Message routing direction
- Route
Failure - Reason for routing failure
- Topology
Event - Events that occur when the mesh topology changes
Type Aliases§
- Topology
Callback - Callback type for topology events