# 快速开始(订阅 / 发布)
`init_dds` 初始化 DDS(domain 域、网卡接口、cyclonedds 配置文件路径,空串 = 默认配置),之后即可订阅/发布话题。
## 订阅
```rust,no_run
use unitree_sdk2_rs::{init_dds, subscribe};
use unitree_sdk2_rs::unitree_hg::msg::dds_::BmsState;
fn main() {
init_dds(0, "eth0", "");
// 订阅话题,返回 (Subscriber, watch::Receiver<Option<T>>)
let (_sub, rx) = subscribe::<BmsState>("rt/lf/bmsstate");
// 读取最新一帧(CDR bytes → BmsState)
if let Some(state) = rx.borrow().as_ref() {
println!("SOC={}% 电压={}mV", state.soc, state.bmsvoltage[0]);
}
}
```
## 发布
```rust,no_run
use unitree_sdk2_rs::{init_dds, Publisher};
use unitree_sdk2_rs::unitree_hg::msg::dds_::BmsState;
fn main() {
init_dds(0, "eth0", "");
let pub_ = Publisher::<BmsState>::new("rt/lf/bmsstate").expect("创建 Publisher 失败");
let bms = BmsState {
version_high: 1, version_low: 0, r#fn: 0,
cell_vol: [4000; 40],
bmsvoltage: [42000, 0, 0],
current: -2500, soc: 85, soh: 100,
temperature: [32; 12],
cycle: 1, manufacturer_date: 0,
bmsstate: [0; 5], reserve: [0; 3],
};
pub_.publish(&bms);
}
```
> 订阅回调在 C++ 侧触发,反序列化后通过 `tokio::sync::watch` 广播;用 `rx.borrow()` 读取最新值。
## 话题
话题名(如 `rt/lf/bmsstate`)与各类型消息格式见 unitree_sdk2 官方文档。