1.C#跨平台物联网通信框架ServerSuperIO(SSIO)介绍html
《连载 | 物联网框架ServerSuperIO教程》1.4种通信模式机制。git
《连载 | 物联网框架ServerSuperIO教程》2.服务实例的配置参数说明github
《连载 | 物联网框架ServerSuperIO教程》- 3.设备驱动介绍网络
《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通信。并发
《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通信模式开发及注意事项。框架
《连载 | 物联网框架ServerSuperIO教程》- 6.并发通信模式开发及注意事项ide
《连载 | 物联网框架ServerSuperIO教程》- 7.自控通信模式开发及注意事项post
《连载 | 物联网框架ServerSuperIO教程》- 8.单例通信模式开发及注意事项this
目 录spa
9. 协议过滤器,解决一包多发、粘包、冗余数据... 2
9.1 概述... 2
9.2 实际问题... 2
9.3 5种过滤器及二次开发... 5
9.4 设备驱动开发注意事项... 6
9.5 宿主程序服务实例配置注意事项... 6
通信中涉及到数据包的概念,是通信协议中的数据组成形式。针对这块内容,说简单也简单,说复杂也复杂。须要咱们系统性的把问题考虑全面,并用代码实现。
在工业领域也有极端的状况出现,早些年作通信的时候,数据包头、包尾、数据长度、数据校验位都对,可是就是解析出来的数据不正确,这种状况不会常常出现,可是在某种特殊应用环境可能会频繁出现,后来通过分析得出结论:多是因为地质电磁干扰引发的。可是也有技术上的设计缺陷,例如:数据校验位是累加和,改为CRC是否是就不会出来这个问题了;另外对于增量数据,应该有补发机制等等。
参考协议:《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通信
多包发送数据是应用环境中的一种状况或一个问题,并非咱们会这样实际应用,而是说在接收过程当中屡次接收数据才能完整接收客户端一次发送的数据,可能因为网络环境或发送数据端形成的,示意以下图:
例如实时数据的完整包为: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设置了协议过滤器,能够解决这个问题,以下图:
我原来并不知道粘包这个概念,后来在网上看文章才明白。在通信领域中也是常常会遇到的问题。也就是多包数据一次性的接收,那么就要合理的进行拆包。还有一种状况,就是多包半的数据一次性的接收,那半包的数据结合“1.一包多发及解决”来解决这个问题,示意以下图:
ServerSuperIO设置了协议过滤器,能够解决这个问题,以下图:
在工业领域受电缆或环境的电磁干扰,以及接头虚接等,这种状况极有可能出现。若是干扰的冗余数据夹杂在一个协议包中间,那么校验出合法的数据很困难。若是干扰的冗余数据夹杂在两个协议包中间,那么就能够经过协议过滤来实现识别出有用的数据。示意以下图:
ServerSuperIO设置了协议过滤器,能够解决这个问题,以下图:
FixedEndReceiveFliter:固定结尾的协议过滤器。 FixedHeadAndEndReceiveFliter:固定开头和结尾的协议过滤器。 FixedHeadAndLengthReceiveFliter:固定开头和长度的协议过滤器。 FixedHeadReceiveFliter:固定开头的协议过滤器。 FixedLengthReceiveFliter:固定长度的协议过滤器。
这5个过滤器都继承自IReceiveFilter接口,也能够继承这个接口进行二次开发,定制本身的协议过滤器。代码工程以下图:
对于开发设备驱动,在初始化过程当中能够增长这个驱动的协议过滤器,代码以下:
public override void Initialize(string devid) { this.Protocol.InitDriver(this.GetType(),new FixedHeadAndEndReceiveFliter(new byte[] {0x55,0xaa},new byte[] {0x0d} )); …… }
在配置参数中须要配置: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群:54256083