oxigdal_mqtt/lib.rs
1//! OxiGDAL MQTT - MQTT Protocol Support for IoT and Geospatial Data
2//!
3//! This crate provides comprehensive MQTT protocol support for OxiGDAL, enabling
4//! real-time IoT sensor data integration, pub/sub messaging, and geospatial data streaming.
5//!
6//! # Features
7//!
8//! - **MQTT 3.1.1 and 5.0** protocol support
9//! - **QoS levels** 0, 1, and 2 (at-most-once, at-least-once, exactly-once)
10//! - **Async client** with automatic reconnection
11//! - **Publisher** with batch publishing and persistence
12//! - **Subscriber** with topic routing and message handlers
13//! - **IoT integration** for sensor data, geospatial messages, and time-series
14//! - **Pure Rust** implementation (COOLJAPAN Policy compliant)
15//!
16//! # Examples
17//!
18//! ## Basic Publisher
19//!
20//! ```no_run
21//! use oxigdal_mqtt::client::{ClientConfig, MqttClient};
22//! use oxigdal_mqtt::publisher::{Publisher, PublisherConfig};
23//! use oxigdal_mqtt::types::{ConnectionOptions, Message, QoS};
24//! use std::sync::Arc;
25//!
26//! #[tokio::main]
27//! async fn main() -> oxigdal_mqtt::error::Result<()> {
28//! // Create connection options
29//! let conn_opts = ConnectionOptions::new("mqtt://localhost", 1883, "publisher-1");
30//!
31//! // Create and connect client
32//! let client_config = ClientConfig::new(conn_opts);
33//! let mut client = MqttClient::new(client_config)?;
34//! client.connect().await?;
35//!
36//! // Create publisher
37//! let pub_config = PublisherConfig::new().with_qos(QoS::AtLeastOnce);
38//! let publisher = Publisher::new(Arc::new(client), pub_config);
39//!
40//! // Publish message
41//! publisher.publish_simple("sensor/temperature", b"25.5").await?;
42//!
43//! Ok(())
44//! }
45//! ```
46//!
47//! ## Basic Subscriber
48//!
49//! ```no_run
50//! use oxigdal_mqtt::client::{ClientConfig, MqttClient};
51//! use oxigdal_mqtt::subscriber::{Subscriber, SubscriberConfig};
52//! use oxigdal_mqtt::types::{ConnectionOptions, QoS, TopicFilter};
53//! use std::sync::Arc;
54//!
55//! #[tokio::main]
56//! async fn main() -> oxigdal_mqtt::error::Result<()> {
57//! // Create and connect client
58//! let conn_opts = ConnectionOptions::new("mqtt://localhost", 1883, "subscriber-1");
59//! let client_config = ClientConfig::new(conn_opts);
60//! let mut client = MqttClient::new(client_config)?;
61//! client.connect().await?;
62//!
63//! // Create subscriber
64//! let sub_config = SubscriberConfig::new();
65//! let subscriber = Subscriber::new(Arc::new(client), sub_config);
66//!
67//! // Subscribe to topic
68//! let filter = TopicFilter::new("sensor/+/temperature", QoS::AtLeastOnce);
69//! subscriber.subscribe_callback(filter, |msg| {
70//! println!("Received: {:?}", msg.payload_str());
71//! Ok(())
72//! }).await?;
73//!
74//! // Keep running
75//! tokio::signal::ctrl_c().await.ok();
76//!
77//! Ok(())
78//! }
79//! ```
80//!
81//! ## IoT Sensor Data
82//!
83//! ```no_run
84//! use oxigdal_mqtt::iot::{SensorData, SensorType, IotPublisher};
85//! use oxigdal_mqtt::client::{ClientConfig, MqttClient};
86//! use oxigdal_mqtt::publisher::{Publisher, PublisherConfig};
87//! use oxigdal_mqtt::types::ConnectionOptions;
88//! use std::sync::Arc;
89//!
90//! #[tokio::main]
91//! async fn main() -> oxigdal_mqtt::error::Result<()> {
92//! // Setup client and publisher
93//! let conn_opts = ConnectionOptions::new("mqtt://localhost", 1883, "iot-device-1");
94//! let client_config = ClientConfig::new(conn_opts);
95//! let mut client = MqttClient::new(client_config)?;
96//! client.connect().await?;
97//!
98//! let pub_config = PublisherConfig::new();
99//! let publisher = Arc::new(Publisher::new(Arc::new(client), pub_config));
100//!
101//! // Create IoT publisher
102//! let iot_pub = IotPublisher::new(publisher, "devices/{device_id}/{message_type}");
103//!
104//! // Publish sensor data
105//! let sensor_data = SensorData::new("sensor-001", SensorType::Temperature, 25.5.into())
106//! .with_quality(0.95);
107//!
108//! iot_pub.publish_sensor(sensor_data).await?;
109//!
110//! Ok(())
111//! }
112//! ```
113
114#![cfg_attr(not(feature = "std"), no_std)]
115#![warn(missing_docs)]
116#![warn(clippy::all)]
117#![deny(clippy::unwrap_used)]
118#![deny(clippy::panic)]
119#![allow(clippy::module_name_repetitions)]
120
121#[cfg(feature = "std")]
122extern crate std;
123
124pub mod client;
125pub mod error;
126pub mod iot;
127pub mod publisher;
128pub mod subscriber;
129pub mod types;
130
131// Re-export commonly used items
132pub use client::{ClientConfig, MqttClient};
133pub use error::{MqttError, Result};
134pub use publisher::{Publisher, PublisherConfig};
135pub use subscriber::{Subscriber, SubscriberConfig};
136pub use types::{Message, QoS, TopicFilter};
137
138/// Crate version
139pub const VERSION: &str = env!("CARGO_PKG_VERSION");
140
141/// Crate name
142pub const NAME: &str = env!("CARGO_PKG_NAME");
143
144#[cfg(test)]
145mod tests {
146 use super::*;
147
148 #[test]
149 fn test_version() {
150 assert!(!VERSION.is_empty());
151 assert_eq!(NAME, "oxigdal-mqtt");
152 }
153}