1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍
《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制
一、综述
SuperIO(SIO)定位在PC终端(上位机)应用,它只有一个服务实例,配置参数是全局属性。但是,ServerSuperIO(SSIO)与SuperIO(SIO)定位不一样,SSIO定位在服务器端,不管是串口通讯模式,还是网络通讯模式,都支持多服务实例,所以每个服务实例都有自己的配置参数,全部配置参数的定义在ServerConfig.cs文件中。
如下图示意:
二、配置参数说明
#region 全局 [Category("1.全局"), DisplayName("ServerSession"), Description("标识服务的唯ID,一般为Guid"), DefaultValue(""), ReadOnly(true)] public string ServerSession { get; set; } [Category("1.全局"), DisplayName("ServerName"), Description("标识服务的标题名称"), DefaultValue("")] public string ServerName { get; set; } [Category("1.全局"), DisplayName("DeliveryMode"), Description("接收数据后的分布策略,包括:按设备IP分发(DeviceIP)、按设备编码分发(DeviceCode)"), DefaultValue(DeliveryMode.DeviceIP)] public DeliveryMode DeliveryMode { get; set; } [Category("1.全局"), DisplayName("ControlMode"), Description("调度设备驱动和IO实例的策略,包括:循环模式(Loop)、并发模式(Parallel)、自主模式(Self)和单例模式(Singleton)"), DefaultValue(ControlMode.Loop)] public ControlMode ControlMode { get; set; } [Category("1.全局"), DisplayName("StartReceiveDataFliter"), Description("标识接收数据后是否按协议过滤器的规划过滤数据,不启用则直接返回数据"), DefaultValue(false)] public bool StartReceiveDataFliter { get; set; } [Category("1.全局"), DisplayName("StartCheckPackageLength"), Description("标识是否检测数据长度,如果开启,那么会调用协议驱动的GetPackageLength接口,直到接收返回的数据长度的数据"), DefaultValue(false)] public bool StartCheckPackageLength { get; set; } #endregion #region 串口 [Category("2.串口"), DisplayName("ComReadBufferSize"), Description("设置一次接收数据的字节数组最大值"), DefaultValue(1024)] public int ComReadBufferSize { get; set; } [Category("2.串口"), DisplayName("ComWriteBufferSize"), Description("设置一次发送数据的字节数组最大值"), DefaultValue(1024)] public int ComWriteBufferSize { get; set; } [Category("2.串口"), DisplayName("ComReadTimeout"), Description("设置一次读取数据的超时时间"), DefaultValue(1000)] public int ComReadTimeout { get; set; } [Category("2.串口"), DisplayName("ComWriteTimeout"), Description("设置一次发送数据的超时时间"), DefaultValue(1000)] public int ComWriteTimeout { get; set; } [Category("2.串口"), DisplayName("ComLoopInterval"), Description("轮询模式下,发送和接收数据中间的等待时间,串口通讯不支持其他控制模式"), DefaultValue(1000)] public int ComLoopInterval { get; set; } #endregion #region 网络 [Category("3.网络"), DisplayName("NetReceiveBufferSize"), Description("设置一次接收数据的字节数组最大值"), DefaultValue(1024)] public int NetReceiveBufferSize { get; set; } [Category("3.网络"), DisplayName("NetSendBufferSize"), Description("设置一次发送数据的字节数组最大值"), DefaultValue(1024)] public int NetSendBufferSize { get; set; } [Category("3.网络"), DisplayName("NetReceiveTimeout"), Description("设置一次读取数据的超时时间"), DefaultValue(1000)] public int NetReceiveTimeout { get; set; } [Category("3.网络"), DisplayName("NetSendTimeout"), Description("设置一次发送数据的超时时间"), DefaultValue(1000)] public int NetSendTimeout { get; set; } [Category("3.网络"), DisplayName("NetLoopInterval"), Description("轮询模式下,发送和接收数据中间的等待时间"), DefaultValue(1000)] public int NetLoopInterval { get; set; } [Category("3.网络"), DisplayName("MaxConnects"), Description("允许客户端最大的连接数,超取最大值,自动关闭远程连接"), DefaultValue(1000)] public int MaxConnects { get; set; } [Category("3.网络"), DisplayName("KeepAlive"), Description("检测死连接、半连接的一种机制"), DefaultValue(5000)] public uint KeepAlive { get; set; } [Category("3.网络"), DisplayName("ListenPort"), Description("侦听接收数据的端口"), DefaultValue(6699)] public int ListenPort { get; set; } [Category("3.网络"), DisplayName("BackLog"), Description("定队列中最多可容纳的等待接受的传入连接数"), DefaultValue(1000)] public int BackLog { get; set; } [Category("3.网络"), DisplayName("CheckSameSocketSession"), Description("对一个固定的设备,只允许有一个有效连接,重复IP多次连接,将断开之前的连接"), DefaultValue(true)] public bool CheckSameSocketSession { get; set; } [Category("3.网络"), DisplayName("SocketMode"), Description("标识设备是TcpServer、TcpClient模式,如果标识TcpClient模式,会主动连接远程IP和端口"), DefaultValue(SocketMode.Tcp)] public SocketMode SocketMode { get; set; } [Category("3.网络"), DisplayName("ClearSocketSession"), Description("标识是否清理连接,如果一个连接在一定时间范围内没有接收到数据,将主动断开连接"), DefaultValue(false)] public bool ClearSocketSession { get; set; } [Category("3.网络"), DisplayName("ClearSocketSessionInterval"), Description("如果标识清理连接,那么在此标识清理连接间隔时间"), DefaultValue(10)] public int ClearSocketSessionInterval { get; set; } [Category("3.网络"), DisplayName("ClearSocketSessionTimeOut"), Description("如果标识清理连接,那么在此标识多长时间没有接收到数据进行清理"), DefaultValue(30)] public int ClearSocketSessionTimeOut { get; set; } #endregion
三、常用配置参数说明
常用的配置参数包括:通讯参数类、控制参数类、以及一些高级的应用参数。如下代码
IServer server = new ServerFactory().CreateServer(new ServerConfig() { ServerName = "服务1", //服务实例的名称 ComReadTimeout = 1000, //串口读数据超时 ComWriteTimeout = 1000, //串口发送数据超时 NetReceiveTimeout = 1000, //网络接收数据超时 NetSendTimeout = 1000,//网络发送数据超时 ControlMode = ControlMode.Parallel,//控制模式 SocketMode = SocketMode.Tcp, //网络通讯是TCP模式还是UDP模式 StartReceiveDataFliter = false,//是否开启接收数据过滤器,后面重要介绍 ClearSocketSession = false,//是否检测网络实例的有效性,后面重要介绍 StartCheckPackageLength = false //是否检测包长度,后面重要介绍 });
ControlMode参数是SSIO结合现实应用场景的控制模式,主要用于调用设备的发送和接收数据的调度方式。请参见:《连载 | 物联网框架ServerSuperIO教程》1.4种通讯模式机制。
四、配置工具
二次开发者,可以通过ServerSuperIO.Tool项目来配置服务实例、设备驱动和服务实例的参数。如下图:
注:下篇文章介绍设备驱动
1.[连载]《C#通讯(串口和网络)框架的设计与实现》
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