7个版本 (2个稳定版)
1.0.1 | 2022年12月8日 |
---|---|
0.2.5 | 2022年12月6日 |
#1165 在 异步
每月22次下载
24KB
289 行
用途
目标是使用actors与Mqtt结合。
在使用端口和适配器(即六边形架构)时,我们可能想使用actix actors来实现核心。特别是当需要使用多个协议时。
如果其中之一是MQTT,那么这就是您需要的适配器。
描述
此crate是异步的,应在actix_rs
执行器中运行。
尽管名称暗示此crate是关于将适配器实现为actors,但实际上并非纯actors。
它有一个actors,允许您拥有一个地址,允许核心向主题发送消息:MqttPublisher
,但主要工作是由结构:MqttConnectionManager
来完成的,包括连接到服务器和创建前面的actor。
使用方法
创建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