王紅剛,王征風(fēng),王英強(qiáng),付耀鋒
(1.西安思源學(xué)院,陜西 西安 710038;2.西北有色金屬研究院,陜西 西安 710016)
2016年2月,國(guó)家發(fā)展改革委、國(guó)家能源局、工業(yè)和信息化部聯(lián)合制定的《關(guān)于推進(jìn)“互聯(lián)網(wǎng)+”智慧能源發(fā)展的指導(dǎo)意見》中提出,互聯(lián)網(wǎng)+“能源”將使用先進(jìn)的傳感器、控制和軟件應(yīng)用程序,將能源生產(chǎn)端、能源傳輸端、能源消費(fèi)端的數(shù)以億計(jì)的設(shè)備、機(jī)器、系統(tǒng)連接起來,形成能源互聯(lián)網(wǎng)[1]。能源互聯(lián)網(wǎng)通過整合各行業(yè)數(shù)據(jù),進(jìn)行大數(shù)據(jù)分析,打通并優(yōu)化能源生產(chǎn)和能源消費(fèi)端的運(yùn)作效率,使需求和供應(yīng)將可以進(jìn)行隨時(shí)的動(dòng)態(tài)調(diào)整。
海南省瓊海市由于改革步伐的加快,農(nóng)業(yè)加工產(chǎn)業(yè)發(fā)展較快,特別是當(dāng)?shù)靥厣еa(chǎn)業(yè)檳榔加工業(yè)發(fā)展更快。燃?xì)馐菣壚萍庸I(yè)的主要能源,但是檳榔加工廠安全基礎(chǔ)設(shè)施數(shù)字化、智能化建設(shè)比較緩慢,不能滿足檳榔加工業(yè)飛快發(fā)展的需求,嚴(yán)重影響著檳榔加工廠的安全保障[2]。
JEECG是一款基于代碼生成器的智能開發(fā)平臺(tái)[3],采用Java語言,支持敏捷開發(fā),使開發(fā)者專注于具體業(yè)務(wù)的開發(fā),短時(shí)間內(nèi)構(gòu)建企業(yè)應(yīng)用,同時(shí)保證了系統(tǒng)的復(fù)用性和二次開發(fā)特性,其越來越受到開發(fā)者的歡迎。
為此,文章提出了基于JEECG的燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)框架,以MYSQL為數(shù)據(jù)存儲(chǔ)模式,采用面向服務(wù)分層架構(gòu)和組件化思想,提升了燃?xì)鈮毫ΡO(jiān)測(cè)平臺(tái)的通用性和可維護(hù)性。
燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)框架如圖1所示,分為基礎(chǔ)設(shè)施層、數(shù)據(jù)層、接口層、應(yīng)用支撐層、應(yīng)用服務(wù)層、門戶層等,同時(shí)通過一個(gè)統(tǒng)一的安全保障體系和標(biāo)準(zhǔn)規(guī)范體系來保障數(shù)據(jù)通信的安全。
圖1 燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)總體框架
各層的主要功能如下:
基礎(chǔ)設(shè)施層主要為燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)提供硬件和軟件運(yùn)行環(huán)境。
數(shù)據(jù)層采用MySQL數(shù)據(jù)庫(kù),存儲(chǔ)用戶信息、設(shè)備基本信息、設(shè)備地理位置、設(shè)備狀態(tài)信息、設(shè)備異常信息、壓力數(shù)據(jù)信息、設(shè)備預(yù)警信息等,作為本系統(tǒng)的基礎(chǔ)數(shù)據(jù)。
接口層包含業(yè)務(wù)接口、數(shù)據(jù)接口,其中業(yè)務(wù)接口進(jìn)行業(yè)務(wù)數(shù)據(jù)的邏輯算法設(shè)計(jì),完成了壓力數(shù)據(jù)協(xié)議解析等復(fù)雜數(shù)據(jù)操作接口,為應(yīng)用支撐層提供業(yè)務(wù)應(yīng)用支持。數(shù)據(jù)接口實(shí)現(xiàn)DAO(data access object)的設(shè)計(jì)和開發(fā),將所有對(duì)數(shù)據(jù)庫(kù)的訪問操作抽象封裝在一系列的API中[4-5],供業(yè)務(wù)應(yīng)用使用。
應(yīng)用支撐層是整體應(yīng)用系統(tǒng)建設(shè)的基礎(chǔ)保障。根據(jù)本平臺(tái)的需求,進(jìn)行了面向服務(wù)體系架構(gòu)設(shè)計(jì),實(shí)現(xiàn)了相關(guān)應(yīng)用組件[6-7],包括GIS服務(wù)、消息服務(wù)、安全服務(wù)、編碼解碼、報(bào)表工具、查詢引擎、下發(fā)指令等應(yīng)用組件。
應(yīng)用服務(wù)層主要包含燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)的8個(gè)子系統(tǒng),包括設(shè)備管理子系統(tǒng)、區(qū)域信息管理子系統(tǒng)、參數(shù)信息管理子系統(tǒng)、指令管理子系統(tǒng)、實(shí)時(shí)壓力監(jiān)測(cè)子系統(tǒng)、報(bào)表管理子系統(tǒng)、歷史數(shù)據(jù)分析子系統(tǒng)、數(shù)據(jù)采集子系統(tǒng)等。
門戶層主要包含的是一組具有相同標(biāo)準(zhǔn)和相同規(guī)范體系的網(wǎng)站群[8]。它涵蓋了主站、各級(jí)子網(wǎng)站以及移動(dòng)終端網(wǎng)站等。同時(shí)門戶層為應(yīng)用服務(wù)層的不同應(yīng)用提供信息資源的不同表現(xiàn)形式。
系統(tǒng)在對(duì)海南省瓊海市檳榔加工業(yè)燃?xì)馐褂们闆r調(diào)查的基礎(chǔ)上,結(jié)合智慧能源行業(yè)的特點(diǎn),做了詳細(xì)的需求分析。燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)設(shè)計(jì)的主要使用者包括系統(tǒng)管理員、壓力監(jiān)測(cè)人員、設(shè)備維護(hù)人員。其中,系統(tǒng)管理員可以在系統(tǒng)中進(jìn)行菜單信息管理、用戶信息管理、角色信息管理、數(shù)據(jù)再點(diǎn)維護(hù)、參數(shù)信息維護(hù)等。壓力監(jiān)測(cè)人員完成系統(tǒng)核心功能的管理,主要包含實(shí)時(shí)壓力監(jiān)測(cè)、歷史壓力數(shù)據(jù)分析、設(shè)備指令下發(fā)、數(shù)據(jù)采集、實(shí)時(shí)壓力報(bào)警、壓力數(shù)據(jù)報(bào)表等。設(shè)備維護(hù)人員實(shí)現(xiàn)對(duì)設(shè)備基本信息管理、設(shè)備狀態(tài)信息管理、區(qū)域信息管理、區(qū)域負(fù)責(zé)人管理等。
系統(tǒng)主要用例圖如圖2所示。
圖2 燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)主要用例圖
燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)包括設(shè)備管理子系統(tǒng)、區(qū)域信息管理子系統(tǒng)、參數(shù)信息管理子系統(tǒng)、指令管理子系統(tǒng)、實(shí)時(shí)壓力監(jiān)測(cè)子系統(tǒng)、報(bào)表管理子系統(tǒng)、歷史數(shù)據(jù)分析子系統(tǒng)、數(shù)據(jù)采集子系統(tǒng)等,功能模塊如圖3所示。
(1)設(shè)備管理子系統(tǒng):該功能借助百度地圖實(shí)現(xiàn)燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)中設(shè)備的添加、修改、刪除等。利用百度地圖獲取設(shè)備安裝的經(jīng)度、緯度和具體的位置名稱,并且在地圖實(shí)現(xiàn)按照區(qū)、街道辦等準(zhǔn)確定位。
(2)區(qū)域信息管理子系統(tǒng):該功能借助百度地圖實(shí)現(xiàn)區(qū)域地理位置劃分,并在地圖上進(jìn)行地理范圍標(biāo)注,給每個(gè)區(qū)域范圍指定相應(yīng)的設(shè)備維護(hù)人員。
(3)參數(shù)管理子系統(tǒng):該子系統(tǒng)實(shí)現(xiàn)對(duì)壓力監(jiān)測(cè)設(shè)備基本參數(shù)的設(shè)置,包括實(shí)時(shí)壓力上限、實(shí)時(shí)壓力下限、電壓上限、電壓下限、發(fā)送數(shù)據(jù)時(shí)間間隔等。
(4)指令管理子系統(tǒng):該子系統(tǒng)實(shí)現(xiàn)對(duì)壓力監(jiān)測(cè)設(shè)備的遠(yuǎn)程操作,壓力監(jiān)測(cè)人員可以根據(jù)需要修改設(shè)備的參數(shù)數(shù)據(jù),主要包含設(shè)備的開關(guān)狀態(tài)、壓力數(shù)據(jù)采集時(shí)間間隔、壓力報(bào)警閾值等。
(5)壓力監(jiān)測(cè)子系統(tǒng):該功能實(shí)現(xiàn)對(duì)實(shí)時(shí)壓力的管理,并對(duì)實(shí)時(shí)壓力進(jìn)行分析,判斷是否在正常壓力范圍內(nèi)。
(6)歷史數(shù)據(jù)分析子系統(tǒng):該功能實(shí)現(xiàn)對(duì)每個(gè)設(shè)備所產(chǎn)生的歷史數(shù)據(jù)進(jìn)行樣本統(tǒng)計(jì)分析,從而確定該設(shè)備采集數(shù)據(jù)時(shí)間間隔等指標(biāo)。
(7)報(bào)表管理子系統(tǒng):該功能負(fù)責(zé)對(duì)解碼后的壓力數(shù)據(jù)進(jìn)行分析,產(chǎn)生實(shí)時(shí)動(dòng)態(tài)曲線變化圖,實(shí)時(shí)狀態(tài)圖,報(bào)表等。
(8)數(shù)據(jù)采集子系統(tǒng):該功能負(fù)責(zé)從中國(guó)電信物聯(lián)網(wǎng)開放平臺(tái)獲取實(shí)時(shí)壓力數(shù)據(jù),并將數(shù)據(jù)存放到燃?xì)鈮毫ΡO(jiān)控系統(tǒng)相應(yīng)數(shù)據(jù)表中。
圖3 燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)功能模塊圖
NB-IoT設(shè)備和中國(guó)電信物聯(lián)網(wǎng)開放平臺(tái)之間采用CoAP協(xié)議通訊,CoAP消息的payload為應(yīng)用層數(shù)據(jù),應(yīng)用層數(shù)據(jù)的格式由設(shè)備自行定義[9]。由于NB-IoT設(shè)備一般對(duì)省電要求較高,所以應(yīng)用層數(shù)據(jù)一般采用二進(jìn)制格式或者tlv格式。設(shè)備廠商需要提供編解碼插件,平臺(tái)負(fù)責(zé)調(diào)用編解碼插件,實(shí)現(xiàn)二進(jìn)制消息轉(zhuǎn)Json格式的功能,以提供應(yīng)用服務(wù)器使用[10]。
另外,Profile文件定義了該Json格式的具體內(nèi)容,因此編解碼插件開發(fā)前需要先編寫設(shè)備的Profile文件。在Profile文件中主要描述一款設(shè)備的能力信息,包含該設(shè)備的識(shí)別屬性和提供的服務(wù)(功能)列表,其中設(shè)備型號(hào)識(shí)別屬性:設(shè)備類型、廠商、型號(hào)、協(xié)議類型。
服務(wù)列表:提供具體的功能服務(wù)說明列表[11-12]。編碼解碼插件開發(fā)流程如圖4所示。
圖4 編解碼插件開發(fā)流程
該燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)主要采用的是西安中星測(cè)控有限公司提供的Chinastar-CSiGPM02智能壓力監(jiān)測(cè)器,該設(shè)備能測(cè)量各種氣體和流體的壓力、壓差等。針對(duì)該設(shè)備實(shí)現(xiàn)編碼解碼插件的步驟如下:
(1)編寫Profile文件。
"devices":[
{
"manufacturerId": "Chinastar",
"manufacturerName": "Chinastar",
"model": "CSiGPM02",
"protocolType": "CoAP",
"deviceType": "PressureMonitor",
"serviceTypeCapabilities": [
{
"serviceId": "Basic",
"serviceType": "Basic",
"option": "Mandatory"
}
……
]
}
(2)應(yīng)用層協(xié)議解析。
例如,在該設(shè)備執(zhí)行“AT+NMGS=7,00002023050101”發(fā)送上行數(shù)據(jù)。上報(bào)數(shù)據(jù)的AT命令為:AT+NMGS=7,00002016050101。具體解析如下:AT+NMGS=N,XXXXXXXXXX為上報(bào)數(shù)據(jù)的AT命令格式,其中“N”表示一共上報(bào)幾個(gè)字節(jié),后面為具體的上報(bào)字節(jié)內(nèi)容,以十六進(jìn)制字符串表示。在該指令中,一共上報(bào)7個(gè)字節(jié),分別為“00”、“00”、“20”、“16”、“05”、“01”、“01”。其中,第一個(gè)字節(jié)“00”表示上報(bào)數(shù)據(jù)deviceReq,第二個(gè)字節(jié)“00”表示沒有后續(xù)數(shù)據(jù),第三個(gè)字節(jié)“20”表示溫度32,第四個(gè)字節(jié)“23”表示當(dāng)前壓力35 Kpa,第五個(gè)字節(jié)“05”表示電壓值5 V,第六個(gè)字節(jié)“01”表示鎖1狀態(tài)關(guān)閉,第七個(gè)字節(jié)“01”表示鎖2狀態(tài)關(guān)閉。
燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)編碼解碼插件應(yīng)用層協(xié)議解析主要完成了以下上行數(shù)據(jù)的解析:
·基礎(chǔ)數(shù)據(jù):主要包括電池的電壓、電量數(shù)據(jù)。
·連接信息:主要包括信號(hào)強(qiáng)度、信噪比等數(shù)據(jù)。
·設(shè)備信息:主要包括設(shè)備ID、設(shè)備類型、設(shè)備SN、心跳時(shí)間、報(bào)警周期、采樣周期等數(shù)據(jù)。
·設(shè)備狀態(tài):主要包括設(shè)備的報(bào)警狀態(tài)、布防狀態(tài)、無線模塊狀態(tài)、電池狀態(tài)、云端應(yīng)答狀態(tài)等數(shù)據(jù)。
·壓力數(shù)據(jù):主要包括設(shè)備的實(shí)時(shí)壓力數(shù)據(jù)。
(3)編寫兩個(gè)應(yīng)用接口。
(a)decode接口的入?yún)inaryData為設(shè)備發(fā)過來的CoAP報(bào)文的payload部分。主要為設(shè)備的上行數(shù)據(jù)。decode接口的入?yún)⒔Y(jié)構(gòu)如表1所示。
表1 decode接口的入?yún)⒔Y(jié)構(gòu)
表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接口的入?yún)son格式數(shù)據(jù),是平臺(tái)下發(fā)的命令或應(yīng)答。encode接口的入?yún)⒔Y(jié)構(gòu)定義如表3所示。
表3 encode接口的入?yún)⒔Y(jié)構(gòu)
核心代碼如下:
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],可以統(tǒng)一事務(wù)管理。MiniDao-PE支持SQL語句和Java代碼的分離、支持自動(dòng)事務(wù)處理和手動(dòng)事務(wù)處理,輕松實(shí)現(xiàn)與hibernate輕量級(jí)無縫集成等[14]。具體實(shí)現(xiàn)步驟如下:
(1)接口定義,核心代碼如下:
@MiniDao
public interface EmployeeDao {
@Arguments("employee")
public List
@Arguments("empno")
EmployeegetEmployee(String empno);
…
}
(2)接口方法對(duì)應(yīng)SQL文件創(chuàng)建。
Sql文件定位到dao接口的方法,dao接口的每個(gè)方法對(duì)應(yīng)一個(gè)sql文件。
SQL文件命名規(guī)則:{Dao接口名} _{方法名}.sql
簡(jiǎn)單SQL,也可以采用方法注釋標(biāo)簽。例如:
@Sql("SELECT count(*) FROM employee")
IntegergetCount();
(3)編寫SQL文件內(nèi)容。
SQL文件采用模板語言Freemarker語法[15-16],可以靈活運(yùn)用,甚至可以寫腳本語言、宏處理等。例如:
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參數(shù)標(biāo)簽和@Param參數(shù)標(biāo)簽設(shè)置。
@Arguments({"empno","name"})
Map getMap(String empno,String name);
項(xiàng)目建成了海南省瓊海市天然氣壓力監(jiān)測(cè)系統(tǒng)。該系統(tǒng)提供了用戶管理功能、權(quán)限管理功能、設(shè)備管理功能、設(shè)備定位功能、數(shù)據(jù)采集功能、編解碼功能、數(shù)據(jù)分析功能、壓力預(yù)警功能、日志管理功能等。
系統(tǒng)對(duì)燃?xì)庠O(shè)備進(jìn)行24小時(shí)監(jiān)測(cè),可實(shí)時(shí)掌握燃?xì)庠O(shè)備運(yùn)營(yíng)情況,為燃?xì)庠O(shè)備管理提供科學(xué)依據(jù)。并且該系統(tǒng)對(duì)燃?xì)鈮毫M(jìn)行實(shí)時(shí)采集,當(dāng)氣體發(fā)生泄漏時(shí),監(jiān)控室及管理部門可在第一時(shí)間做出反應(yīng),對(duì)提高生產(chǎn)安全性具有重要意義。
針對(duì)能源天然氣行業(yè)背景,文中提出了解決方案,使用JEECG平臺(tái)和面向服務(wù)思想設(shè)計(jì)了燃?xì)鈮毫ΡO(jiān)測(cè)系統(tǒng)。該系統(tǒng)包含了目前天然氣安全領(lǐng)域信息化管理的常用功能,系統(tǒng)對(duì)天然氣壓力進(jìn)行24小時(shí)監(jiān)測(cè),并記錄了歷史壓力數(shù)據(jù)等,從而為燃?xì)馄髽I(yè)的安全運(yùn)營(yíng)提供支持。