《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍
《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。
《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明
《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍
《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。
《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。
《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项
《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项
《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
目 录
9. 协议过滤器,解决一包多发、粘包、冗余数据... 2
9.1 概述... 2
9.2 实际问题... 2
9.3 5种过滤器及二次开发... 5
9.4 设备驱动开发注意事项... 6
9.5 宿主程序服务实例配置注意事项... 6
9. 协议过滤器,解决一包多发、粘包、冗余数据
9.1 概述
通讯中涉及到数据包的概念,是通讯协议中的数据组成形式。针对这块内容,说简单也简单,说复杂也复杂。需要我们系统性的把问题考虑全面,并用代码实现。
在工业领域也有极端的情况出现,早些年做通讯的时候,数据包头、包尾、数据长度、数据校验位都对,但是就是解析出来的数据不正确,这种情况不会经常出现,但是在某种特殊应用环境可能会频繁出现,后来经过分析得出结论:可能是由于地质电磁干扰引起的。但是也有技术上的设计缺陷,例如:数据校验位是累加和,改成CRC是不是就不会出来这个问题了;另外对于增量数据,应该有补发机制等等。
9.2 实际问题
参考协议:《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯
- 1. 一包多发及解决
多包发送数据是应用环境中的一种情况或一个问题,并不是我们会这样实际应用,而是说在接收过程中多次接收数据才能完整接收客户端一次发送的数据,可能由于网络环境或发送数据端造成的,示意如下图:

例如实时数据的完整包为:55 AA 00 61 43 7A 00 00 43 B4 15 0D。那么接收数据的时候,第一次接收到:55 AA 00 61 43 7A 00 00 43 B4 15,第二次接到:0D。按通讯协议应该能够把这两次接收的数据进行自动拼接,形成完整的数据并进行解析。
ServerSuperIO设置了协议过滤器,可以解决这个问题,如下图:

- 2. 粘包及解决
我原来并不知道粘包这个概念,后来在网上看文章才明白。在通讯领域中也是经常会遇到的问题。也就是多包数据一次性的接收,那么就要合理的进行拆包。还有一种情况,就是多包半的数据一次性的接收,那半包的数据结合“1.一包多发及解决”来解决这个问题,示意如下图:

ServerSuperIO设置了协议过滤器,可以解决这个问题,如下图:

- 3. 冗余数据的出现及解决
在工业领域受电缆或环境的电磁干扰,以及接头虚接等,这种情况极有可能出现。如果干扰的冗余数据夹杂在一个协议包中间,那么校验出合法的数据很困难。如果干扰的冗余数据夹杂在两个协议包中间,那么就可以通过协议过滤来实现识别出有用的数据。示意如下图:

ServerSuperIO设置了协议过滤器,可以解决这个问题,如下图:

9.3 5种过滤器及二次开发
FixedEndReceiveFliter:固定结尾的协议过滤器。
FixedHeadAndEndReceiveFliter:固定开头和结尾的协议过滤器。
FixedHeadAndLengthReceiveFliter:固定开头和长度的协议过滤器。
FixedHeadReceiveFliter:固定开头的协议过滤器。
FixedLengthReceiveFliter:固定长度的协议过滤器。
这5个过滤器都继承自IReceiveFilter接口,也可以继承这个接口进行二次开发,定制自己的协议过滤器。代码工程如下图:

