Răsfoiți Sursa

【功能】CAN通信

mikasa 1 lună în urmă
părinte
comite
c900105b07
7 a modificat fișierele cu 156 adăugiri și 34 ștergeri
  1. 112 13
      Cargo.lock
  2. 1 1
      Cargo.toml
  3. 1 0
      emu-config.yaml
  4. 3 1
      src/cmd/config.rs
  5. 24 9
      src/ems/bms/bms.rs
  6. 9 7
      src/ems/emu/emu.rs
  7. 6 3
      src/ems/pcs/pcs.rs

+ 112 - 13
Cargo.lock

@@ -142,7 +142,7 @@ checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -262,7 +262,7 @@ dependencies = [
  "heck",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -381,6 +381,15 @@ version = "1.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
 
+[[package]]
+name = "embedded-can"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9d2e857f87ac832df68fa498d18ddc679175cf3d2e4aa893988e5601baf9438"
+dependencies = [
+ "nb",
+]
+
 [[package]]
 name = "equivalent"
 version = "1.0.2"
@@ -489,7 +498,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -552,6 +561,12 @@ version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
 [[package]]
 name = "iana-time-zone"
 version = "0.1.61"
@@ -603,6 +618,7 @@ dependencies = [
  "rayon",
  "serde",
  "serde_yml",
+ "socketcan",
  "thiserror 2.0.12",
  "tklog",
  "tokio",
@@ -627,6 +643,15 @@ version = "1.70.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
 
+[[package]]
+name = "itertools"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+dependencies = [
+ "either",
+]
+
 [[package]]
 name = "itoa"
 version = "1.0.15"
@@ -713,6 +738,15 @@ version = "2.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
 
+[[package]]
+name = "memoffset"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
+
 [[package]]
 name = "miniz_oxide"
 version = "0.8.5"
@@ -765,6 +799,37 @@ dependencies = [
  "thiserror 1.0.69",
 ]
 
+[[package]]
+name = "nb"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d"
+
+[[package]]
+name = "neli"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93062a0dce6da2517ea35f301dfc88184ce18d3601ec786a727a87bf535deca9"
+dependencies = [
+ "byteorder",
+ "libc",
+ "log",
+ "neli-proc-macros",
+]
+
+[[package]]
+name = "neli-proc-macros"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c8034b7fbb6f9455b2a96c19e6edf8dc9fc34c70449938d8ee3b4df363f61fe"
+dependencies = [
+ "either",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn 1.0.109",
+]
+
 [[package]]
 name = "nix"
 version = "0.26.4"
@@ -786,6 +851,7 @@ dependencies = [
  "cfg-if",
  "cfg_aliases",
  "libc",
+ "memoffset",
 ]
 
 [[package]]
@@ -796,7 +862,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -846,7 +912,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -1092,7 +1158,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -1180,12 +1246,45 @@ dependencies = [
  "windows-sys 0.52.0",
 ]
 
+[[package]]
+name = "socketcan"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7654092b2859221c29ac4b43dc502a8e156a7f2533e8617aaaa056b664d1230e"
+dependencies = [
+ "bitflags 2.9.0",
+ "embedded-can",
+ "futures",
+ "hex",
+ "itertools",
+ "libc",
+ "log",
+ "mio",
+ "nb",
+ "neli",
+ "nix 0.29.0",
+ "socket2",
+ "thiserror 2.0.12",
+ "tokio",
+]
+
 [[package]]
 name = "strsim"
 version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
 
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
 [[package]]
 name = "syn"
 version = "2.0.100"
@@ -1223,7 +1322,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -1234,7 +1333,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -1293,7 +1392,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -1360,7 +1459,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]
 
 [[package]]
@@ -1451,7 +1550,7 @@ dependencies = [
  "log",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
  "wasm-bindgen-shared",
 ]
 
@@ -1473,7 +1572,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -1632,5 +1731,5 @@ checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.100",
 ]

+ 1 - 1
Cargo.toml

@@ -25,7 +25,7 @@ tokio-modbus = { version = "0.16.1", features = ["rtu", "tcp"] }
 # tokio 异步串口支持
 tokio-serial = "5.4.5"
 # CAN协议支持,开启tokio特性
-#socketcan = { version = "3.5.0", features = ["tokio"] }
+socketcan = { version = "3.5.0", features = ["tokio"] }
 # 时间工具
 chrono = "0.4.39"
 # 日志框架

+ 1 - 0
emu-config.yaml

