mqtt-protocol-core
A Sans-I/O style MQTT protocol library for Rust that supports both MQTT v5.0 and v3.1.1.
Features
- Sans-I/O Design: Pure protocol implementation independent of I/O operations
- MQTT v5.0 & v3.1.1 Support: Full compatibility with both protocol versions
- Client & Server (Broker) Support: Can be used to build both MQTT clients and brokers
- Synchronous API: Event-driven architecture where users handle returned events to integrate with I/O
- Automatic Configuration: Automatically configures packets and properties according to MQTT specifications
- Generic Packet ID Support: Supports both u16 (standard) and u32 (extended for broker clusters) packet IDs
Optional Features
- Automatic TopicAlias Application: Automatically applies topic aliases for efficiency
- Automatic TopicAlias Numbering: Manages topic alias assignments automatically
- Automatic Publish Responses: Handles Puback, Pubrec, Pubrel, and Pubcomp responses automatically
- Automatic Pingreq Responses: Automatically responds to ping requests
- Ping Timeout Management: Configurable timeout settings for Pingreq to Pingresp cycles
I/O Integration
This library can be combined with various I/O implementations:
- std::net: For synchronous TCP networking
- tokio: For asynchronous networking
- Any custom I/O: The Sans-I/O design allows integration with any transport layer
Installation
Add this to your Cargo.toml
:
[]
= "0.1.1"
Quick Start
Basic Client Example
use mqtt;
use *;
use ;
use TcpStream;
Subscription Example
use mqtt;
use *;
// Create connection and connect (same as above)
let mut connection = new;
// Subscribe to topic
let packet_id = connection.acquire_packet_id?;
let sub_opts = new.set_qos;
let sub_entry = new?;
let subscribe_packet = builder
.entries
.packet_id
.build?;
let events = connection.checked_send;
// Handle events to send SUBSCRIBE and receive SUBACK...
Architecture
This library follows the Sans-I/O pattern, which means:
- Pure Protocol Logic: The library handles MQTT protocol state and packet processing
- Event-Driven: All I/O operations are communicated through events
- Transport Agnostic: Works with any underlying transport (TCP, WebSocket, etc.)
- User Controls I/O: Your application handles actual network operations
Event Flow
// 1. Create and send packets through connection
let events = connection.checked_send;
// 2. Handle events (your code decides how to do I/O)
for event in events
// 3. When data arrives, feed it to connection
let events = connection.recv;
// Handle resulting events...
Examples
Complete examples can be found in the examples/
directory:
- publish.rs: Connects and publishes a message
- subscribe.rs: Connects and subscribes to receive messages
Run examples with:
MQTT Protocol Support
MQTT v5.0 Features
- Properties support
- Reason codes
- Topic aliases
- User properties
- Session expiry
- Message expiry
- And more...
MQTT v3.1.1 Features
- Full protocol compliance
- QoS levels 0, 1, 2
- Retained messages
- Clean/persistent sessions
- Last Will and Testament (LWT)
Generic Packet ID Support
The library supports generic packet ID types for advanced use cases:
// Standard u16 packet IDs (default)
type Connection = Connection;
// Extended u32 packet IDs (for broker clusters)
type ExtendedConnection = GenericConnection;
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Changelog
See CHANGELOG.md for details about changes in each version.