9.4 设备驱动开发注意事项
对于开发设备驱动,在初始化过程中可以增加这个驱动的协议过滤器,代码如下:
public override void Initialize(string devid)
{
this.Protocol.InitDriver(this.GetType(),new FixedHeadAndEndReceiveFliter(new byte[] {0x55,0xaa},new byte[] {0x0d} ));
……
}
9.5 宿主程序服务实例配置注意事项
在配置参数中需要配置:StartReceiveDataFliter = true,协议过滤器才能起到作用。代码如下:
static void Main(string[] args)
{
DeviceSelfDriver dev2 = new DeviceSelfDriver();
dev2.DeviceParameter.DeviceName = "网络设备";
dev2.DeviceParameter.DeviceAddr = 1;
dev2.DeviceParameter.DeviceID = "1";
dev2.DeviceDynamic.DeviceID = "1";
dev2.DeviceParameter.DeviceCode = "1";
dev2.DeviceParameter.NET.RemoteIP = "127.0.0.1";
dev2.DeviceParameter.NET.RemotePort = 9600;
dev2.CommunicateType = CommunicateType.NET;
dev2.Initialize("1"); IServer server = new ServerManager().CreateServer(new ServerConfig()
{
ServerName = "服务1",
ComReadTimeout = 1000,
ComWriteTimeout = 1000,
NetReceiveTimeout = 1000,
NetSendTimeout = 1000,
ControlMode = ControlMode.Self,
SocketMode = SocketMode.Tcp,
StartReceiveDataFliter = true,
ClearSocketSession = false,
StartCheckPackageLength = false,
CheckSameSocketSession = false,
DeliveryMode = DeliveryMode.DeviceIP,
}); server.AddDeviceCompleted += server_AddDeviceCompleted;
server.DeleteDeviceCompleted+=server_DeleteDeviceCompleted;
server.Start(); server.AddDevice(dev2); while ("exit" == Console.ReadLine())
{
server.Stop();
}
}
2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍
2.应用SuperIO(SIO)和开源跨平台物联网框架ServerSuperIO(SSIO)构建系统的整体方案
3.C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
5.ServerSuperIO开源地址:https://github.com/wxzz/ServerSuperIO
物联网&集成技术(.NET) QQ群:
《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据的更多相关文章
- 《连载 | 物联网框架ServerSuperIO教程》- 17.集成Golden实时数据库,高并发保存测点数据。附:3.4 发布与版本更新说明。
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制 一.综述 SuperIO(SIO)定位 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 11.实现设备(驱动)与设备(驱动)交互和级联控制。注:设备驱动模拟金三与普京的对话
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 14.配制工具介绍,以及设备驱动、视图驱动、服务实例的挂载
注:ServerSuperIO二次开发套件授权码申请---截止到:2016-12-09 1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架Server ...
- 《连载 | 物联网框架ServerSuperIO教程》- 15.数据持久化接口的使用。附:3.2发布与版本更新说明。
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- Android之SQLite数据存储
一.SQLite保存数据介绍 将数据库保存在数据库对于重复或者结构化数据(比如契约信息)而言是理想之选.SQL数据库的主要原则之一是架构:数据库如何组织正式声明.架构体现于用于创建数据库的SQL语句. ...
- 在将 varchar 值 'xinpian' 转换成数据类型 int 时失败?
把int类型的值修改为varchar类型的值
- MongoDB学习笔记~对集合属性的操作
回到目录 $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$ ...
- 【python之路3】if 语句
1.if语句用法(if....else....) #!/usr/bin/env python # -*- coding:utf-8 -*- my_name = raw_input("plea ...
- 《开源博客Q群》和《NET上海Q群》入群须知
开源博客Q群 群名:<嗨-博客> 群号:469075305(已满) 491585006(New) 群简介:“我们每个猿都有一个搭建自己独立博客的梦”. 入群要求: 您可以是HR,私聊管理员 ...
- AutoMapper(二)
返回总目录 首先,先创建一个控制台项目,引用AutoMapper程序集,创建三个类User,UserDto,UserMappingProfile,下面的知识点的演示都以此项目为基础,代码分别如下: n ...
- .NET中使用Redis
Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博.Github.StackOverflow 等大型应用中都用其作为缓存,Redis的官网为http://redis.io/. 最近 ...
- Visual Studio 实用扩展推荐
Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源).在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率. C# ...
- C++ std::queue
std::queue template <class T, class Container = deque<T> > class queue; FIFO queue queue ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)
系列目录 这一节我们要着手建立系统管理员表,但发布之前,我先发布一个代码生成器给大家先用着. 这个生成器是为这个项目而生的,理论不能用于其他项目,而且写得比较潦草,但能用 下载地址 有兴趣要生成器源码 ...