赵明芳,刘 军,杨 青
(中国电子科技集团公司第四十一研究所,山东 青岛 266500)
随着用户需求的日益复杂,电磁监测系统业务种类增多,组网内不同监测角色间协同监测任务数量及复杂度同步加大。不同业务场景对数据及其传输实时性、数据链路特性均有不同的需求,因此需要统一并简化电磁频谱监测系统中各角色功能间的数据通信格式,以统一的数据通信协议简化数据接口,提高数据交互效率。电磁监测系统中常用的数据通信协议有HTTP 超文本传输协议和XML语法格式接口协议两种方式。
超文本传输协议(HyperText Transfer Protocol,HTTP)属于应用层的面向对象的协议,主要用于从WWW 服务器传输超文本到本地浏览器。数据传输时,客户端与服务器建立连接。传输过程中,客户端向服务器发送请求消息,服务器收到请求消息后返回响应消息。请求与响应结束后,客户端主动释放连接。该接口协议包含请求消息和响应消息两种消息格式,实现简洁的表达请求和正确的解析与展示。
可扩展标记语言(eXtensible Markup Language,XML)是一种实用的结构化通用标记语言。XML 独立于平台和语言,基于统一的语法规范,以纯文本方式实现数据的传输与存储。以某监测管理一体化平台为例,采用自定义的XML 同步请求/应答消息格式即服务名称(服务终结点,请求命令/响应消息),实现客户端、服务端、数据库以及设备间的数据通信。例如:对某监测中心(IP:172.16.51.41)的某监测站(ID:21131)的某台监测接收机(ID:89AE12)发起对定频信号121.9 MHz 以500 kHz 中频带宽连续测量IQ 结果的测量服务请求。
请求命令XML 文本如下:
设计实现频谱监测系统的通信接口协议时需考虑两个方面。一方面,数据传输实时性要求。依据业务场景对响应数据的实时性要求,接口协议包含同步与异步两部分。另一方面,消息格式。在此采用JSON(JavaScript Object Notation)轻量级的数据交换格式。相比XML,JSON 更加符合电磁监测系统在跨平台、表达能力、编码与解析难度、数据体积与提升网络传输效率等方面的需求[1]。下面分别说明电磁频谱监测系统通信接口协议的同步请求/应答接口协议和异步数据传输接口协议。
该协议适用于同步请求与应答机制的服务,如设备状态查询等。它包含Request 请求消息和Response 响应消息两种消息格式。
2.1.1 Request 请求消息
请求消息由Request Line(请求行)、Request Header(请求头)和Body(请求正文)3 部分组成。消息结构与JSON 文本格式,如图1 所示。
请求消息JSON 文本格式如下:
服务消费方发送JSON 文本请求消息到服务方,消息结构中的3 部分对应JSON 文本格式中的3 个键/值对,键名为字符串,分别以“RequestLine”“Header”“Body”代表请求行、请求头与请求正文,键值为JSON 对象,即嵌套的键/值对。
(1)请求行。该部分包含服务名称和服务地址两个信息,对应具体服务名称与服务执行的地址。该行对应请求消息的第一个键/值对,键名“RequestLine”,键值是JSON 对象,包含请求行的两个分量信息:一是服务名称,键名“ServiceName”,键值是格式为“服务类别代码_功能代码”的字符串;二是服务地址,键名“URL”,键值是格式为http://host[:port]的字符串。host 是服务端主机IP 地址,port 是服务端主机端口号。以某监测中心使用某设备进行定频测量服务为例,请求行为:
(2)请求头。该部分包含与请求正文相关的信息。因不同服务类型(如设备服务或数据服务)的请求正文内容与语法格式存在差别,该部分用于帮助解析请求消息。请求头对应请求消息的第二个键/值对,键名“Header”,键值是JSON 对象,键值包含格式为:
“键名”:值的分量信息
各分量信息的键名为代表一定意义的字符串。为实现消息结构简单、通俗易懂、便于后续解析,值尽量采用string、double 及bool 类型,不再嵌套复杂的数值结构,如JSON 对象或数组。
请求头示例:
(3)请求正文。该部分包含具体的请求数据,数据内容由服务类别决定。例如:设备服务的请求正文包含与设备测量相关的参数,数据库服务包含查询数据库等信息。请求正文对应请求消息的第三个键/值对,键名“Body”,键值是JSON 对象,键值包含请求服务的参数信息,是同步请求/应答通信接口协议设计的重点。各分量信息的格式为:
“键名”:值
用于分组管理不同类别参数及其包含的具体参数。键名指定参数类别,值的数据类型有bool、double、string、null、JSON 对象以及JSON 数组共6 种。为便于区分管理复杂、大数据量的请求消息,一般采用对象或数组类型。
设备服务请求正文示例:对102.9 MHz 的定频信号以200 kHz 中频带宽连续测量spectrum 结果。
2.1.2 Response 响应消息
响应消息由Response Line(响应行)、Response Header(响应头)以及Body(响应正文)3 部分组成。消息结构与JSON 文本格式,如图2 所示。
响应消息JSON 文本格式如下:
服务方发送JSON 文本响应信息到服务消费方,消息结构中的3 个部分对应JSON 文本格式中的3 个键/值对,键名为字符串,分别以“ResponseLine”“Header”、“Body”代表响应行、响应头与响应正文,键值为JSON 对象,即嵌套的键/值对。
(1)响应行。该部分包含状态码和状态描述两个信息,用于返回服务请求处理的状态。该行对应响应消息的第一个键/值对,键名“ResponseLine”,键值是JSON 对象,包含响应行的两个分量信息。一是状态码,键名“Code”,键值是3 位数字组成的字符串,首位数字定义了状态码所属类型(如成功、等待、重试以及取消等),后两位数字代表当前状态类型中包含的具体返回状态。二是状态描述,键名“Message”,键值是状态码的具体描述字符串,说明服务请求处理的情况。
响应行示例:成功接收请求消息,并成功处理。
(2)响应头。该部分包含与响应正文的相关信息。与请求头类似,该部分用于帮助解析响应消息。响应头对应响应消息的第二个键/值对,键名“Header”,键值是JSON 对象,其中包含格式为:
“键名”:值的分量信息
键名称为代表一定意义的字符串,分量值的设计原则与请求头的设计原则一致。
响应头示例:
(3)响应正文。该部分包含请求服务处理后返回的响应数据,如返回的仪器设备状态、数据库查询信息以及测量结果数据等。该部分对应响应消息的第3 个键/值对,键名“Body”,键值是JSON对象,包含对应的请求服务的响应数据信息。因涉及的响应信息种类多、数据量大,该部分也是同步请求/应答通信接口协议设计的重点。各分量信息的格式为:
“键名”:值
用于分组管理不同类别响应数据。键名指定响应数据类别,键值包含具体的响应数值。响应正文的设计原则与请求正文的设计原则一致。
某个设备服务响应正文示例:对105.9 MHz 的定频信号以200 kHz 中频带宽连续测量IQ 结果。
该接口协议适用需要大数据量或者持续的数据传输的业务场景,但对数据传输的实时性要求相对较弱,如自动化监测功能。异步传输方式包括字节流、文件或者数据库等。其中,文件与数据库操作均具备配套的工具与操作方法。监测系统多涉及监测设备的连续测量任务,常采用字节流(stream)方式实现异步数据传输,如IQ 数据、频谱数据等。图3 是字节流传输方式的异步数据传输帧格式。
字节流包含1~n个数据帧,每个数据帧由帧头、数据头以及数据体组成。帧结构可灵活组合、剪裁,数据头部分可选。帧头包含当前帧的公共信息,如帧版本、帧类型等。帧体是数据实体,由数据头与数据体组成。数据体由若干子数据块组成,每个子数据块由数据块头与数据组成。数据头描述数据体组成及帧数据的公共数据(公共工作参数/测量结果等),长度不固定,与帧类型、数据体关联的任务模式相关。数据块位于数据头后,将工作参数或结果数据划分为多个部分,使一帧可携带多种、大量的数据。数据块由数据块头与数据组成,其中数据块头描述当前数据块的数据部分的属性、字节长度信息,而数据是数据块的数据实体[2]。
该数据通信协议设计方法已应用于某电磁频谱监测系统软件开发,经测试验证其平台适应性好,能够覆盖监测业务的复杂数据类型,编程适应性及可扩展性强,易于编码解码,且传输的数据体积小,能够有效提升网络传输效率等,很好地解决了监测系统数据通信协议不统一、重复以及管理维护困难的问题。