#mqtt #actor #adapter #topic #message #actix-actor #publisher

mqtt_actor

用于与actix actors一起使用的mqtt适配器(从端口和适配器)

7个版本 (2个稳定版)

1.0.1 2022年12月8日
0.2.5 2022年12月6日

#1165异步

每月22次下载

MIT/Apache

24KB
289

用途

目标是使用actors与Mqtt结合。

在使用端口和适配器(即六边形架构)时,我们可能想使用actix actors来实现核心。特别是当需要使用多个协议时。

如果其中之一是MQTT,那么这就是您需要的适配器。

描述

此crate是异步的,应在actix_rs执行器中运行。

尽管名称暗示此crate是关于将适配器实现为actors,但实际上并非纯actors。

它有一个actors,允许您拥有一个地址,允许核心向主题发送消息:MqttPublisher,但主要工作是由结构:MqttConnectionManager来完成的,包括连接到服务器和创建前面的actor。

architecture

使用方法

创建MqttConnectionManager的实例。使用from方法并提供所有连接参数。

然后在启动MqttConnectionManager之前添加您可能需要的订阅

在actix_rs执行器内部进行所有步骤。

例如(更多和更好的示例请参见文档)

#[actix_rt::main]
async fn main() {
    let my_actor_address = MyActor::new().start();

    let (publisher, listener) = MqttConnectionManager::from(
        String::from(CLIENT_NAME),
        String::from(IP),
        1883,
        Some(String::from(USER)),
        Some(String::from(PASS)),
        })
        .add_subscription( Box::new(DumpHandler{topic: String::from("testing_topic/a")} ))
        .add_subscription( Box::new(MyHandler{topic: String::from("testing_topic/b"), address: my_actor_address} ))
        .start().await;
    listener.await;
}

发送消息

扩展MqttPublisher,使用您选择的处理器处理消息。

使用MqttPublisher中定义的方法发送消息

pub struct StringMessage{
    pub payload : String,
    pub topic: String,
}

impl Message for StringMessage {
    type Result = ();
}

impl Handler<StringMessage> for MqttPublisher {
    type Result = ();

    fn handle(&mut self, msg: StringMessage, _: &mut Self::Context) -> Self::Result {
        self.publish_str(&msg.topic , &msg.payload);
        ()
    }
}

此实现应限制为以下常规响应性

  • 了解主题
  • 序列化消息

测试

MqttPublisher是一个类型别名,它映射到MqttPublisherActor。但在单元测试期间,它映射到MqttPublisherActor_Mock

此模拟不会连接到任何地方,并且不需要初始化或创建MqttConnectionManager

辅助工具

此crate包括一些不是必需的但可能有用的元素。

订阅

提供了两个订阅:测试和示例。

DumpHandler是最低的实现。显示对主题的订阅并打印(转储)接收到的消息到标准输出。它可以用于在手动测试期间检查消息是否被读取。

EchoHandler是一个演示,展示了如何实现一个处理器,该处理器可以使用内部Actor MqttPublisher来发送消息。这相当于一个actix-web处理器(请求-响应)。此处理器也可以直接用于实现外部看门狗的保活机制。

发布者

提供了一个处理器,它扩展了MqttPublisher以接受StringMessage

此消息由EchoHandler使用,但不仅限于它。

您可以使用它向任何主题发送任何字符串。

模拟

MqttPublisherActor_Mock是在单元测试期间(不是其他类型的测试)指向别名MqttPublisher的位置。因此,您的单元测试不需要MQTT连接。

收到的任何消息都将被接受,不应期望任何错误,无论Actor或连接管理器的状态如何。

(此模拟的功能正在变化,此处无法描述)

依赖项

~6–18MB
~192K SLoC