14个版本

0.1.14 2024年7月30日
0.1.13 2024年5月22日
0.1.11 2024年1月10日
0.1.10 2023年12月12日
0.1.5 2023年4月27日

#1 in #retain

Download history 94/week @ 2024-04-16 47/week @ 2024-04-23 128/week @ 2024-05-21 24/week @ 2024-07-02 224/week @ 2024-07-30

每月下载量224次

Apache-2.0

125KB
3K SLoC

walle_mqtt_protocol

快速开始

一个用Rust实现的mqtt协议解析库

let connect = MqttMessageBuilder::connect()
        .client_id("client_01")
        .keep_alive(10)
        .clean_session(true)
        .username("rump")
        .password("mq")
        .protocol_level(crate::MqttVersion::V4)
        .retain(false)
        .will_qos(crate::QoS::AtLeastOnce)
        .will_topic("/a")
        .will_message(Bytes::from_static(b"offline"))
        .build().unwarp();

MqttMessageBuilder: 是MQTT报文的构建器,提供了多种MQTT报文的构建方式。 MqttMessageBuilder没有具体的属性,MqttMessageBuilder提供了其他具体Builder的方法,例如:

pub fn connect() -> ConnectBuilder {
    ConnectBuilder::new()
}

编码器和解码器

/// 编码
pub trait Encoder: Sync + Send + 'static {
    fn encode(&self, buffer: &mut BytesMut) -> Result<usize, ProtoError>;
}

/// 解码
pub trait Decoder: Sync + Send + 'static {
    // 定义的返回类型
    type Item;
    type Error;
    // 将bytes解析为对应的报文
    fn decode(bytes: Bytes) -> Result<Self::Item, Self::Error>;
}

编码器和解码器实现了Bytes和Mqtt报文的相互转换,每种MQTT报文类型都实现了编码器和解码器,以Connect报文为例:

fn encode_and_decode_for_connect_should_be_work() {
    let connect = build_connect().unwrap();
    println!("原始connect = {:?}", connect);
    let mut bytes = BytesMut::new();
    let mut bytes1 = BytesMut::new();
    // encoder
    connect.encode(&mut bytes).unwrap();
    println!("bytes = {:?}", bytes);
    let connect1 = Connect::decode(bytes.freeze());
    match connect1 {
        Ok(connect) => {
            println!("connect1 = {:?}", connect);
            connect.encode(&mut bytes1).unwrap();
            println!(
                "encode_and_decode_for_connect_shoud_be_work bytes1  = {:?}",
                bytes1
            );
            // decoder
            let connect2 = Connect::decode(bytes1into()).unwrap();
            println!("connect2 = {:?}", connect2);
        }
        Err(err) => println!("编解码出错"),
    }
}

依赖项

~1–1.7MB
~33K SLoC