Skip to main content

mabi_bacnet/
lib.rs

1//! # mabi-bacnet
2//!
3//! BACnet/IP simulator for the OTSIM protocol simulator.
4//!
5//! This crate provides:
6//! - BACnet/IP server implementation with UDP networking
7//! - BACnet object model (AI, AO, BI, BO, AV, BV, MSI, MSO, MSV, Device)
8//! - Property services (ReadProperty, WriteProperty, ReadPropertyMultiple, WritePropertyMultiple)
9//! - COV subscriptions and notifications
10//! - Device discovery (Who-Is/I-Am)
11//! - BBMD (BACnet Broadcast Management Device) for cross-subnet communication
12//! - APDU segmentation for large message handling
13//!
14//! ## Architecture
15//!
16//! The crate follows a layered architecture:
17//!
18//! ```text
19//! ┌─────────────────────────────────────────────────────────────┐
20//! │                     BACnet Server                           │
21//! │       (Server, Device Management, Event Handling)          │
22//! └─────────────────────────────────────────────────────────────┘
23//!                              │
24//!           ┌──────────────────┼──────────────────┐
25//!           ▼                  ▼                  ▼
26//! ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
27//! │  Service Layer  │ │  Object Model   │ │      BBMD       │
28//! │ (Handler Reg.)  │ │ (Registry)      │ │ (Cross-subnet)  │
29//! └─────────────────┘ └─────────────────┘ └─────────────────┘
30//!           │                  │
31//!           ▼                  ▼
32//! ┌─────────────────┐ ┌─────────────────┐
33//! │   APDU Layer    │ │ Property Store  │
34//! │ (Segmentation)  │ │ (DashMap-based) │
35//! └─────────────────┘ └─────────────────┘
36//!           │
37//!           ▼
38//! ┌─────────────────────────────────────────────────────────────┐
39//! │                    Network Layer                            │
40//! │             (UDP, BVLC, NPDU handling)                     │
41//! └─────────────────────────────────────────────────────────────┘
42//! ```
43//!
44//! ## Quick Start
45//!
46//! ```rust,ignore
47//! use mabi_bacnet::prelude::*;
48//!
49//! // Create object registry
50//! let mut registry = ObjectRegistry::new();
51//!
52//! // Add analog input object
53//! let ai = AnalogInput::new(1, "Zone Temperature");
54//! ai.set_value(72.5);
55//! registry.register(Arc::new(ai));
56//!
57//! // Create and run server
58//! let config = ServerConfig::new(1234);
59//! let server = BACnetServer::new(config, registry);
60//!
61//! server.run().await?;
62//! ```
63
64pub mod apdu;
65pub mod config;
66pub mod device;
67pub mod error;
68pub mod network;
69pub mod object;
70pub mod server;
71pub mod service;
72
73// Prelude for common imports
74pub mod prelude {
75    pub use crate::apdu::encoding::{ApduDecoder, ApduEncoder};
76    pub use crate::apdu::types::{
77        AbortReason, ApduType, ConfirmedService, ErrorClass, ErrorCode, RejectReason,
78        UnconfirmedService,
79    };
80    pub use crate::config::BacnetServerConfig;
81    pub use crate::device::BacnetDevice;
82    pub use crate::error::{BacnetError, BacnetResult};
83    pub use crate::network::bvlc::{BvlcFunction, BvlcMessage};
84    pub use crate::network::npdu::{Npdu, NpduControl, Priority};
85    pub use crate::network::udp::{BACnetNetwork, NetworkConfig, NetworkHandle};
86    pub use crate::object::property::{BACnetValue, PropertyId, PropertyStore, SegmentationSupport, StatusFlags};
87    pub use crate::object::registry::{
88        default_object_descriptors, ObjectRegistry, ObjectTypeDescriptor, RegistryError,
89    };
90    pub use crate::object::standard::{
91        AnalogInput, AnalogOutput, AnalogValue, BinaryInput, BinaryOutput, BinaryValue,
92        MultiStateInput, MultiStateOutput, MultiStateValue,
93    };
94    pub use crate::object::device::{
95        BACnetDateTime, CommunicationControlState, DeviceObject, DeviceObjectConfig,
96        DeviceSystemStatus,
97    };
98    pub use crate::object::traits::{ArcObject, BACnetObject, CovSupport, ObjectBuilder, WritableObject};
99    pub use crate::object::types::{ObjectId, ObjectType};
100    pub use crate::server::{BACnetServer, ServerConfig, ServerEvent, ServerMetrics};
101    pub use crate::service::cov::{CovManager, CovNotification, CovSubscription};
102    pub use crate::service::discovery::{DiscoveryService, IAmResponse, WhoIsRequest};
103    pub use crate::service::handler::{
104        ConfirmedServiceHandler, ServiceContext, ServiceRegistry, ServiceResult,
105        UnconfirmedServiceHandler,
106    };
107    pub use crate::service::property::{PropertyService, ReadPropertyRequest, WritePropertyRequest};
108    pub use crate::service::tsm::{ServerTsm, TransactionKey, TsmConfig, TsmStatistics};
109    pub use crate::service::property_multiple::{
110        ReadPropertyMultipleRequest, WritePropertyMultipleRequest,
111        ReadPropertyMultipleHandler, WritePropertyMultipleHandler,
112        PropertyReference, PropertyAccessResult,
113    };
114    pub use crate::service::read_range::{ReadRangeHandler, ReadRangeRequest, RangeType};
115    // File access services
116    pub use crate::service::file_access::{
117        AtomicReadFileHandler, AtomicWriteFileHandler,
118        AtomicReadFileRequest, AtomicWriteFileRequest,
119    };
120    // File object
121    pub use crate::object::file::{FileAccessMethod, FileObject};
122    // EventEnrollment + NotificationClass objects
123    pub use crate::object::event_enrollment::{
124        EventEnrollment, EventNotification, EventTransitionBits, EventType,
125        NotificationClass, NotificationRecipient, NotifyType,
126    };
127    // Alarm services
128    pub use crate::service::alarm::{
129        AcknowledgeAlarmHandler, ConfirmedEventNotificationHandler,
130        GetAlarmSummaryHandler, GetEnrollmentSummaryHandler, GetEventInformationHandler,
131    };
132    // CreateObject/DeleteObject services
133    pub use crate::service::create_delete::{
134        CreateObjectHandler, DeleteObjectHandler, ObjectFactory,
135        CreateObjectRequest, DeleteObjectRequest, default_object_factory,
136    };
137    // COV subscription services
138    pub use crate::service::subscribe_cov::{SubscribeCovHandler, SubscribeCovPropertyHandler};
139    // Device control services
140    pub use crate::service::device_control::{
141        TimeSynchronizationHandler, UtcTimeSynchronizationHandler,
142        DeviceCommunicationControlHandler, ReinitializeDeviceHandler,
143        EnableDisable, ReinitializedState,
144    };
145    // Schedule + Calendar objects
146    pub use crate::object::schedule::{
147        Calendar, CalendarEntry, DateRange, ObjectPropertyReference, Schedule, SpecialEvent,
148        SpecialEventPeriod, TimeValue,
149    };
150    // TrendLog object
151    pub use crate::object::trend_log::{
152        DeviceObjectPropertyReference, LogDatum, LogRecord, LogStatus, LogTimestamp, TrendLog,
153    };
154    // Network layer extensions
155    pub use crate::network::bbmd::{Bbmd, BbmdConfig, BroadcastDistributionTable, ForeignDeviceTable};
156    // APDU segmentation (SegmentationSupport already exported from object::property)
157    pub use crate::apdu::segmentation::{
158        SegmentAssembler, SegmentTransmitter,
159    };
160}
161
162// Legacy re-exports for backwards compatibility
163pub use config::BacnetServerConfig;
164pub use device::BacnetDevice;
165pub use error::{BacnetError, BacnetResult};