APP下载

基于CRC报文缓存技术的IC水卡预付费终端设计

2018-06-27石晨曹永忠

无线互联科技 2018年5期

石晨 曹永忠

摘 要:以STM32为控制核心,IC卡为预付费载体,文章设计了IC水卡预付费终端,其中IC卡模块完成IC卡的读写,GPRS模块基于Socket与消息服务器完成数据传输,消息服务器基于Web服务完成了水务数据库业务流程。为了保障系统在恶劣网络环境的容错性能,文章提出基于CRC报文缓存技术的解决方案,很好地处理了网络异常下刷卡未同步数据库的问题。

关键词:GPRS; CRC报文;缓存技术

当前,在“智慧城市”建设大背景下,智慧水务的构想应运而生,而收费业务的信息化、智能化是实现智慧水务的第一止,目前国内出现了很多IC水卡预付费终端,然而这些终端大都采用CAN总线或采用485总线与服务器通信,由于分布零散等因素,造成系统的建设投资大、运营费用高、监控维护不及时等缺点。而小部分GPRS无线传输预付费终端,也会出现因外部因素干扰导致数据传输不稳定。针对这种情况,本文提出采用GPRS无线网络与微信支付、IC卡读写相结合的方式对自来水公司收费业务进行智能化改造的方案,该方案投资小、维护成本低,特别适合大面积实施。同时提出CRC报文缓存技术,显著改善了网络异常下刷卡未同步数据库的问题。

1 IC水卡预付费终端硬件设计

IC水卡预付费终端工作流程大致如下:首先用户通过微信关注自来水公司的公众号,输入卡号、充值金额等信息进行预付费。用户收到预付费成功的消息之后将IC水卡插入预付费终端完成充值,交易完成之后预付费终端语音播报同时屏幕显示充值量、充值结果等信息。根据预付费终端的业务特点将硬件分为两大部分:主板部分和外设部分。外设部分主要由处理器通过串口驱动,主要有语音显示模块、屏幕显示模块,负责用户刷卡过程中的语音提示和屏幕展示,提升了人机交互体验。主板部分主要用于读取用户IC水卡信息并上传以及解析服务器返回的报文最终写卡。

设计目的主要实现用户预付费完成之后刷卡充值时,预付费刷卡终端读取卡内用户号、余额(量)等信息通过GPRS上传服务器,服务器下传充值金额(量)等信息,最终完成充值。因此按功能分为读写卡模块和GPRS子模块。读写卡模块通过端口与预付费刷卡终端的主控制器相连,GPRS模块则为串口。这种设计方案硬件实现简单、易于调试,另外为软件的编写也带来很大的便利。这一切都归功于基于ARM Cortex-M3内核STM32系列单片机的广泛应用。此外预付费刷卡终端还需具有存储模块和供电模块,整体结构如图1所示。

2 lC水卡预付费终端软件设计

2.1 软件概述

软件主要采用C语言在Keil平台下编写,除完成对STM32及各个子模块的初始化之外主要编写与服务器之间的通信程序,读T5557卡时的曼彻斯特解码程序以及模拟IIC读写24卡程序。

预付费终端开机后初始化流程如图2所示。终端上电后首先进行中断优先级、各端口串口的初始化,然后读取存储模块中的服务器IP、机器号等信息,接着M6311上电、初始化,向服务器发送心跳包,20 s内收到服务器返回报文则初始化成功,5次未收到则初始化失败,进入错误处理程序。初始化完成后进入自检程序如图3所示:系统通过对存储模块、语音模块显示模块、GPRS信号强度等检测后语音播报自检成功,若某一模块故障则退出进入错误处理程序。

此外,为了解决在外部电磁环境恶劣的情况下,GPRS无线网络数据传输过程中出现的误码率升高和网络中断的问题。为此设计了基于循环冗余码校验(Cyclic RedundancyCheck,CRC)的报文缓存技术,良好地解决了这一问题。

2.2 CRC报文缓存技术的实现

2.2.1 CRC报文设计

CRC算法是计算机网络通信中常用的差错检测控制方法,其主要目的是减少数据通信线路的传输错误。其原理是:在发送端将发送的数据追加CRC校验码,CRC校验码是由原数据与选取的多项式数学运算所得,追加CRC校验码的原数据发送到接收端后,接收端检验原数据和CRC校验码的数学关系是否正确,正确则数据传输无误。CRC算法的关键是多项式的选取,本系统选用了国际电报电话咨询委员会(Comite Consultatif International Telephoniqueet Telegraphique,CCITT)推荐的CRC16(多项式是G(X)=X16+X12+X5+1)作为报文的多项式,其对于大于16位的突发性错误检测出的概率为99.9%,非常适用于抗干扰能力弱的GPRS网络。

