# WritePropertyMultiple 实现说明
## 概述
成功为 BACnet 嵌入式库添加了 `WritePropertyMultiple` 服务支持,实现了高效的批量写入功能。
## 新增文件
### 1. 服务实现
- **文件**: [write_property_multiple.rs](src/application_protocol/services/write_property_multiple.rs)
- **功能**: 实现了 BACnet 协议的 WritePropertyMultiple 服务
### 2. 使用示例
- **文件**: [write_property_multiple.rs](examples/write_property_multiple.rs)
- **功能**: 展示如何使用批量写入功能的完整示例
## 核心组件
### 1. WritePropertyRequest
表示单个属性的写入请求:
```rust
pub struct WritePropertyRequest<'a> {
pub property_id: PropertyId, // 属性 ID
pub array_index: Option<u32>, // 数组索引(可选)
pub value: ApplicationDataValueWrite<'a>, // 写入值
pub priority: Option<u8>, // 优先级(可选)
}
```
### 2. WritePropertyMultipleObject
表示单个对象的多个属性写入请求:
```rust
pub struct WritePropertyMultipleObject<'a> {
pub object_id: ObjectId, // 对象 ID
pub writes: Vec<WritePropertyRequest<'a>>, // 属性写入列表
}
```
### 3. WritePropertyMultiple
完整的批量写入请求,可包含多个对象:
```rust
pub struct WritePropertyMultiple<'a> {
pub objects: Vec<WritePropertyMultipleObject<'a>>, // 对象列表
}
```
## 使用方法
### 基本用法
```rust
use bacnet_emb::{
application_protocol::services::write_property_multiple::{
WritePropertyMultiple, WritePropertyMultipleObject, WritePropertyRequest,
},
application_protocol::primitives::data_value::ApplicationDataValueWrite,
common::object_id::{ObjectId, ObjectType},
common::property_id::PropertyId,
};
// 创建属性写入请求
let writes = vec![
WritePropertyRequest::new(
PropertyId::PropPresentValue,
None,
ApplicationDataValueWrite::Real(22.5),
None,
),
WritePropertyRequest::new(
PropertyId::PropDeadband,
None,
ApplicationDataValueWrite::Real(0.5),
None,
),
];
// 创建对象
let object = WritePropertyMultipleObject::new(
ObjectId::new(ObjectType::ObjectAnalogInput, 0),
writes,
);
// 创建批量写入请求
let request = WritePropertyMultiple::new(vec![object]);
// 发送请求
bacnet.write_property_multiple(&mut buffer, request, None).await?;
```
### no_std 环境使用
```rust
// 使用静态数组代替 Vec
let write1 = WritePropertyRequest::new(...);
let write2 = WritePropertyRequest::new(...);
let writes = &[write1, write2];
let object = WritePropertyMultipleObject::new(object_id, writes);
let request = WritePropertyMultiple::new(&[object]);
```
## 性能优势
### 网络效率对比
- **单独写入**: N 个对象 × M 个属性 = N×M 个网络请求
- **批量写入**: 1 个网络请求处理所有写入
### 实际应用场景
1. **设备配置**: 批量配置控制器的多个点位
2. **传感器更新**: 一次性更新多个传感器值
3. **系统初始化**: 初始化设备的多个属性
4. **同步控制**: 同时控制多个输出点
## 技术实现
### BACnet 协议支持
- 服务代码: `ConfirmedServiceChoice::WritePropMultiple (16)`
- 编码格式: 符合 ANSI/ASHRAE 135-2016 标准
- 生命周期管理: 支持 `no_std` 和 `alloc` 两种模式
### 集成点
1. **服务模块**: 添加到 `services/mod.rs`
2. **确认服务**: 在 `confirmed.rs` 中注册
3. **简化 API**: 在 `simple/mod.rs` 中暴露用户接口
## 兼容性
### Rust 版本
- 支持 `no_std` 环境
- 支持 `alloc` 特性
- 使用 `maybe_async` 宏实现异步/同步兼容
### 嵌入式特性
- 零动态分配(no_std 模式)
- 最小内存占用
- 符合嵌入式资源约束
## 测试
### 编译测试
```bash
cargo build --lib
cargo build --examples
```
### 示例代码
提供了完整的使用示例,涵盖:
- 单对象多属性写入
- 多对象多属性写入
- no_std 环境使用示例
## BACnet 协议细节
### 服务请求结构
```
WritePropertyMultiple ::= SEQUENCE {
list_of_write_access_specs
SEQUENCE OF SEQUENCE {
object_identifier [0] BACnetObjectIdentifier,
list_of_property_values
SEQUENCE OF SEQUENCE {
property identifier [0] BACnetPropertyIdentifier,
property_array_index [1] Unsigned OPTIONAL,
property_value [2] ABSTRACT-SYNTAX.&Type,
priority [3] Unsigned (0..16) OPTIONAL
}
}
}
```
### 服务确认
- 使用 `SimpleAck` 进行确认
- 支持错误处理和错误代码返回
## 未来扩展
可能的改进方向:
1. 支持批量写入的原子性保证
2. 添加写入进度回调
3. 支持部分成功处理
4. 添加更详细的错误信息
## 相关文件
- [services/write_property_multiple.rs](src/application_protocol/services/write_property_multiple.rs) - 核心实现
- [services/mod.rs](src/application_protocol/services/mod.rs) - 模块注册
- [confirmed.rs](src/application_protocol/confirmed.rs) - 协议支持
- [simple/mod.rs](src/simple/mod.rs) - 用户 API
- [examples/write_property_multiple.rs](examples/write_property_multiple.rs) - 使用示例