1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//! Rumqtt is a pure rust mqtt client which strives to be robust, efficient
//! and easy to use.
//! * Provides several reconnection options to automate reconnections
//! * All the network requests are done using channels and bad networks can
//! be detected through back pressure
//! * Incoming notifications are delivered to the user through crossbeam channel
//! which provides a flexible `select!` macro
//! * Clone the client to access mqtt eventloop from multiple threads
//! * Dynamically start and stop the network eventloop (Useful when you want the other network services to have more bandwidth)
//! * Inbuilt support for connecting to gcloud iot core which uses jwt tokens
//! as password to authenticate the client
//! * Inbuilt support fot throttling (Saas IOT providers usually impose rate limiting)
//! * Http `connect` support to tunnel mqtt data through http proxy servers
//!
//! ## Publish and subscribe
//! ```no_run
//! use rumqtt::{MqttClient, MqttOptions, QoS};
//! use std::{thread, time::Duration};
//!
//! fn main() {
//! let mqtt_options = MqttOptions::new("test-pubsub1", "localhost", 1883);
//! let (mut mqtt_client, notifications) = MqttClient::start(mqtt_options).unwrap();
//!
//! mqtt_client.subscribe("hello/world", QoS::AtLeastOnce).unwrap();
//! let sleep_time = Duration::from_secs(1);
//! thread::spawn(move || {
//! for i in 0..100 {
//! let payload = format!("publish {}", i);
//! thread::sleep(sleep_time);
//! mqtt_client.publish("hello/world", QoS::AtLeastOnce, false, payload).unwrap();
//! }
//! });
//!
//! for notification in notifications {
//! println!("{:?}", notification)
//! }
//! }
//! ```
//!
//!
//! ## Select on incoming notifications using crossbeam select!
//! ```no_run
//! use rumqtt::{MqttClient, MqttOptions, QoS};
//! use std::{thread, time::Duration};
//! use crossbeam_channel::select;
//!
//! fn main() {
//! let mqtt_options = MqttOptions::new("test-pubsub1", "localhost", 1883);
//! let (mut mqtt_client, notifications) = MqttClient::start(mqtt_options).unwrap();
//! let (done_tx, done_rx) = crossbeam_channel::bounded(1);
//!
//! mqtt_client.subscribe("hello/world", QoS::AtLeastOnce).unwrap();
//! let sleep_time = Duration::from_secs(1);
//! thread::spawn(move || {
//! for i in 0..100 {
//! let payload = format!("publish {}", i);
//! thread::sleep(sleep_time);
//! mqtt_client.publish("hello/world", QoS::AtLeastOnce, false, payload).unwrap();
//! }
//!
//! thread::sleep(sleep_time * 10);
//! done_tx.send(true).unwrap();
//! });
//!
//! // select between mqtt notifications and other channel rx
//! loop {
//! select! {
//! recv(notifications) -> notification => {
//! println!("{:?}", notification)
//! }
//! recv(done_rx) -> _done => break
//! }
//! }
//! }
//! ```
//!
//! ## Clone the client to access mqtt eventloop from different threads
//! ```no_run
//! use rumqtt::{MqttClient, MqttOptions, QoS};
//! use std::{thread, time::Duration};
//!
//! fn main() {
//! let mqtt_options = MqttOptions::new("test-pubsub1", "localhost", 1883);
//! let (mut mqtt_client, notifications) = MqttClient::start(mqtt_options).unwrap();
//! let mut c1 = mqtt_client.clone();
//! let mut c2 = mqtt_client.clone();
//!
//! mqtt_client.subscribe("hello/world", QoS::AtLeastOnce).unwrap();
//! let sleep_time = Duration::from_secs(1);
//! thread::spawn(move || {
//! for i in 0..100 {
//! let payload = format!("publish {}", i);
//! thread::sleep(sleep_time);
//! c1.publish("hello/world", QoS::AtLeastOnce, false, payload).unwrap();
//! }
//! });
//!
//! // pause and resume network from this thread
//! thread::spawn(move || {
//! let dur = Duration::new(5, 0);
//! for i in 0..100 {
//! if i % 2 == 0 { c2.pause().unwrap() } else { c2.resume().unwrap() }
//! thread::sleep(dur);
//! }
//! });
//!
//! // receive incoming notifications
//! for notification in notifications {
//! println!("{:?}", notification)
//! }
//! }
//! ```
extern crate log;
pub use crate;
pub use crate;
pub use crate;
pub use Receiver;
pub use *;