一类多线程综合通信管理器的设计和实现

2019-05-24 14:21陈容华李方方
无线互联科技 2019年2期
关键词:多线程串口通信网络通信

陈容华 李方方

摘 要:文章提出了在计算机系统工程中广泛应用的集网络通信与RS232串口通信等综合信道通信管理器的功能需求,叙述了该通信管理器既可以作为通信服务器,又可以作为局域网前端通信控制器的具体工作模式,给出了该通信管理器的设计思路和具体实现方法,并描述了个部分的执行流程。

关键词:多线程;网络通信;串口通信;.Net;C#

随着互联网与物联网技术的应用,各种与之相应的新技术和新应用层出不穷。但归根到底,所有的应用都是基于对相关设备的运行和状态信息进行采集、存储及在网络上进行传输。在当前的实际工程项目中,需要有这样一类通信前置服务器,即可以与后台客户端进行通信,充当前端通信服务器,接收并处理来自这些客户端的各类请求。另一方面,这种通信服务器又需要作为客户端,与作为服务器端的现场设备进行相连,这类通信管理器广泛应用于工业现场的数据采集和信息传输系统中。目前工程上开发的这类通信管理器都与具体的项目直接关联,也就是与具体系统的数据传输规约直接关联,这一类系统应用较好的通信控制器往往不能方便地移植到其他系统,严重制约了其推广应用[1]。本文叙述设计和实现一种通用型的通信管理器的思路和方法,这种通信管理器将具体的数据通信规约与通信服务进行彻底分离,确保开发出的通信管理器更加具有通用性。涉及实现的通信服务器可接入不同类型的客户端,尽管这些客户端采用不同的通信技术,本通信服务器都能够为这些不同类型的客户端提供数据服务。

该通信管理器系统基于TCP/IP通信协议,使用较为成熟的开发平台Visual studio IDE。围绕提供了多种属性和操作函数的Microsoft WinSocket控件及串口空間来编写代码,同时考虑系统通信的实时性,运用了多线程技术。

1 功能需求

前置通信服务器功能要求如下:(1)接收来自经授权的客户端的连接请求,与客户端建立TCP连接。(2)接收来自客户端的数据报文,存储、显示并实时处理这些报文。(3)将这些报文通过各类接口(串口或Can总线等)转发给有关现场设备。(4)接收现场运行的有关设备的上传的各类报文信息,并将此报文信息进行存储处理,同时回传给客户端[2]。

2 设计与实现

2.1 RS232通信实现

通信管理器的RS232通信部分使用了C#提供的SerialPort控件来实现对串口通信过程进行控制。该控件的命名空间为System.IO.Ports。

实际编程实现时,除需要设置这些属性参数外,还需要调用SerialPort控件的常用函数。

SerialPort控件的常用事件为DataReceived,用该函数直接处理SerialPort 对象的数据接收事件。

系统启动后,将首先初始化串口,设置串口号(支持多个串口同时通信)、通信波特率、数据位、校验位、停止位。然后调用open函数打开串口。当串口SerialPort控件侦听到有数据时,触发DataReceived事件,启动数据接收函数,将缓冲区的数据字节都入到一个数组中,然后通过该其他通信方式转发到后台客户机中,并将这些通信报文存储在本地日志文件中。

2.2 Socket控件类

本系统的网络通信基于TCP/IP协议,一般此类协议实现的基本流程为:首先在服务器端新建一个通信套接字,服务器处于等待监听状态,但服务器端serverSocket并不定位具体的客户端socket,而是实时监控网络的状态。当客户端的某个连接套接字clientSocket向服务器发送连接请求(其目标是服务器的serverSocket)时,clientSocket必须知道serverSocket的地址和端口号,发出连接请求。当服务器socket监听到或者是收到客户端socket的连接请求时,服务器就立即响应客户端的请求(有时可根据安全需要,拒绝客户端的连接请求),建立一个新的Socket,把服务器Socket发送给客户端,一旦客户端确认连接,则连接建立。上述流程的实现都通过事件触发产生。

由于前置通信服务器既需要为后台客户端提供接入服务,同时需要请求连接现场的监控设备,因此,本系统同时具备服务器和客户机双重通信功能,无疑增加了系统的复杂性。因此,本系统设计主要思想为:利用C#控件为服务器端实现与后台客户机进行通信,而通过创建若干个Socket对象来与现场监控设备(作为服务端,处在侦听状态,IP地址与端口号已知)进行连接。

为此,在通信服务器上,设置一个定时器,如50 ms,定时监测现场设备是否上线,当现场设备上线后,由于这些设备IP地址是固定的,通信服务器将循环扫描每个设备的上线状态,并对未连接成功的远端发起连接,如果检测到连接成功状态,将这些套接字放入一个Socket队列中[3]。

程序执行中,当某一Socket有数据输入时,启动触发事件,在DataArrival函数中读入网络中远端的数据,放入某一队列,由其他进程进行处理。

2.3 Tcplistener类与多线程

通信服务器需要对后台管理机进行通信,此时,又要将它设置成服务模式,为此,需采用多线程技术。正好在C#中,针对网络通信,提供了一个专门的类Tcplistener,这个类是对Socket Tcp协议封装的接口,更便于用户的开发。利用Tcplistenner类的各类函数,编程要点描述如下。

(1)建立Tcp监听器TcpListener对象。

TcpListener serverListenner = new TcpListener (IPAddress.Any, IPAddr,Port);

其中IPAddress.Any是固定参数,IPAddr为本服务器的IP地址,Port为端口号。

(2)调用serverListenner对象的Start函数启动侦听。此时,新建一个新的线程tNetClient,定义为客户端连接线程,并且启动该线程。具体代码如下。

listener.Start();

tNetClient = new Thread(AcceptClient);

tNetClient.IsBackground = true;

tNetClient.Start();

(3)當有客户端连接进来,执行客户端连接线程,具体代码如下。

private void AcceptClient(){

while (true)

{

TcpClient thisClient = listener.AcceptTcpClient();

winSocketClients.Add(thisClient);

}

}

(4)通过Socket的Receive方法获取客户端发送的数据

byte [] resData = new byte[2048];

int kLen = s.Receive(resData);

(5)通过Socket的Send方法向客户端发送数据

byte[] sendData=System.Text.Encoding.Default.GetBytes(“text”);

mySocket .Send(sendData);

程序将定时扫描各个连接套接字,如有远程端点发过来的数据,则启动接受程序,读入数据,并存入缓存中,待其他线程处理。

3 结语

本文针对既需要为多个后台工作站提供通信服务,又要同时接入多个远程服务器的需求,设计出符合功能需求的综合通信管理器,系统设计运用了各类控件技术和多线程编程技术。并用C#编程语言,实现了最终的系统。经实际运行测试,系统稳定可靠。

[参考文献]

[1]詹姆斯·库罗斯.计算机网络:自顶向下方法[M].7版.北京:机械工业出版社,2018.

[2]尹圣雨.TCP/IP网络编程[M].北京:人民邮电出版社,2014.

[3]邢彦辰.数据通信与计算机网络[M].北京:人民邮电出版社,2011.

[4]Chenjx2014.RS-232通信程序设计[EB/OL].(2017-03-09)[2018-12-24].https://blog.csdn.net/haitaolang/article/details/60956456.

猜你喜欢
多线程串口通信网络通信
基于网络通信的智能照明系统设计
网络通信中信息隐藏技术的应用
基于网络通信的校园智能音箱设计
谈计算机网络通信常见问题及技术发展
基于Qt和Flash的嵌入式Linux软件架构设计
Java并发工具包对并发编程的优化