参照自来水公司收费业务逻辑在预付费终端与服务器之间设计了如表1所示的CRC报文。

字段簡要说明:报头表示前两个字节为固定,第3个字节为应答字,其中Ox00为发送端报文,Oxll表示应答成功报文,Oxl0为应答失败报文。第4个字节为报文类型如:Ox00-Ox06为T5557预付费报文,OxlO-Ox16为T5557阶梯报文。第5个字节为协议版本号。报文长度表示从报头到报文内容的整个报文长度的16进制数。机器编号表示预付费刷卡终端的编号,共10位以16进制表示,如2018010925。报文内容表示不同类型的报文,报文内容不同,如T5557预付费请求订单报文:“卡号%卡内售水量”,中间以“%”隔开。

预付费刷卡终端与服务器之间的通信为一种扩展的C/S模式,预付费终端作为Client端向Server端(Socket中间件)请求订单信息并将刷卡结果上传,期间报文传输时CRC校验方法如下:发送方首先将被校验的K位数据M(x)左移16位得到数据M(x)。X16,目的是为了给将来拼接16CRC校验码留出空位;将选取的17位CRC多项G(X)=X16+X12+X5+1对M(x)。X16做模2除法得到1 6位CRC校验码R(x):由移16位的被校验K数据与余数R(x)模2加法,即拼接为循环校验码。并发送至接收端;接收端接收到循环校验码后与约定的多项式G(x)做模2除法,若余数为0则数据无误。

2.2.2 CRC报文的缓存方法

预付费终端和服务器之间的数据传输都以CRC报文形式传输,主要分为4个过程:终端将包含卡号、卡内余量等信息上传服务器;服务器根据卡号查询数据库,得到该卡的订单信息并下传至终端;若订单状态为已预付费未刷卡状态,终端执行写卡操作并将写卡结果上传至服务器服务器收到写卡结果以后更改数据库订单状态,并将结果下传。

系统仅在终端写卡并上传写卡结果后,未收到服务器返回或返回一直错误的情况下,执行报文缓存操作。目的在于防止用户在充值完IC水卡后,系统出现断电、GPRS故障、网络通信受阻,从而导致终端请求服务器修改订单状态失败,造成一个订单多次充值的情况。

终端写卡并上传写卡结果后,若20 s内未收到应答,则判断为网络故障,立即缓存报文重置网络后重新发送,若终端接收到循环校验码,则将其与约定的多项式G(x)做模2除法,当余数不为0时,应答报文报头中的应答字应为Oxl0,终端判断为接收到错误应答,此时服务器重发报文,若3次应答错误则缓存报文,等待下一个心跳重发报文。缓存方法流程如图4所示。

缓存的报文存储于终端的存储模块,该模块采用256字节的EEPROM-24C02作为存储芯片,利用其掉电数据不丢失的特性,实现了终端断电和GPRS模块故障状况下的报文缓存,待系统恢复正常后重新将缓存报文上传服务器。缓存报文存储于100字节以后。

2.2.3 CRC报文缓存方法容错率验证

通过实验对比未使用CRC报文缓存技术的终端,发现刷卡未同步数据库问题得到了明显改善。对比实验采用模拟实际使用场景的方法,在5个未使用CRC报文缓存技术的终端执行的1 000次刷卡。

经过对比发现采用了CRC报文缓存技术的预付费终端,在2 000次刷卡充值中刷卡未同步数据库概率从0.8%降至0.1%,提高了系统的稳定性。

3 結语

经测试基于CRC报文缓存技术的IC水卡预付费终端能够良好地完成IC水卡数据的读写以及与服务器之间的通信,同时利用CRC报文缓存技术,保证了在通信环境恶劣的情况下报文的正确性,以及在终端断电、GPRS模块故障状况下水费充值业务的完整性。同时还具有语音播报屏幕显示等人机交互功能。终端运行稳定可靠、功能丰富、抗干扰性良好、资费计算准确。能够实现自来水公司收费业务智能化改造的同时,节约了运营成本,具有广阔市场前景。