byte_message 1.3.1
byte_message: ^1.3.1 copied to clipboard
Inter-chip 协议编码/解码的纯 Dart 库:提供数据包模型、常量、工具方法、编码器与解码器,支持 |Flag|Len|LenH|Cmd|Payload|Checksum| 格式。
/// Inter-chip协议编码解码库使用示例
///
/// 本示例展示了如何使用byte_message库进行inter-chip协议的编码和解码操作
import 'package:byte_message/byte_message.dart';
/// 主示例入口
///
/// 功能描述:
/// - 演示 byte_message 库的核心用法,顺序调用各示例方法(example1 ~ example7)
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(无返回值,仅在控制台打印示例输出)
void main() {
print('=== Inter-chip协议编码解码库使用示例 ===\n');
example1();
example2();
example3();
example4();
example5();
example6();
example7();
}
/// 示例1:自动短帧(自动处理 flag、len、lenH、checksum)
///
/// 功能描述:
/// - 仅提供 cmd 和 payload,编码器自动完成短帧的标志位、长度与校验和计算;
/// - 展示 InterChipEncoder/InterChipDecoder 的基本用法。
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(在控制台打印编码与解码结果)
void example1() {
print('');
print('1. 自动短帧:flag、len、lenH、checksum');
print('=' * 100);
// 创建自动处理的编码器和解码器
const encoder = InterChipEncoder();
const decoder = InterChipDecoder();
// 只提供cmd和payload,明确指定短帧+校验和
final packet = InterChipPacket(
cmd: InterChipCmds.normal,
payload: [0x01, 0x02, 0x03],
);
print('输入参数: cmd=${packet.cmd}, payload=${packet.payload}');
// 编码
final encodedData = encoder.encode(packet);
print('编码结果: ${encodedData}');
// 解码验证
final decodedPacket = decoder.decode(encodedData);
print('解码成功:$decodedPacket');
print('');
}
/// 示例2:自动长帧(自动处理 flag、len、lenH、checksum)
///
/// 功能描述:
/// - 构造超过短帧长度的负载,编码器自动转换为长帧并计算长度与校验;
/// - 验证长帧的编码与解码流程。
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(在控制台打印编码与解码结果)
void example2() {
print('');
print('2. 自动长帧:flag、len、lenH、checksum');
print('=' * 100);
// 创建自动处理的编码器和解码器
const encoder = InterChipEncoder();
const decoder = InterChipDecoder();
final packet = InterChipPacket(
cmd: InterChipCmds.normal,
payload: List.generate(300, (index) => (index % 256)),
);
print('输入参数: cmd=${packet.cmd}, payload=${packet.payload}');
// 编码
final encodedData = encoder.encode(packet);
print('编码结果: ${encodedData}');
// 解码验证
final decodedPacket = decoder.decode(encodedData);
print('解码成功:$decodedPacket');
print('');
}
/// 示例3:手动指定 flag,自动计算 len、lenH、checksum
///
/// 功能描述:
/// - 通过 InterChipFlags 手动构造 flag,其余长度与校验和由编码器自动处理;
/// - 展示手动与自动混合配置的使用方式。
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(在控制台打印编码与解码结果)
void example3() {
print('');
print('3. 手动flag,自动len、lenH、checksum');
print('=' * 100);
// 创建自动处理的编码器和解码器
const encoder = InterChipEncoder();
const decoder = InterChipDecoder();
// 只提供cmd和payload,生成3个元素的payload(短帧)
final packet = InterChipPacket(
flag: InterChipFlags(isLongFrame: true, checksumEnable: true).encode(),
cmd: InterChipCmds.normal,
payload: List.generate(3, (index) => (index % 256)),
);
print('输入参数: cmd=${packet.cmd}, payload=${packet.payload}');
// 编码
final encodedData = encoder.encode(packet);
print('编码结果: ${encodedData}');
// 解码验证
final decodedPacket = decoder.decode(encodedData);
print('解码成功:$decodedPacket');
print('');
}
/// 示例4:全手动 flag、len、lenH、checksum(不推荐)
///
/// 功能描述:
/// - 手动设置所有一层字段(flag、len、lenH、checksum),演示自由度与风险;
/// - 由于易与自动规则冲突,实际项目中不推荐此方式。
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(在控制台打印编码与解码结果)
void example4() {
print('');
print('4. 全手动flag、len、lenH、checksum');
print('不推荐,flag、len、lenH、checksum的值容易冲突');
print('=' * 100);
// 创建自动处理的编码器和解码器
const encoder = InterChipEncoder();
const decoder = InterChipDecoder();
final packet = InterChipPacket(
flag: InterChipFlags(isLongFrame: true, checksumEnable: true).encode(),
len: 0,
lenH: 4,
cmd: InterChipCmds.normal,
payload: List.generate(3, (index) => (index % 256)),
checksum: 0xaf,
);
print('输入参数: cmd=${packet.cmd}, payload=${packet.payload}');
// 编码
final encodedData = encoder.encode(packet);
print('编码结果: ${encodedData}');
// 解码验证
final decodedPacket = decoder.decode(encodedData);
print('解码成功:$decodedPacket');
print('');
}
/// 示例5:标志位 InterChipFlags 的编码与解码
///
/// 功能描述:
/// - 展示 InterChipFlags 的位定义、编码与解码;
/// - 通过 InterChipFlags.encode() 生成整型标志位,再使用 InterChipFlags.decode()/fromFlag 解析回对象。
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(在控制台打印示例结果)
void example5() {
print('');
print('5. 标志位 InterChipFlags 使用示例');
print('=' * 100);
// 参见类定义位置:/Users/caiquan/code/lib/byte_message/lib/src/models/packet_models.dart#L170-170
// 位定义(协议):
// |7|6|5|4|3|2|1|0|
// |reserve|LongFrame|reserve|ChecksumEnable|reserve|reserve|reserve|reserve|
// 示例一:长帧且启用校验和
final flags2 = InterChipFlags(isLongFrame: true, checksumEnable: true);
final encoded2 = flags2.encode();
final decoded2 = InterChipFlags.decode(encoded2);
print(
'示例二: flags=$flags2 -> encode=0x${encoded2.toRadixString(16).padLeft(2, '0')} -> decode=$decoded2');
// 示例二:直接从整型标志位创建(工厂方法 fromFlag)
final fromFlag =
InterChipFlags.fromFlag(0x50); // 0x40: LongFrame, 0x10: ChecksumEnable
print('示例三: fromFlag(0x50) -> $fromFlag');
print('');
}
/// 示例6:二层协议 Control Bus 的编码与解码
///
/// 功能描述:
/// - 使用 ControlBusMessage 构造二层负载(CbCmd + CbPayload);
/// - 通过 ControlBusEncoder 生成一层 InterChipPacket 并序列化;
/// - 使用 InterChipDecoder + ControlBusDecoder 反解得到二层结构。
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(在控制台打印编码与解码结果)
void example6() {
print('');
print('6. 二层协议:Control Bus 编码与解码示例');
print('=' * 100);
const interEncoder = InterChipEncoder();
const interDecoder = InterChipDecoder();
final cbEncoder = ControlBusEncoder();
final cbDecoder = ControlBusDecoder();
// 构造 Control Bus 二层消息:CbCmd=0x01,负载 [0xAA, 0xBB]
final cbMsg = ControlBusMessage(cbCmd: 0x01, cbPayload: [0xAA, 0xBB]);
print('二层object: $cbMsg');
// 仅编码二层内容(不含一层字段)
final cbPayloadBytes = cbEncoder.encode(cbMsg);
print('二层encode: $cbPayloadBytes');
// 生成一层数据包(Cmd 固定为 0xF8 / normal)
final packet =
InterChipPacket(cmd: InterChipCmds.normal, payload: cbPayloadBytes);
print('一层object: $packet');
// 序列化为字节流,并通过一层解码器复原数据包
final bytes = interEncoder.encode(packet);
print('一层encode: $bytes');
final decodedPacket = interDecoder.decode(bytes)!;
print('一层decode: $decodedPacket');
// 解析二层结构(传入一层 payload)
final decodedCb = cbDecoder.decode(decodedPacket.payload)!;
print('二层decode: $decodedCb');
print('');
}
/// 示例7:二层协议 DFU 的编码与解码
///
/// 功能描述:
/// - 使用 DfuMessage 构造二层负载(DfuCmd + DfuVersion + DfuPayload);
/// - 通过 DfuEncoder 生成一层 InterChipPacket 并序列化;
/// - 使用 InterChipDecoder + DfuDecoder 反解得到二层结构。
///
/// 参数:
/// - 无
///
/// 返回值:
/// - void(在控制台打印编码与解码结果)
void example7() {
print('');
print('7. 二层协议:DFU 编码与解码示例');
print('=' * 100);
const interEncoder = InterChipEncoder();
const interDecoder = InterChipDecoder();
final dfuEncoder = DfuEncoder();
final dfuDecoder = DfuDecoder();
// 构造 DFU 二层消息:DfuCmd=0x10,Version=0x01,负载 [0xDE, 0xAD]
final dfuMsg = DfuMessage(
dfuCmd: 0x10,
dfuVersion: 0x01,
dfuPayload: [0xDE, 0xAD],
);
print('二层object: $dfuMsg');
// 仅编码二层内容(不含一层字段)
final dfuPayloadBytes = dfuEncoder.encode(dfuMsg);
print('二层encode: $dfuPayloadBytes');
// 生成一层数据包(Cmd 固定为 0x20 / dfu)
final packet =
InterChipPacket(cmd: InterChipCmds.dfu, payload: dfuPayloadBytes);
print('一层object: $packet');
// 序列化为字节流,并通过一层解码器复原数据包
final bytes = interEncoder.encode(packet);
final decodedPacket = interDecoder.decode(bytes)!;
print('一层decode: $decodedPacket');
// 解析二层结构(传入一层 payload)
final decodedDfu = dfuDecoder.decode(decodedPacket.payload)!;
print('二层decode: $decodedDfu');
print('');
}