|
@@ -2,7 +2,9 @@ use crate::ems::bms::bms::Bms;
|
|
|
use crate::ems::pcs::pcs::Pcs;
|
|
|
use crate::ems::Service;
|
|
|
use crate::internal::utils;
|
|
|
+use crate::internal::utils::mqtt::mqtt_client;
|
|
|
use log::info;
|
|
|
+use mosquitto_rs::{Event, QoS};
|
|
|
use std::collections::HashMap;
|
|
|
use std::sync::Arc;
|
|
|
use tokio::sync::Mutex;
|
|
@@ -51,7 +53,7 @@ impl Emu {
|
|
|
if let Ok(b) = bms {
|
|
|
let bms_dev = Device {
|
|
|
id: "".to_string(),
|
|
|
- name: "".to_string(),
|
|
|
+ name: "BMS".to_string(),
|
|
|
service: Arc::new(b),
|
|
|
channel: Arc::new(Mutex::new(bms_rx)),
|
|
|
};
|
|
@@ -86,6 +88,7 @@ impl Emu {
|
|
|
});
|
|
|
handles.push(handle);
|
|
|
}
|
|
|
+ self.mqtt().await.unwrap();
|
|
|
// let x = &self.devices;
|
|
|
// let a = x.get(&"pcs".to_string()).unwrap().clone();
|
|
|
// tokio::spawn(async move {
|
|
@@ -118,4 +121,31 @@ impl Emu {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ async fn mqtt(&self) -> anyhow::Result<()> {
|
|
|
+ let client = &mqtt_client().await?.mosq;
|
|
|
+ let subscriptions = client.subscriber().unwrap();
|
|
|
+ client.subscribe("pcs", QoS::AtMostOnce).await?;
|
|
|
+ let sender = self.tx.clone();
|
|
|
+ tokio::spawn(async move {
|
|
|
+ loop {
|
|
|
+ if let Ok(message) = subscriptions.recv().await {
|
|
|
+ match message {
|
|
|
+ Event::Message(msg) => {
|
|
|
+ let string = String::from_utf8(msg.payload).unwrap();
|
|
|
+ info!("topic: {}", msg.topic);
|
|
|
+ sender.send(string).unwrap();
|
|
|
+ }
|
|
|
+ Event::Connected(_) => {
|
|
|
+ info!("[mqtt] 已连接")
|
|
|
+ }
|
|
|
+ Event::Disconnected(_) => {
|
|
|
+ info!("[mqtt] 断开连接")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
}
|