mqtt5_protocol/
constants.rs1use crate::PacketType;
7
8pub mod fixed_header {
10 pub const CONNECT: u8 = (super::PacketType::Connect as u8) << 4;
12
13 pub const CONNACK: u8 = (super::PacketType::ConnAck as u8) << 4;
15
16 pub const PUBLISH_BASE: u8 = (super::PacketType::Publish as u8) << 4;
18
19 pub const PUBACK: u8 = (super::PacketType::PubAck as u8) << 4;
21
22 pub const PUBREC: u8 = (super::PacketType::PubRec as u8) << 4;
24
25 pub const PUBREL: u8 = (super::PacketType::PubRel as u8) << 4 | 0x02;
27
28 pub const PUBCOMP: u8 = (super::PacketType::PubComp as u8) << 4;
30
31 pub const SUBSCRIBE: u8 = (super::PacketType::Subscribe as u8) << 4 | 0x02;
33
34 pub const SUBACK: u8 = (super::PacketType::SubAck as u8) << 4;
36
37 pub const UNSUBSCRIBE: u8 = (super::PacketType::Unsubscribe as u8) << 4 | 0x02;
39
40 pub const UNSUBACK: u8 = (super::PacketType::UnsubAck as u8) << 4;
42
43 pub const PINGREQ: u8 = (super::PacketType::PingReq as u8) << 4;
45
46 pub const PINGRESP: u8 = (super::PacketType::PingResp as u8) << 4;
48
49 pub const DISCONNECT: u8 = (super::PacketType::Disconnect as u8) << 4;
51
52 pub const AUTH: u8 = (super::PacketType::Auth as u8) << 4;
54}
55
56pub mod masks {
58 pub const PACKET_TYPE: u8 = 0xF0;
60
61 pub const FLAGS: u8 = 0x0F;
63
64 pub const CONTINUATION_BIT: u8 = 0x80;
66
67 pub const VARIABLE_BYTE_VALUE: u8 = 0x7F;
69}
70
71pub mod packets {
73 pub const PINGREQ_BYTES: [u8; 2] = [super::fixed_header::PINGREQ, 0x00];
75
76 pub const PINGRESP_BYTES: [u8; 2] = [super::fixed_header::PINGRESP, 0x00];
78}
79
80pub mod subscription {
82 pub const QOS_MASK: u8 = 0x03;
84
85 pub const NO_LOCAL_MASK: u8 = 0x04;
87
88 pub const RETAIN_AS_PUBLISHED_MASK: u8 = 0x08;
90
91 pub const RETAIN_HANDLING_MASK: u8 = 0x30;
93
94 pub const RETAIN_HANDLING_SHIFT: u8 = 4;
96
97 pub const RESERVED_BITS_MASK: u8 = 0xC0;
99}
100
101pub mod connect_flags {
103 pub const WILL_QOS_CLEAR_MASK: u8 = !0x18;
105 pub const WILL_QOS_MASK: u8 = 0x03;
107 pub const WILL_QOS_SHIFT: u8 = 3;
109}
110
111pub mod limits {
113 pub const MAX_STRING_LENGTH: u16 = u16::MAX;
115
116 pub const MAX_CLIENT_ID_LENGTH: usize = 128;
118
119 pub const MAX_PACKET_SIZE: u32 = 268_435_456;
121
122 pub const MAX_BINARY_LENGTH: u32 = 65_536;
124}
125
126pub mod time {
128 use crate::time::Duration;
129
130 pub const DEFAULT_SESSION_EXPIRY: Duration = Duration::from_secs(3600);
132
133 pub const DEFAULT_KEEP_ALIVE: Duration = Duration::from_secs(60);
135}
136
137pub mod buffer {
139 pub const DEFAULT_CAPACITY: usize = 1024;
141
142 pub const DEFAULT_BUFFER_SIZE: usize = 2048;
144
145 pub const LARGE_BUFFER_SIZE: usize = 4096;
147
148 pub const MAX_BUFFER_SIZE: usize = 8192;
150
151 pub const VERY_LARGE_BUFFER_SIZE: usize = 16384;
153
154 pub const HUGE_BUFFER_SIZE: usize = 32768;
156}
157
158pub mod variable_byte {
160 pub const SINGLE_BYTE_MAX: u8 = 127;
162
163 pub const MAX_VALUE: u32 = 268_435_455;
165}
166
167pub mod version {
169 pub const MQTT_V5: u8 = 5;
171}
172
173pub mod publish_flags {
175 pub const QOS_CLEAR_MASK: u8 = !0x06;
177 pub const QOS_MASK: u8 = 0x03;
179 pub const QOS_SHIFT: u8 = 1;
181}
182
183#[cfg(test)]
184mod tests {
185 use super::*;
186
187 #[test]
188 fn test_fixed_header_values() {
189 assert_eq!(fixed_header::CONNECT, 0x10);
190 assert_eq!(fixed_header::CONNACK, 0x20);
191 assert_eq!(fixed_header::PUBLISH_BASE, 0x30);
192 assert_eq!(fixed_header::PINGREQ, 0xC0);
193 assert_eq!(fixed_header::PINGRESP, 0xD0);
194 }
195
196 #[test]
197 fn test_packets() {
198 assert_eq!(packets::PINGREQ_BYTES, [0xC0, 0x00]);
199 assert_eq!(packets::PINGRESP_BYTES, [0xD0, 0x00]);
200 }
201}