4 个版本
使用旧的 Rust 2015
0.1.5 | 2018 年 9 月 1 日 |
---|---|
0.1.4 | 2018 年 1 月 23 日 |
0.1.3 | 2018 年 1 月 21 日 |
0.1.2 | 2018 年 1 月 11 日 |
#5 in #mosquitto
1,547 每月下载量
37KB
650 行
Rust 到 Mosquitto MQTT 代理客户端的接口
Mosquitto 是用 C 实现的流行 MQTT 代理。尽管有纯 Rust MQTT 客户端,但仍然需要与 Mosquitto 客户端绑定。
基本思路是连接到代理,订阅感兴趣的主题,并在特定主题上发布消息。消息可以是任意字节,但此实现确实要求主题本身是 UTF-8。C API 基于回调,这些回调映射到 Rust 闭包。
Mosquitto 客户端是线程安全的,因此您可以从一个线程发布消息,并在另一个线程上监听消息。此示例演示了 mosquitto-client 的使用
extern crate mosquitto_client as mosq;
use mosq::Mosquitto;
use std::{thread, time};
fn main() {
let m = Mosquitto::new("test");
m.connect("localhost",1883).expect("can't connect");
m.subscribe("bilbo/#",1).expect("can't subscribe to bonzo");
let mt = m.clone();
thread::spawn(move || {
let timeout = time::Duration::from_millis(500);
for _ in 0..5 {
mt.publish("bilbo/baggins","hello dolly".as_bytes(), 1, false).unwrap();
thread::sleep(timeout);
}
mt.disconnect().unwrap();
});
let mut mc = m.callbacks(0);
mc.on_message(|data,msg| {
println!("bilbo {:?}",msg);
*data += 1;
});
m.loop_until_disconnect(200).expect("broken loop");
println!("received {} messages",mc.data);
}
Mosquitto
结构体是客户端获取的 C 指针的薄包装。它是 Clone + Send + Sync
,因此我们可以将其传递到线程,该线程简单地发布一些字节并等待;在线程结束时,我们明确地断开连接。
Callbacks
处理器结构体是分开的,以避免激怒借用检查器。它通过 callbacks
方法创建,并泛型化某些数据(通过 data
字段访问)。每当发生事件时,回调将传递对该数据的可变引用和特定事件的数据 - 在这种情况下是一个消息结构体。
loop_until_disconnect
是 loop_forever
的相关函数,在显式从代理断开连接时无错误地结束。
先决条件
在 Debian/Ubuntu 系统上,需要安装客户端库 libmosquitto1
(不需要开发包)。(在基于 RPM 的系统上,只需 libmosquitto
即可)。
您还需要代理 mosquitto
软件包进行测试。
对于 MacOS,Mosquitto 通过 brew 提供
brew install mosquitto