Skip to main content

bacnet_client/client/
audit.rs

1use super::*;
2
3use bacnet_services::audit::{AuditLogQueryAck, AuditLogQueryRequest, AuditNotificationRequest};
4
5impl<T: TransportPort + 'static> BACnetClient<T> {
6    /// Send a typed ConfirmedAuditNotification to a directly addressed MAC.
7    ///
8    /// The request uses the existing qualified Clause 21 Audit wire model.
9    pub async fn confirmed_audit_notification(
10        &self,
11        destination_mac: &[u8],
12        request: &AuditNotificationRequest,
13    ) -> Result<(), Error> {
14        let mut service_data = BytesMut::new();
15        request.try_encode(&mut service_data)?;
16
17        let _ = self
18            .confirmed_request(
19                destination_mac,
20                ConfirmedServiceChoice::CONFIRMED_AUDIT_NOTIFICATION,
21                &service_data,
22            )
23            .await?;
24
25        Ok(())
26    }
27
28    /// Send a typed UnconfirmedAuditNotification to a directly addressed MAC.
29    ///
30    /// The request uses the existing qualified Clause 21 Audit wire model and
31    /// completes after transport send without waiting for a response.
32    pub async fn unconfirmed_audit_notification(
33        &self,
34        destination_mac: &[u8],
35        request: &AuditNotificationRequest,
36    ) -> Result<(), Error> {
37        let mut service_data = BytesMut::new();
38        request.try_encode(&mut service_data)?;
39
40        self.unconfirmed_request(
41            destination_mac,
42            UnconfirmedServiceChoice::UNCONFIRMED_AUDIT_NOTIFICATION,
43            &service_data,
44        )
45        .await
46    }
47
48    /// Query an Audit Log at a directly addressed MAC and decode its typed ACK.
49    ///
50    /// Request and response use the existing qualified Clause 21 Audit wire
51    /// model; this helper does not reinterpret query fields or execution.
52    pub async fn audit_log_query(
53        &self,
54        destination_mac: &[u8],
55        request: &AuditLogQueryRequest,
56    ) -> Result<AuditLogQueryAck, Error> {
57        let mut service_data = BytesMut::new();
58        request.try_encode(&mut service_data)?;
59
60        let response = self
61            .confirmed_request(
62                destination_mac,
63                ConfirmedServiceChoice::AUDIT_LOG_QUERY,
64                &service_data,
65            )
66            .await?;
67
68        AuditLogQueryAck::decode(&response)
69    }
70}