Crate mosquitto_client[][src]

Mosquitto is a popular MQTT broker implemented in C. Although there are pure Rust MQTT clients, it is still useful to have a binding to the Mosquitto client.

The basic story is that you connect to a broker, subscribing to topics that interest you and publishing messages on a particular topic. The messages may be any arbitrary bytes, but this implementation does require that the topics themselves be UTF-8. The C API is based on callbacks, which are mapped onto Rust closures. Everything starts with Mosquitto.

For example, publishing a message and confirming that it is sent:

let m = mosquitto_client::Mosquitto::new("test");

m.connect("localhost",1883)?;

// publish and get a message id
let our_mid = m.publish("bonzo/dog","hello dolly".as_bytes(), 2, false)?;

// and wait for confirmation for that message id
let mut mc = m.callbacks(());
mc.on_publish(|_,mid| {
    if mid == our_mid {
        m.disconnect().unwrap();
    }
});

// wait forever until explicit disconnect
// -1 means use default timeout on operations
m.loop_until_disconnect(-1)?;

Here we subscribe and listen to several topics:

let m = mosquitto_client::Mosquitto::new("test");

m.connect("localhost",1883)?;
let bonzo = m.subscribe("bonzo/#",0)?;
let frodo = m.subscribe("frodo/#",0)?;

let mut mc = m.callbacks(());
mc.on_message(|_,msg| {
    if ! msg.retained() { // not interested in any retained messages!
        if bonzo.matches(&msg) {
            println!("bonzo {:?}",msg);
        } else
        if frodo.matches(&msg) {
            println!("frodo {:?}",msg);
        }
    }
});

m.loop_forever(200)?;

You can always just do a regular match on the recevied topic name from the MosqMessage topic method.

The callbacks method can be given a value, and the first argument of any callback will be a mutable reference to that value (this avoids the usual shenanigans involved with closures having mutable borrows)

use std::{thread,time};

let m = mosquitto_client::Mosquitto::new("test");

m.connect("localhost",1883)?;
m.subscribe("bilbo/#",1)?;

let mt = m.clone();
thread::spawn(move || {
    let timeout = time::Duration::from_millis(500);
    for i in 0..5 {
        let msg = format!("hello #{}",i+1);
        mt.publish("bilbo/baggins",msg.as_bytes(), 1, false).unwrap();
        thread::sleep(timeout);
    }
    mt.disconnect().unwrap();
});

let mut mc = m.callbacks(Vec::new());
mc.on_message(|data,msg| {
    data.push(msg.text().to_string());
});

m.loop_until_disconnect(200)?;
assert_eq!(mc.data.len(),5);

Modules

sys

Structs

Callbacks

Handling mosquitto callbacks. This will pass a mutable reference to the contained data to the callbacks.

Error

Our Error type. Covers both regular Mosquitto errors and connection errors.

MosqMessage

A mosquitto message

Mosquitto

Mosquitto client

TopicMatcher

Matching subscription topics. Returned from Mosquitto::subscribe.

Version

Mosquitto version

Functions

version

get version of the mosquitto client

Type Definitions

Result