王红刚,王征风,王英强,付耀锋
(1.西安思源学院,陕西 西安 710038;2.西北有色金属研究院,陕西 西安 710016)
2016年2月,国家发展改革委、国家能源局、工业和信息化部联合制定的《关于推进“互联网+”智慧能源发展的指导意见》中提出,互联网+“能源”将使用先进的传感器、控制和软件应用程序,将能源生产端、能源传输端、能源消费端的数以亿计的设备、机器、系统连接起来,形成能源互联网[1]。能源互联网通过整合各行业数据,进行大数据分析,打通并优化能源生产和能源消费端的运作效率,使需求和供应将可以进行随时的动态调整。
海南省琼海市由于改革步伐的加快,农业加工产业发展较快,特别是当地特色支柱产业槟榔加工业发展更快。燃气是槟榔加工业的主要能源,但是槟榔加工厂安全基础设施数字化、智能化建设比较缓慢,不能满足槟榔加工业飞快发展的需求,严重影响着槟榔加工厂的安全保障[2]。
JEECG是一款基于代码生成器的智能开发平台[3],采用Java语言,支持敏捷开发,使开发者专注于具体业务的开发,短时间内构建企业应用,同时保证了系统的复用性和二次开发特性,其越来越受到开发者的欢迎。
为此,文章提出了基于JEECG的燃气压力监测系统框架,以MYSQL为数据存储模式,采用面向服务分层架构和组件化思想,提升了燃气压力监测平台的通用性和可维护性。
燃气压力监测系统框架如图1所示,分为基础设施层、数据层、接口层、应用支撑层、应用服务层、门户层等,同时通过一个统一的安全保障体系和标准规范体系来保障数据通信的安全。
图1 燃气压力监测系统总体框架
各层的主要功能如下:
基础设施层主要为燃气压力监测系统提供硬件和软件运行环境。
数据层采用MySQL数据库,存储用户信息、设备基本信息、设备地理位置、设备状态信息、设备异常信息、压力数据信息、设备预警信息等,作为本系统的基础数据。
接口层包含业务接口、数据接口,其中业务接口进行业务数据的逻辑算法设计,完成了压力数据协议解析等复杂数据操作接口,为应用支撑层提供业务应用支持。数据接口实现DAO(data access object)的设计和开发,将所有对数据库的访问操作抽象封装在一系列的API中[4-5],供业务应用使用。
应用支撑层是整体应用系统建设的基础保障。根据本平台的需求,进行了面向服务体系架构设计,实现了相关应用组件[6-7],包括GIS服务、消息服务、安全服务、编码解码、报表工具、查询引擎、下发指令等应用组件。
应用服务层主要包含燃气压力监测系统的8个子系统,包括设备管理子系统、区域信息管理子系统、参数信息管理子系统、指令管理子系统、实时压力监测子系统、报表管理子系统、历史数据分析子系统、数据采集子系统等。
门户层主要包含的是一组具有相同标准和相同规范体系的网站群[8]。它涵盖了主站、各级子网站以及移动终端网站等。同时门户层为应用服务层的不同应用提供信息资源的不同表现形式。
系统在对海南省琼海市槟榔加工业燃气使用情况调查的基础上,结合智慧能源行业的特点,做了详细的需求分析。燃气压力监测系统设计的主要使用者包括系统管理员、压力监测人员、设备维护人员。其中,系统管理员可以在系统中进行菜单信息管理、用户信息管理、角色信息管理、数据再点维护、参数信息维护等。压力监测人员完成系统核心功能的管理,主要包含实时压力监测、历史压力数据分析、设备指令下发、数据采集、实时压力报警、压力数据报表等。设备维护人员实现对设备基本信息管理、设备状态信息管理、区域信息管理、区域负责人管理等。
系统主要用例图如图2所示。
图2 燃气压力监测系统主要用例图
燃气压力监测系统包括设备管理子系统、区域信息管理子系统、参数信息管理子系统、指令管理子系统、实时压力监测子系统、报表管理子系统、历史数据分析子系统、数据采集子系统等,功能模块如图3所示。
(1)设备管理子系统:该功能借助百度地图实现燃气压力监测系统中设备的添加、修改、删除等。利用百度地图获取设备安装的经度、纬度和具体的位置名称,并且在地图实现按照区、街道办等准确定位。
(2)区域信息管理子系统:该功能借助百度地图实现区域地理位置划分,并在地图上进行地理范围标注,给每个区域范围指定相应的设备维护人员。
(3)参数管理子系统:该子系统实现对压力监测设备基本参数的设置,包括实时压力上限、实时压力下限、电压上限、电压下限、发送数据时间间隔等。
(4)指令管理子系统:该子系统实现对压力监测设备的远程操作,压力监测人员可以根据需要修改设备的参数数据,主要包含设备的开关状态、压力数据采集时间间隔、压力报警阈值等。
(5)压力监测子系统:该功能实现对实时压力的管理,并对实时压力进行分析,判断是否在正常压力范围内。
(6)历史数据分析子系统:该功能实现对每个设备所产生的历史数据进行样本统计分析,从而确定该设备采集数据时间间隔等指标。
(7)报表管理子系统:该功能负责对解码后的压力数据进行分析,产生实时动态曲线变化图,实时状态图,报表等。
(8)数据采集子系统:该功能负责从中国电信物联网开放平台获取实时压力数据,并将数据存放到燃气压力监控系统相应数据表中。
图3 燃气压力监测系统功能模块图
NB-IoT设备和中国电信物联网开放平台之间采用CoAP协议通讯,CoAP消息的payload为应用层数据,应用层数据的格式由设备自行定义[9]。由于NB-IoT设备一般对省电要求较高,所以应用层数据一般采用二进制格式或者tlv格式。设备厂商需要提供编解码插件,平台负责调用编解码插件,实现二进制消息转Json格式的功能,以提供应用服务器使用[10]。
另外,Profile文件定义了该Json格式的具体内容,因此编解码插件开发前需要先编写设备的Profile文件。在Profile文件中主要描述一款设备的能力信息,包含该设备的识别属性和提供的服务(功能)列表,其中设备型号识别属性:设备类型、厂商、型号、协议类型。
服务列表:提供具体的功能服务说明列表[11-12]。编码解码插件开发流程如图4所示。
图4 编解码插件开发流程
该燃气压力监测系统主要采用的是西安中星测控有限公司提供的Chinastar-CSiGPM02智能压力监测器,该设备能测量各种气体和流体的压力、压差等。针对该设备实现编码解码插件的步骤如下:
(1)编写Profile文件。
"devices":[
{
"manufacturerId": "Chinastar",
"manufacturerName": "Chinastar",
"model": "CSiGPM02",
"protocolType": "CoAP",
"deviceType": "PressureMonitor",
"serviceTypeCapabilities": [
{
"serviceId": "Basic",
"serviceType": "Basic",
"option": "Mandatory"
}
……
]
}
(2)应用层协议解析。
例如,在该设备执行“AT+NMGS=7,00002023050101”发送上行数据。上报数据的AT命令为:AT+NMGS=7,00002016050101。具体解析如下:AT+NMGS=N,XXXXXXXXXX为上报数据的AT命令格式,其中“N”表示一共上报几个字节,后面为具体的上报字节内容,以十六进制字符串表示。在该指令中,一共上报7个字节,分别为“00”、“00”、“20”、“16”、“05”、“01”、“01”。其中,第一个字节“00”表示上报数据deviceReq,第二个字节“00”表示没有后续数据,第三个字节“20”表示温度32,第四个字节“23”表示当前压力35 Kpa,第五个字节“05”表示电压值5 V,第六个字节“01”表示锁1状态关闭,第七个字节“01”表示锁2状态关闭。
燃气压力监测系统编码解码插件应用层协议解析主要完成了以下上行数据的解析:
·基础数据:主要包括电池的电压、电量数据。
·连接信息:主要包括信号强度、信噪比等数据。
·设备信息:主要包括设备ID、设备类型、设备SN、心跳时间、报警周期、采样周期等数据。
·设备状态:主要包括设备的报警状态、布防状态、无线模块状态、电池状态、云端应答状态等数据。
·压力数据:主要包括设备的实时压力数据。
(3)编写两个应用接口。
(a)decode接口的入参binaryData为设备发过来的CoAP报文的payload部分。主要为设备的上行数据。decode接口的入参结构如表1所示。
表1 decode接口的入参结构
表2 ArryNode定义
核心代码如下:
public ObjectNode decode(byte[] binaryData) throws Exception {
try {
ReportProcess lightProcess=new ReportProcess(binaryData);
ObjectNode objectNode=lightProcess.toJsonNode();
logger.info("dynamic lrbtest "+objectNode.toString());
return objectNode;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
(b)encode接口的入参json格式数据,是平台下发的命令或应答。encode接口的入参结构定义如表3所示。
表3 encode接口的入参结构
核心代码如下:
public byte[] encode(ObjectNode input) throws Exception {
logger.info("dynamic lrbtest "+input.toString());
try {
CmdProcess cmdProcess=new CmdProcess(input);
byte[] byteNode=cmdProcess.toByte();
return byteNode;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
MiniDao-PE是一款Java持久化框架,类似mybatis的持久层解决方案[13],可以统一事务管理。MiniDao-PE支持SQL语句和Java代码的分离、支持自动事务处理和手动事务处理,轻松实现与hibernate轻量级无缝集成等[14]。具体实现步骤如下:
(1)接口定义,核心代码如下:
@MiniDao
public interface EmployeeDao {
@Arguments("employee")
public List
@Arguments("empno")
EmployeegetEmployee(String empno);
…
}
(2)接口方法对应SQL文件创建。
Sql文件定位到dao接口的方法,dao接口的每个方法对应一个sql文件。
SQL文件命名规则:{Dao接口名} _{方法名}.sql
简单SQL,也可以采用方法注释标签。例如:
@Sql("SELECT count(*) FROM employee")
IntegergetCount();
(3)编写SQL文件内容。
SQL文件采用模板语言Freemarker语法[15-16],可以灵活运用,甚至可以写脚本语言、宏处理等。例如:
SELECT * FROM employee where 1=1
<#ifemployee.age ?exists> and age = '${employee.age}'
#if>
<#ifemployee.name ?exists> and name =
'${employee.name}'
#if> <#ifemployee.empno ?exists> and empno = '${employee.empno}'
#if>
(4)@Arguments参数标签和@Param参数标签设置。
@Arguments({"empno","name"})
Map getMap(String empno,String name);
项目建成了海南省琼海市天然气压力监测系统。该系统提供了用户管理功能、权限管理功能、设备管理功能、设备定位功能、数据采集功能、编解码功能、数据分析功能、压力预警功能、日志管理功能等。
系统对燃气设备进行24小时监测,可实时掌握燃气设备运营情况,为燃气设备管理提供科学依据。并且该系统对燃气压力进行实时采集,当气体发生泄漏时,监控室及管理部门可在第一时间做出反应,对提高生产安全性具有重要意义。
针对能源天然气行业背景,文中提出了解决方案,使用JEECG平台和面向服务思想设计了燃气压力监测系统。该系统包含了目前天然气安全领域信息化管理的常用功能,系统对天然气压力进行24小时监测,并记录了历史压力数据等,从而为燃气企业的安全运营提供支持。