Redis技术在物联网工商业燃气无线抄表平台的设计与应用
扫描二维码
随时随地手机看文章
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 技术已经成功应用到无锡燃气公司对部分工商业燃气用户的改造项目中,采用华润物联网软件平台实现了对燃气用户数据的读取和统计,具有广阔的应用前景。