网络化仪器仪表协议客户端设计与实现

  • 投稿暗灭
  • 更新时间2015-09-11
  • 阅读量520次
  • 评分4
  • 60
  • 0

庞新法

(陕西省委党校科技教研部,陕西西安710061)

摘要:提出如何通过实现网络化仪器仪表间的通信来完成仪器间协同工作,从而最大程度地发挥网络化仪器测量系统的效率。为了实现网络化仪器间的通信,需将HiSLIP协议、虚拟仪器设计技术与网络化测控系统相结合,并利用HiSLIP协议的可靠连接以及高效数据传输特点,设计网络化仪器间的通信,从而给出协议客户端设计与实现。

教育期刊网 http://www.jyqkw.com
关键词 :网络化仪器;HiSLIP协议;通信;网络化测控系统

中图分类号:TN911?34;TP312 文献标识码:A 文章编号:1004?373X(2015)18?0122?03

0 引言

随着网络技术的广泛应用,仪器仪表已开始向计算机化、网络化、智能化方向发展,仪器网络化的发展趋势,使得其已经不再是孤立的、单独的设备,而是将测试技术、互联网技术、计算机技术结合在一起的网络仪器系统。但网络化仪器间难以进行协同工作,进而限制测量系统测量效率。为了实现网络化仪器间的通信,本文将HiSLIP 协议、虚拟仪器设计技术与网络化测控系统相结合,利用HiSLIP 协议的可靠连接以及高效数据传输特点,设计网络化仪器间的通信原理,并给出了协议客户端设计与实现。

仪器代理作为网络管理结构中的核心实体,存在于被管理的网络设备中,用来访问设备的运行状态,对设备参数进行配置,是被管设备与管理中心交互的中间接口。

HiSLIP协议客户端的功能主要划分为4部分:协议启动和前期准备;与服务器端建立连接;与服务器端的数据交互;容错处理.。客户端与服务器端的交互种类分为14类,通过这14类交互,完整实现协议所需要的功能,在进行交互说明时以“ <消息类型> <控制码><消息参数> <数据长度> <数据>”的格式来表示消息。

1 协议启动

在控制端应用程序启动时,协议的客户端即开始启动,在启动过程中,向操作系统申请Socket套接字资源[1?2]。并进行端口绑定,协议规范中建议使用4880 端口。对4880端口绑定完成后,即可向由VISA提供的仪器端的网络代理IP地址发起连接。

2 建立连接

HiSLIP协议连接的建立使用的是TCP机制,由客户端向服务器端发起2次TCP连接,分别是该协议的同步通道连接和异步通道连接。在建立好2 个TCP 连接之后,还需要检查服务器端仪器上加锁的情况,相互协商交互信息时的消息尺寸。为后续的数据和控制信息的交互提供服务。

2.1 建立连接使用到的消息类型序列

(1)由客户端发起第1个TCP连接;

(2)使用消息类型Initialize 进行同步通道连接初始化;在该消息中包含的数据有客户端协议版本;客户端厂商ID;子地址。消息格式为:<Initialize> <0> <up?per:client?protocol?version:lower :client?vendorID> <sub?address>;

(3)发起第2个TCP连接;

(4)使用消息类型AsyncInitialize 进行异步通道连接初始化,在该消息中包含由应用软件推送的Sessio?nID(会话号)。格式为:<AsyncInitialize> <0> <Sessio?nID> <0>。

2.2 对远端仪器进行锁操作的消息类型序列

(1)首先通过AsyncLockInfo消息类型,来向远端服务器请求当前仪器资源上锁的情况,有服务器返回是否已经加锁、锁的类型以及锁的数目等消息。格式为:<AsyncLockInfo> <0> <0> <0>。

(2)在查询后确认可以对远端仪器加锁时,使用消息类型AsyncLock 来实现对远端仪器资源加锁和释放锁。在该消息中包含的数据有,请求加锁标志位和请求释放锁标志,等待加锁超时时间,锁信息描述等。加锁消息的格式为:<AsyncLock> <1=request> <timeout><LockString length> <LockString>;释放锁的消息格式为:<AsyncLock> <0 =release> <MessageID> <0>。

2.3 客户端和服务器协商发送消息的尺寸使用的消息序列

客户端通过AsyncMaximumMessageSize消息类型来告知服务器自己的能够接收的消息尺寸,该消息中包含由8 B 无符号整形数据表示的消息尺寸信息。消息格式为:<AsyncMaximumMessageSize> <0> <0> <8> <8?byte size>。

3 数据交互

数据交互是这个协议的核心部分,客户端在与服务器端建立连接后,使用Data 和DataEND 两种消息类型的消息发送数据。如果应用软件推送给客户端的数据,可以满足不超过最大消息长度的情况下,使用DataEND消息类型进行发送,如果超过了最大消息长度,则先使用Data 消息类型进行发送若干,在剩余的数据不超过最大消息尺寸时,使用DataEND发送剩余的数据[3]。所以,所有的消息都是以DataEND消息类型实现数据的完整发送。通信双方交互时使用的消息类型序列如下:客户端使用Data 消息类型的消息来发送数据;消息中包含的数据有交付标志信息RMT?delivered,该消息的消息编号MessageID,消息长度以及由应用软件推送的数据。格式为:<Data> <RMT?delivered> <MessageID><length> <data>。

客户端使用DataEND消息类型的消息来发送数据;消息中包含的其他信息与上一条中一致。格式为:<Da?taEND> <RMT?delivered> <MessageID> <length> <data> 。这部分代码如下:

void send_dataend(hislip_message *send_message,int mes?sage_id,int data_len)

