C# 工业物联网流数据解码 TCP/UDP/串口开源方案

45 阅读3分钟

前言

在工业物联网领域,数据传输的可靠性和效率是至关重要的。不管是通过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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!