前言
在工业物联网领域,数据传输的可靠性和效率是至关重要的。不管是通过TCP、UDP还是串口进行通信,处理流式数据时常常会遇到半包或粘包的问题。为了解决这些问题,我们通常需要编写复杂的解码逻辑。然而,有了SunnyUI.FrameDecoder这个开源库,这一切变得简单。
本文将详细介绍如何使用C#和SunnyUI.FrameDecoder来实现对TCP、UDP及串口流数据的高效解码。
项目介绍
SunnyUI.FrameDecoder是一个开源库,在简化流式数据的解码过程。无论是处理来自TCP、UDP的数据流,还是通过串口接收的数据,SunnyUI.FrameDecoder都能帮助你轻松地添加消息边界,从而准确解析每一帧数据。
该库采用了先进的缓冲区池化技术,减少了内存分配次数,降低了垃圾回收的压力,显著提升了性能。
项目架构
流式数据有两种:
byte[]:字节数组
string:字符串
针对这两种数据,实现了泛型数据缓存: DataCache< T>,其内存分配通过数据池:DataPool< T> 实现 通过DataCache< byte>实现字节数据组缓存,通过DataCache< char>实现字符串缓存。
项目安装
动态库应用环境: VS 2012及以上均可,支持.Net Framework 4.5+、包括.Net 6、.Net7
推荐通过Nuget安装:NuGet\Install-Package SunnyUI.FrameDecoder
或者通过Nuget搜索:SunnyUI.FrameDecoder 安装。
项目使用
六种解码模式,覆盖工业主流协议
1、字节流解码:精准切割二进制数据
固定长度切割
// 每3字节为一帧(如固定长度的传感器读数)
var decoder = new FixedLengthFrameDecoder(3);
decoder.Decode(new byte[] {1,2,3,4,5,6}); // 输出[1,2,3], [4,5,6]
头尾标记定位
// 识别0xFFFB开头、0xF7F7结尾(常见于设备控制指令)
var decoder = new HeaderTailFrameDecoder(
new byte[] {0xFF, 0xFB},
new byte[] {0xF7, 0xF7}
);
标签+长度+值(TLV结构)
// 标签1字节,长度1字节(如Modbus扩展协议)
var decoder = new TagLengthValueFrameDecoder(
tagLength: 1,
valueLengthType: ValueLengthType.Byte
);
decoder.Decode(new byte[] {0x01, 0x02, 0xAA, 0xBB});
// 输出标签0x01,值[0xAA,0xBB]
2、字符串解码:处理文本协议更简单
NMEA-0183协议解析(GPS设备常用)
var decoder = new NMEA0183FrameDecoder();
decoder.Decode("$GPGGA,092204.999,4250.5589,S,147*1F\r\n");
// 自动提取完整语句
换行符分割
// 兼容\r\n、\n等多种换行(日志文件解析场景)
var decoder = new LineBasedFrameDecoder();
decoder.Decode("温度:25℃\r湿度:60%\n");
// 输出两行独立数据
项目地址
Gitee:gitee.com/yhuse/Sunny…
总结
SunnyUI.FrameDecoder为大家提供了一个强大且灵活的工具,用于处理流式数据的解码工作。通过其丰富的解码器选择、高效的内存管理和简便的集成方式,你可以大大简化数据处理流程,提高应用的整体性能。
不管是开发工业控制系统,还是开发智能家居设备,SunnyUI.FrameDecoder都是一个不错的库。
以上仅展示了SunnyUI.FrameDecoder开源项目的部分功能。更多实用特性和详细信息,请大家访问项目地址。
希望通过本文能为.NET 工业物联网开发方面提供有价值的参考。欢迎在评论区留言交流,分享您的宝贵经验和建议。
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!