0 引 言
燃氣在城市建設中的術物設計應用越來越廣泛,用戶種類和數量迅猛增長,聯網用氣結構呈現多元化。工商要實現對燃氣的業燃應用合理利用, 燃氣的氣無計量收費管理工作非常重要 [1]。燃氣表用戶大致分為工業用戶與居民用戶兩種,線抄由于兩種燃氣表的表平使用環境不同, 因而抄表方式也存在很大的術物設計差異,但大體可分為兩種,即人工抄表和自動抄表。人工抄表耗時大,成本高,存在入戶不及時、錯抄、漏抄的可能,因此自動抄表大勢所趨 [2]。隨著無線通信行業技術的發展,越來越多的無線技術被應用到電力、水力和燃氣的無線抄表系統中。
目前在民用燃氣抄表系統中的無線采集方案多由無線燃氣表、集中器、手持機及后臺抄表系統組成。無線燃氣表采用LoRa 或 ZigBee 無線擴頻技術,將各住戶家中的燃氣數據定時上送到集中器,在集中器上安裝 GPRS 通信模塊,定時遠傳給后臺抄表系統中。當抄表遇到故障時可根據后臺抄表系統的提示定位到具體用戶,再派專業的技術人員到現場通過手持機重抄或檢查故障。這種抄表方式有效解決了燃氣公司目前使用單純基表帶來的數據收集不及時、入戶難、無法了解移表、拆表和竊盜氣現象及難于保障安全監測等問題,相比傳統的RS 485 集中自動抄表方式解決了布線困難的問題,非常適合部分年代久遠小區的改造。
但工業用戶不宜采取以上方式。對于民用無線抄表,小區住戶集中,集中器的安裝較方便,一般一個采集器可通過LoRa 無線連接至少 200 臺燃氣表,便于集中采集管理并減少通過GPRS 上送數據的流量。可對于各工業用燃氣用戶來說, 不具備地理上的集中優勢,用戶分散排布,無法集中安裝燃氣表。對于這種散落分布的工業燃氣用戶,可在燃氣基表上加裝GPRS 通信模塊,使每個分散的工業用戶作為獨立個體直接上傳數據到后臺系統中,避免因地理位置分散,給抄表人員帶來的極大不便,同時也節省了大量人力、物力和財力。
1 思想架構
1.1 系統架構設計
在工業燃氣皮膜表基表上直接加裝 GPRS通信模塊后, 從燃氣表上讀取的數據可實時或定時上傳到后臺抄表平臺系統中。抄表平臺采用 B/S架構,任意聯網的瀏覽器只要具有一定的權限都可進行訪問操作。底層燃氣表通過GPRS方式通信, 采用 TCP/IP互聯網傳輸協議,應用層協議為《工業預付費遠程表通訊協議》。后臺軟件系統分為數據采集服務前置端,客戶操作服務端兩大類。系統架構如圖 1所示。
無線燃氣表每隔一小時會采樣保存一個點,每天通過GPRS 定時上線一次,上線后將 24 個點的數據同時發送到數據采集服務器,服務器將數據直接寫入后臺數據庫。但這種頻繁的I/O 操作較耗時,抓取每個設備數據到數據成功寫入數據庫大約需要 3 s 的時間。隨著在某個時間點上線設備數量增多,數據的延遲時間將增加,導致每個燃氣表的維持在線時間加長,增加了燃氣表的功耗,減少了電池的使用時間。頻繁更換電池不僅增加了使用成本,也為用戶帶來了不必要的麻煩,此時考慮將數據采集服務器部分的數據庫交互部分與采集部分獨立開來,以分擔數據采集服務器的負擔,Redis 技術因此被引入。
1.2 Redis簡介及特性
Redis(Remote Dictionary Server)基于遠程字典服務, 是非關系型數據庫(Not Only SQL,NoSQL)產品之一,它支持網絡、key-value 模型等存儲系統, 可用作數據庫、高速緩存和消息隊列代理 [3]。Redis 的出現,很大程度補償了memcached key/value 存儲的不足,在部分場合可對關系數據庫起到很好的補充作用。其支持的存儲 value 類型包括 string(字符串),list(鏈表),set(無序集合),zset(sorted set 有序集合)和 hash,也可將 Redis 看成一個數據結構服務器。這些數據類型都支持 push/pop,add/remove 及交集、并集和差集運算,Redis 支持各種不同方式的排序。數據緩存在內存中, 可周期性地把更新的數據寫入磁盤或把修改操作寫入追加的記錄文件,并實現 master-slave(主從)同步。它提供了 Java, C/C++,C#,PHP,JavaScript,Perl,Object-C,Python, Ruby,Erlang 等客戶端,使用方便。
Redis 是基于 C/C++ 開發的一款 K-V 數據庫,特點是運行快,使用類 Telnet 協議 [4]。
Redis 具有如下特性 :
(1)性能高。Redis 讀的速度是 110 000 次 /s,寫的速度是 81 000 次 /s ;
(2)豐富的數據類型。Redis 支持二進制案例的 Strings,Lists,Hashes,Sets 及 Ordered Sets 數據類型操作 ;
(3)Redis 的所有操作都是原子性的,同時 Redis 還支持對幾個操作全并后的原子性執行 ;
(4)豐富的特性。Redis 還支持 publish/subscribe(發布訂閱模式),通知,key 過期等。
1.3 Redis的使用
安裝好 Redis 數據服務器,確定好通道名稱,采用發布 / 訂閱方式,即數據采集服務器通過 Redis 的發布方式將采集的數據發布到 Redis 數據服務器中,任務完成即返回。客戶Web 訪問服務器通過訂閱方式將接收到的發布數據批量寫入數據庫中,實現整體數據采集,有效分擔數據采集服務器的工作,實現了分布式架構。在當前的物聯網大環境下,Redis 技術突顯了分布式架構的技術優勢。
2 實現方法
本次設計的數據采集服務器軟件平臺用 Java 語言編程實現,TCP/IP 部分采用開源的 Mina 框架實現了多線程的整合調度,再配合 Redis 技術,采用 JSON 格式發布 / 訂閱的消息,規范統一。
連接 Redis 服務器代碼如下:
Public static void ConnectRedis()
{
if(jedisPool!=null)
{
jedisPool.destroy();
jedisPool=null ;
}
Jed isPoolCon f ig m Jed isPoolCon f ig = new
JedisPoolConfig();
// 最大空閑連接數,默認 8 個
mJedisPoolConfig.setMaxIdle(8);
// 可用連接實例的最大數目,默認值為 8
// 如果賦值為 -1,則表示不限制
mJedisPoolConfig.setMaxTotal(GloableData.
RedisConnectCount);
// 等待可用連接的最大時間,單位 ms,默
認值為 -1,表示永不超時。如果超過等待時間,則直接拋出
JedisConnectionException
mJedisPoolConfig.setMaxWaitMillis(10000);
// 在 borrow 1 個 jedis 實例時, 是否提前進行
validate 操作 ;如果為 true,則得到的 jedis 實例均是可用的 ;
mJedisPoolConfig.setTestOnBorrow(true);
mJedisPoolConfig.setBlockWhenExhausted
(true);
mJedisPoolConfig.setTestOnReturn(true);
mJedisPoolConfig.setTimeBetweenEvictionRuns
Millis(30000);
jedisPool=newJedisPool(mJedisPoolConfig,
GloableData.RedisAddress, GloableData.RedisPort);
}
將發布的數據發送到 Redis 服務器上的代碼如下;
Public static void PublishDataTORedis(String strData)
{
Jedisjedis = null ;
try
{
jedis = jedisPool.getResource();
String strChannel=GloableData.RedisChannelName ;
jedis.publish(strChannel, strData);
nRedisCount++ ;
}
catch(Exception e)
{
logger.info("Redis 發送異常:{ }",Common.
getStackTree(e));
jedisPool.returnBrokenResource(jedis);
// 歸還異常的 jedis 對象
}
finally
{
// 返還到連接池
close(jedis);
}
}
從上述代碼中可以看出 Redis 的使用非常簡便,大大縮短了開發周期并有效分擔了數據采集服務器的工作負荷。采用 Redis 技術后,每個燃氣表的采集時間縮短到 500 ms以內,燃氣表確認服務器收到數據后立刻下線,有效節省了電池電量,收到了良好的效果。
3 結 語
無線燃氣抄表技術已被廣泛用于各燃氣公司,數據上送到平臺后,可擴展的業務,如統計查詢、對比分析、線上線下預付費等,均可利用互聯網方式進行,使用戶有更好的體驗和更靈活的操作方式。
本文提到的 Redis 技術已經成功應用到無錫燃氣公司對部分工商業燃氣用戶的改造項目中,采用華潤物聯網軟件平臺實現了對燃氣用戶數據的讀取和統計,具有廣闊的應用前景。