本文介绍了一个基于Java的多功能串口设备服务器。本服务器能够实现如下功能:(1) 接受从指定串口发送来的信号并将其转发到另外的串口、广播到局域网、或者是通过TCP/IP链接转发给局域网内的其它设备,从而实现局域网内部的信息共享;(2) 通过TCP/IP链接或者是串口接受其他设备发送给该串口设备的控制信息,从而实现设备的远程控制。
本文的第一部分对串口设备服务器进行简单介绍,并且详细描述了本多功能串 口设备服务器的系统设计。这是本文的第二部分,介绍本多功能串口设备服务器的 程序设计和功能测试。
程序设计
(1) 主控模块
主控模块的功能是初始化各项运行参数,同时启动远程控制模块。在这个简单 的串口设备服务器中并没有定义任何运行参数,因此主控模块的唯一功能是启动远 程控制模块。本模块从命令行接受一个参数,该参数指定远程控制模块所使用的端 口号,远程客户可以通过该端口对本系统进行控制和配置。本功能模块包括如下步 骤:
检查用户是否从命令行提供了一个参数。如果是,继续运行下一步;如果否,输出一条出错信息并退出系统。
检查用户所提供的命令行参数是否可以解释成一个端口号(一个整数)。如果是,继续运行下一步;如果否,输出一条出错信息并退出系统。
检查用户所提供的端口号是否系统端口(即小于1024)或者是无效端口( 即大于65535)。如果否,继续运行下一步;如果是,输出一条出错信息并退出系统。
声明一个远程控制模块,然后启动该模块。
主控模块被保存为DeviceServer.java。
(2) 远程控制模块
远程控制模块通过TCP/IP链接接受用户指令并根据指令实现如下功能:改变串口参数,与指定串口设备进行通讯,启动或者终止指定数据交换模块。根据系统需求,本模块又包括如下方法:
系统配置方法:
指定串口设备所在的串口;
指定与该串口设备通讯所使用的参数,包括波特率,数据位,停止位和奇偶性校验位。
指定其他设备所在的串口;
指定与其他设备通讯所使用的参数,包括波特率,数据位,停止位和奇偶性校验位。
指定数据广播端口,即客户机用来监听实时数据的端口。
指定数据服务端口,即客户机用来请求实时数据的端口。
指定数据交换模块。为简单起见,本系统一次只能够启动一个数据交换模块提供数据交换服务。
系统控制方法:
解释控制指令,这个方法解释客户机所发送的控制和配置指令,然后调用相应的系统控制或配置方法。
启动与串口设备的连接。
切断与串口设备的连接。在切断与串口设备的连接之前必须关闭所使用的端口或者是切断与客户机的联接。
启动数据交换模块。
终止数据交换模块。在终止数据交换模块之前必须关闭所使用的端口或者是切断与客户机的联接。
退出系统。在退出系统之前必须关闭所有端口,终止数据交换模块。由于这个功能模块所需要实现的功能比较多,为节省篇幅起见,以下示例程序中没有设计异常处理功能。在程序的注释行中,对有可能导致异常的地方添加了部分说明。
远程控制模块被保存为RemoteControl.java。
(3) 数据广播模块
数据广播模块的功能是接受串口设备的输出信号,然后将其通过广播将其转发 到局域网。在局域网中的所有设备都可以通过监听广播端口来获得串口设备所提供 的数据,从而使得多个设备同时共享一个特殊设备成为可能。这个功能模块首先建 立一个广播服务器,然后不断的监听串口设备的输出流。当输出流里面有数据存在 的时候,广播服务器将其取出并广播到局域网。
数据广播模块被保存为Broadcast.java。
(4) TCP/IP数据服务模块
TCP/IP数据服务模块的功能是接受串口设备的输出信号,然后通过TCP/IP连接 将其转发给客户机。这个模块还能够接受客户机通过TCP/IP连接发送来的控制信号 并将其转发给串口设备,从而实现了串口设备的远程控制与配置功能。在这个模块 中包括三个线程:服务器线程接受客户机的连接请求,数据服务线程监测串口设备 的输出流并将数据转发给客户机,控制信号服务线程监测客户机的输出流并将信号 转发给串口设备。为简单起见,这个示例程序一次只能够接受一个客户机的连接请 求,但是用户能够很容易的将其改写成能够同时为多个客户机提供服务。
TCP/IP数据服务模块被保存为ServeTcp.java。
(5) 串口数据服务模块
串口数据服务模块的功能是接受串口设备的输出信号,然后通过串口将数据转 发给其它通过串口连接的设备。与TCP/IP数据服务模块类似,这个模块还能够接受 客户设备通过串口发送来的控制信号并将其转发给串口设备,从而实现了串口设备 的远程控制与配置功能。通常来说,两个设备通过串口进行通讯要求这两个设备使 用相同的通讯参数,例如波特率,数据位,停止位和奇偶性校验位。但是对于很多 遗留设备来说,他们往往只能够使用固定的通讯参数进行工作,从而导致了由于两 个设备由于通讯参数不同而无法共享数据的问题。在这个示例程序中,不同的设备 可以使用不同的通讯参数,从而解决了具有不同固定通讯参数的设备之间的数据交 换问题。
在这个功能模块中包括两个线程:数据服务线程监测串口设备的输出流并将数 据转发给客户设备,控制信号服务线程监测客户设备的输出流并将信号转发给串口 设备。为简单起见,这个示例程序一次只能够为一个客户设备提供数据服务,但是 用户也能够很容易的将其改写成能够同时为多个客户设备提供服务。
串口数据服务模块被保存为ServeCom.java。
系统测试
本多功能串口设备服务器的测试应该在局域网中进行。优选的测试方案应该具备如下硬件条件:
计算机A -- 运行本多功能串口设备服务器。本机必须配备Java运行环境和由Sun公司提供的通讯扩展类库javax.comm,这些软件都可以从Java软件的主页www.javasoft.com免费下载。再进行测试之前必须根据该软件包所提供的说明文件正确进行安装,否则在测试的时候系统将无法找到本机串口。
计算机B -- 运行超级终端模拟一个串口设备,通过RS-232电缆与计算机A的串口COM1相连接。
计算机C -- 运行超级终端模拟其它串口设备,通过RS-232电缆与计算机A的串口COM2相连接。
计算机D -- 通过局域网与计算机A相连接,模拟局域网中向多功能串口设备服务器请求数据的其它网络设备。
在计算机A 上运行本多功能串口设备服务器,然后通过TELNET进入远程控制状态。用户通过命令行方式对服务器进行控制和配置。本服务器所提供的控制和配置指令如下:
SET DEVICE PORT
设定串口设备所在的串口。本命令接受一个整数参数,该参数指定串口设备所在的串口。
SET DEVICE PARAM
设定串口设备所使用的通讯参数。本命令接受一个参数串,如38400,8,1,0 表示波特率38400 ,数据位8,停止位1,无奇偶检验。
SET PEER PORT
设定其它设备所在的串口。本命令接受一个整数参数,该参数指定串口设备所在的串口。
SET PEER PARAM
设定其它设备所使用的通讯参数。本命令接受一个参数串,如38400,8,1,0 表示波特率38400 ,数据位8,停止位1,无奇偶检验。
SET BROADCAST PORT
设定数据广播端口。本命令接受一个整数参数,该参数指定客户机用来监听数据广播的端口。
SET SERVICE PORT
设定数据服务端口。本命令接受一个整数参数,该参数指定服务器用来提供数据服务的端口。
SET SERVICE TYPE
指定数据服务类型。本命令接受一个整数参数,1 表示数据广播服务,2 表示TCP/IP数据服务,3 表示串口数据服务。其它数值都是无效参数。
CONNECT TO DEVICE
接通串口设备。本命令不接受任何参数。
DISCONNECT FROM DEVICE
切断串口设备。本命令不接受任何参数。
START SERVICE
启动数据服务。本命令不接受任何参数。
STOP SERVICE
终止数据服务。本命令不接受任何参数。
SHUT DOWN
终止多功能串口设备服务器。本命令不接受任何参数。
QUIT
退出远程控制系统。本命令不接受任何参数。
由于远程控制服务器在处理命令之前将命令行转换成大写,因此用户可以用大写或者是小写输入控制与配置指令。
(1) 数据广播功能测试
计算机A 启动多功能串口设备服务器,计算机B 启动超级终端模拟串口设备。 启动多功能串口设备服务器时必须指定一个端口号(如8888)以提供远程控制服务。 利用Telnet进入远程控制程序(如telnet localhost 8888),就可以通过控制指令 控制和配置多功能串口设备服务器了。
需要说明的是,由于Windows 自带的Telnet程序不回显输入数据,因此用户看 不到自己所输入的命令。建议用户从一台类似于UNIX的系统远程Telnet到串口设备 服务器进行控制和配置。如果计算机A 的IP为90.0.0.1,多功能串口设备服务器的 远程控制服务程序运行在端口8888,那么用户就可以通过telnet 90.0.0.1 8888连 接到远程控制服务器。
用户连接到远程控制服务器后,运行如下命令:
SET DEVICE PORT 1
SET DEVICE PARAM 115200,8,1,0
CONNECT TO DEVICE
SET SERVICE TYPE 1
SET BROADCAST PORT 8080
START SERVICE
以上指令设定串口设备连接在COM1 ,通讯参数为115200,8,1,0。运行在计 算机B 上的超级终端应该使用同样的通讯参数。成功的与串口设备建立起连接后指 定8080为数据广播端口,再指定系统提供数据广播服务,最后启动数据广播服务。 这时候,在同一局域网内的其它计算机(如计算机D )就应该能够在8080端口监听到 由串口设备(计算机B )所发送的数据。
本文提供了一个示例程序可以用来监听广播到指定端口的数据。该程序从命令 行接受一个参数,这个参数指定监听的端口。这个程序被保存为BClient.java。
在机器D 上运行以上程序并指定8080为监听端口。在机器B 的超级终端窗口内 随意输入作为串口设备的输出数据,这些数据被多功能串口设备服务器所接收并实 时的广播到局域网,因此机器D 的屏幕上应该同时打印出这些数据来。如果局域网 网中同时还有其它计算机运行以上接收程序并指定8080为监听端口,那么这些计算 机也能够同时接收到串口设备的输出数据。
(2) TCP/IP数据服务功能测试
在远程控制终端输入如下控制指令测试TCP/IP数据服务功能:
STOP SERVICE
SET SERVICE TYPE 2
SET SERVICE PORT 8023
START SERVICE
以上控制指令指定多功能串口设备服务器在端口8023启动TCP/IP数据服务。从机器D 通过Telnet连接到该端口(如telnet 90.0.0.1 8023)就可以接收到串口设备所输出的数据。在机器D 上所输入的数据,也被实时的传送到串口设备,因此在机器B 的超级终端窗口内能够看到从机器D 所输入的数据。因此,局域网内的设备不但能够通过串口设备服务器利用该串口设备进行远程数据采集与处理,还能够实现串口设备的远程控制和配置。
(3) 串口数据服务功能测试
在远程控制终端输入如下控制指令测试串口数据服务功能:
STOP SERVICE
SET PEER PORT 2
SET PEER PARAM 38400,8,1,0
SET SERVICE TYPE 3
START SERVICE
以上控制指令指定其它串口设备被连接在COM2上,所使用的通讯参数为38400,8,1,0。 最后面两个控制指令指定系统运行串口数据服务。
计算机C 上运行超级终端程序,其通讯参数为38400,8,1,0。这时候串口设备(计算机B )可以接收到其它设备(计算机C )所发送的数据,其它设备(计算机C ) 也可以接收串口设备(计算机B )所发送的数据。我们注意到,两个串口设备( 计算机B 和C ) 所使用的通讯参数是不同的,但是他们可以通过这个多功能串口设备服务器进行数据交换。
(4) 其它功能测试
在远程控制终端输入如下控制指令: DISCONNECT FROM DEVICE
以上控制指令切断与串口设备的连接。如果当前正在提供远程数据服务( 如数据广播服务,TCP/IP数据服务,串口数据服务),这项服务将被关闭。
QUIT
以上控制指令终止客户机与远程控制终端的会话,多功能串口设备服务器的所有配置保持终止会话前的状态,正在提供的远程数据服务继续提供。
SHUT DOWN
以上控制指令强制停止多功能串口设备服务器的执行。当前正在提供的远程数据服务将被关闭,与串口设备的连接将被切断。
(5) 测试结果
作者对本系统的功能进行了全面的测试,实际测试环境如下:
计算机A -- Windows 2000英文版 + Java SDK 1.3 + Java Comm API
计算机B -- Windows 98英文版 + 超级终端
计算机C -- Windows 98英文版 + 超级终端
计算机D -- Windows 98英文版 + Java SDK 1.3
计算机E -- Red Hat 6.1
所有机器通过100M高速Ehternet连接。计算机B 通过RS-232电缆连接到计算机A 的COM1,计算机C 通过RS-232电缆连接到计算机A 的COM2。在实际测试中,通过计算机E 远程连接到计算机A 进行远程控制与配置。测试结果表明,该系统能够实现远程控制与配置与远程数据服务等全部功能。
结论
本文设计和实现了一个基于Java的多功能串口设备服务器。本多功能串口设备服务器能够实现如下功能:
远程控制与配置。
为串口设备提供远程数据服务。数据广播服务使得局域网内的多个设备能够同时利用一个串口设备所提供的数据;TCP/IP数据服务使得局域网内的设备能够通过TCP/IP连接获得串口设备所提供的数据,并且能够远程对该串口设备进行控制和配置;串口数据服务使得两个使用不同通讯参数的串口设备能够进行数据交换。
本系统不但实现了在局域网内的串口设备信息共享,并且大幅度提高了数据交换的速度和效率。
本系统在Windows 平台上测试成功。由于Java语言的垮平台特性,本系统只需要进行很小的改动就可以移植到其它平台上。
本系统在涉及到数据采集与处理的行业中具有广泛的应用前景。