rsiot/components_config/mqtt_client/mod.rs
1//! Настройки коммуникации с MQTT-брокером
2
3mod mqtt_msg_gen;
4mod mqtt_msg_recv;
5mod mqtt_msg_send;
6
7pub use {mqtt_msg_gen::MqttMsgGen, mqtt_msg_recv::MqttMsgRecv, mqtt_msg_send::MqttMsgSend};
8
9use crate::{message::MsgDataBound, serde_utils::SerdeAlgKind};
10
11/// Преобразование входящих сообщений в данные для публикации в брокере
12pub type FnPublish<TMsg> = fn(&TMsg, &MqttMsgGen) -> anyhow::Result<Option<MqttMsgSend>>;
13
14/// Преобразование данных от брокера сообщений в исходящие сообщения
15pub type FnSubscribe<TMsg> = fn(&str, &[u8], &MqttMsgGen) -> anyhow::Result<Option<Vec<TMsg>>>;
16
17// ANCHOR: Config
18/// Конфигурация cmp_mqtt_client
19#[derive(Clone)]
20pub struct Config<TMsg>
21where
22 TMsg: MsgDataBound,
23{
24 /// Алгоритм сериализации / десериализации
25 pub serde_alg: SerdeAlgKind,
26
27 /// Идентификатор клиента MQTT
28 pub client_id: String,
29
30 /// Адрес брокера
31 ///
32 /// Примеры:
33 /// - `localhost`
34 pub host: String,
35
36 /// Порт брокера.
37 ///
38 /// По-умолчанию - 1883
39 pub port: u16,
40
41 /// Ёмкость клиента.
42 ///
43 /// Можно задать 100
44 pub client_capacity: usize,
45
46 /// Настройка публикации данных в брокере
47 pub publish: ConfigPublish<TMsg>,
48
49 /// Настройка подписки на данные из брокера
50 pub subscribe: ConfigSubscribe<TMsg>,
51}
52// ANCHOR: Config
53
54// ANCHOR: ConfigPublish
55/// Конфигурация настроек публикации на брокере
56#[derive(Clone)]
57pub enum ConfigPublish<TMsg>
58where
59 TMsg: MsgDataBound,
60{
61 /// Не публиковать
62 NoPublish,
63
64 /// Публиковать
65 Publish {
66 /// Часть топика, которая будет добавлена к каждому сообщению
67 base_topic: String,
68
69 /// Функция принимает входящие сообщения и возвращает возможную структуру для публикации в
70 /// брокере
71 fn_publish: FnPublish<TMsg>,
72 },
73}
74// ANCHOR: ConfigPublish
75
76// ANCHOR: ConfigSubscribe
77/// Конфигурация настроек подписки на сообщения из брокера
78#[derive(Clone)]
79pub enum ConfigSubscribe<TMsg>
80where
81 TMsg: MsgDataBound,
82{
83 /// Не подписываться
84 NoSubscribe,
85
86 /// Подписаться
87 Subscribe {
88 /// Токен
89 topic: String,
90
91 /// Функция принимает сообщения из брокера и формирует возможный массив исходящих сообщений
92 fn_subscribe: FnSubscribe<TMsg>,
93 },
94}
95// ANCHOR: ConfigSubscribe