@@ -4,6 +4,7 @@ emu:
     host: '127.0.0.1'
     port: 33434
   bms:
+    name: 'vcan0'
   ems:
     # 读取间隔, 单位ms
     read_interval: 5000

+ 3 - 1
src/cmd/config.rs

@@ -36,7 +36,9 @@ pub struct EmsConfig {
     pub read_interval: u64,
 }
 #[derive(Serialize, Deserialize, Debug)]
-pub struct BmsConfig {}
+pub struct BmsConfig {
+    pub name: String,
+}
 
 #[derive(Serialize, Deserialize, Debug)]
 pub struct RabbitMQConfig {

+ 24 - 9
src/ems/bms/bms.rs

@@ -1,7 +1,12 @@
 use crate::cmd::config::app_config;
 use crate::ems::{Consumer, Producer, Service};
 use crate::internal::utils;
-use log::info;
+use crate::internal::utils::mqtt::{mqtt_client, MqttClient};
+use anyhow::anyhow;
+use log::{debug, info};
+use socketcan::tokio::{AsyncCanSocket, CanSocket};
+use socketcan::{EmbeddedFrame, IoResult};
+use std::io::Read;
 use std::sync::Arc;
 use tokio::sync::Mutex;
 
@@ -9,19 +14,31 @@ pub struct Bms {
     pub id: String,
     pub producer: Producer,
     pub consumer: Arc<Mutex<Consumer>>,
+    pub can_socket: Arc<AsyncCanSocket<socketcan::CanSocket>>,
 }
 
 impl Bms {
     /// 初始化BMS
-    pub async fn new(producer: Producer, consumer: Consumer) -> Self {
+    pub async fn new(producer: Producer, consumer: Consumer) -> anyhow::Result<Self> {
         let id = utils::generate_random_str(12);
         utils::log::init_log("inpower_iot_mgc_rs::ems::bms::*", "bms/bms.log").await;
         info!("BMS [{}] 初始化成功", id);
-        Bms {
+        let can_socket = match CanSocket::open(app_config().emu.bms.name.as_str()) {
+            Ok(can) => can,
+            Err(e) => {
+                return Err(anyhow!(
+                    "can: {}打开失败: {}",
+                    app_config().emu.bms.name.as_str(),
+                    e.to_string()
+                ));
+            }
+        };
+        Ok(Bms {
             id,
             producer,
             consumer: Arc::new(Mutex::new(consumer)),
-        }
+            can_socket: Arc::new(can_socket),
+        })
     }
 }
 
@@ -29,12 +46,10 @@ impl Bms {
 impl Service for Bms {
     async fn read_task(&self) {
         let producer = self.producer.clone();
+        let can_socket = Arc::clone(&self.can_socket);
         loop {
-            producer.send("PCS 你好".to_string()).await.unwrap();
-            tokio::time::sleep(tokio::time::Duration::from_millis(
-                app_config().emu.ems.read_interval,
-            ))
-            .await;
+            let can_frame = can_socket.read_frame().await.unwrap();
+            debug!("{:?}", can_frame)
         }
     }
 

+ 9 - 7
src/ems/emu/emu.rs

@@ -48,13 +48,15 @@ impl Emu {
             //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
             let (pcs, bms) = join!(pcs, bms);
 
-            let bms_dev = Device {
-                id: "".to_string(),
-                name: "".to_string(),
-                service: Arc::new(bms),
-                channel: Arc::new(Mutex::new(bms_rx)),
-            };
-            devices.insert("bms".to_string(), Arc::new(bms_dev));
+            if let Ok(b) = bms {
+                let bms_dev = Device {
+                    id: "".to_string(),
+                    name: "".to_string(),
+                    service: Arc::new(b),
+                    channel: Arc::new(Mutex::new(bms_rx)),
+                };
+                devices.insert("bms".to_string(), Arc::new(bms_dev));
+            }
 
             if let Ok(p) = pcs {
                 let pcs_dev = Device {

+ 6 - 3
src/ems/pcs/pcs.rs

@@ -105,6 +105,11 @@ impl Pcs {
         }
         Ok(())
     }
+
+    async fn read_holding_registers() -> anyhow::Result<()> {
+        Ok(())
+    }
+
 }
 
 #[async_trait::async_trait]
@@ -117,9 +122,7 @@ impl Service for Pcs {
             ))
             .await;
             match self.read_input_register().await {
-                Ok(_) => {
-
-                }
+                Ok(_) => {}
                 Err(e) => {
                     error!("{}", e.to_string());
                     //断线重连