{

strncpy(send_message?>prologue,"HS",2);

send_message?>type=DATA_END;

send_message?>parameter=message_id;

send_message?>control=0x00;

send_message?>data_len=htonll(i(long long int)data_len);

}

void send_data (hislip_message *send_message,int mes?sage_id,int data_len)

{

strncpy(send_message?>prologue,"HS",2);

send_message?>type=DATA;

send_message?>parameter = message_id;

send_message?>control = 0x00;

send_message?>data_len=htonll(i(long long int)data_len);

}

4 容错处理

容错处理是在连接未成功或者协议运行故障时的操作,以保证协议能够稳定实现相关功能。在协议的14类交互中,容错处理包含:致命错误及同步恢复交互(Fatal Error Detection and Synchronization Recovery);错误告知交互(Error Notification Transaction);中断交互(Interrupted Transaction)。

致命错误及同步恢复交互[4],客户端和服务器端都会使用到,设置消息类型为FatalError,该消息包含的数据有错误码(ErrorCode)、数据长度和数据。消息格式为:<FatalError> <ErrorCode> <0> <length> <message>。如果该消息由客户端发送给服务器端,在客户端发送完毕并关闭连接后,客户端再次向服务器端发起HiSLIP连接。如果发送该消息由服务器端发送给客户端,则直接关闭。

错误告知交互[5],客户端和服务器端双方都会使用到,使用的消息类型为Error,其他字段内容与“致命错误及同步恢复交互”中的一致,不同的是,双方不管哪一方收到这个消息,都不需要做出其他动作,消息格式为:<Error> <ErrorCode> <0> <length> <message>。

中断交互,仅服务器端使用,在服务器部分进行说明,本文不在详述。

5 辅助处理交互

除了上述的交互过程,协议本身也定义了一些辅助的交互过程,能够实现附属功能,这些交互有:远程/本地控制交互(Remote Local Transaction);触发信息交互(Trigger Message);服务请求交互(Service Request);状态查询交互(Status Query Transaction);设备清除交互(Device Clear Transaction);厂商定义交互(Vendor De?fined Transactions)。

远程/本地控制交互[6],为GPIB设备提供服务,客户端向服务器端发送数据时,使用到的消息类型为Asyn?cRemoteLocalControl,消息中包含的数据有控制码(request),消息ID。消息格式为:<AsyncRemoteLocal?Control> <request> <MessageID> <0>。

触发信息交互[7],为了模拟GPIB设备组触发使用到的交互,客户端向服务器端发送消息时使用的消息类型为Trigger,消息中包含的数据主要有RTM交付标志,消息ID。消息格式为:<Trigger> <RMT?delivered> <Mes?sageID> <0>。

服务请求交互,是服务器使用交互,在服务器部分进行说明。

状态查询交互,是为了客户端查询服务器端的状态,返回的状态码(status),客户端发送给服务器进行状态查询时使用的消息类型为AsyncStatusQuery,消息中包含的数据有RTM 交付标志,消息ID。消息格式为:

<AsyncStatusQuery> <RMT?delivered> <MessageID> <0>。

设备清除交互,是为了清除通信的通道,由客户端向服务器端发起,客户端的消息序列如下:

客户端发送AsyncDeviceClear消息,消息中不包含其他数据,发送完消息后等待进程中的同步消息处理完成。消息格式为:<AsyncDeviceClear> <0> <0> <0>。

客户端发送DeviceClearComplete消息,消息中包含特征标志请求(featureRequest)。消息格式为:<Device?ClearComplete> <featureRequest> <0> <0>。

厂商定义交互,客户端和服务器端都可以发送这个消息,使用的消息类型为VendorDefined,消息中的数据都是任意数,消息格式为:<VendorDefined> <arbi?trary> <arbitrary > <length> <payload>。

6 程序设计实现

根据上述设计过程以及各种交互的含义,时序关系,进行程序设计,程序实现使用C语言实现,程序中的模块主要有,通道建立初始化模块,数据接受模块,数据发送模块等。下面通过协议客户端的主要函数,说明程序设计中的功能实现:

static int client_initialize(void)

实现初始化客户端,初始化完成后,向服务器端发起的HiSLIP连接。

static int client_handle_async_message_size()

处理服务器端发送的协商双方发送的消息尺寸的请求消息。

static int client_recv_message_handle()

接收从服务器端发送过来的数据,并进行初步处理,对接收的数据包按照消息类型进行识别,识别后调用相关功能函数予以处理。

static int client_handle_async_lock()

处理服务器端发送的加锁和释放锁反馈。

void client_send_data()和void client_send_dataend()实现向服务器端发送数据操作。

7 结语

本文通过对协议客户端的详细设计,并在此基础上结合服务器端的设计及控制端和仪器网络代理的设计,实现了仪器间通信。在实验中通过示波器A 和示波器B间的通信测试,证明本文提出的方案能够实现仪器与控制端、仪器和仪器的通信。

教育期刊网 http://www.jyqkw.com
参考文献

[1] 王建新,隋美丽.Labwindows/CVI虚拟仪器测试技术及工程应用[M].北京:化学工业出版社,2011.

[2] 余成波,王士彬,李洪兵.网络化仪器技术与实现[M].北京:清华大学出版社,2010.

[3] 林玉池.测量控制与仪器仪表前沿技术及发展趋势[M].天津:天津大学出版社,2005.

[4] ROBBINS A. Linux programming by example [M].北京:中国电力出版社,2006.

[5] 宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.

[6] 陈莉君,康华.Linux操作系统原理与应用[M].北京:清华大学出版社,2006

[7] 李宥谋,刘钊远,马博.嵌入式系统开发[M].北京:清华大学出版社,2011.

作者简介:庞新法(1962—),男,陕西礼泉人,副教授。研究方向为计算机教学与软件开发。