石晨 曹永忠
摘 要:以STM32為控制核心,IC卡為預(yù)付費(fèi)載體,文章設(shè)計(jì)了IC水卡預(yù)付費(fèi)終端,其中IC卡模塊完成IC卡的讀寫,GPRS模塊基于Socket與消息服務(wù)器完成數(shù)據(jù)傳輸,消息服務(wù)器基于Web服務(wù)完成了水務(wù)數(shù)據(jù)庫業(yè)務(wù)流程。為了保障系統(tǒng)在惡劣網(wǎng)絡(luò)環(huán)境的容錯(cuò)性能,文章提出基于CRC報(bào)文緩存技術(shù)的解決方案,很好地處理了網(wǎng)絡(luò)異常下刷卡未同步數(shù)據(jù)庫的問題。
關(guān)鍵詞:GPRS; CRC報(bào)文;緩存技術(shù)
當(dāng)前,在“智慧城市”建設(shè)大背景下,智慧水務(wù)的構(gòu)想應(yīng)運(yùn)而生,而收費(fèi)業(yè)務(wù)的信息化、智能化是實(shí)現(xiàn)智慧水務(wù)的第一止,目前國內(nèi)出現(xiàn)了很多IC水卡預(yù)付費(fèi)終端,然而這些終端大都采用CAN總線或采用485總線與服務(wù)器通信,由于分布零散等因素,造成系統(tǒng)的建設(shè)投資大、運(yùn)營費(fèi)用高、監(jiān)控維護(hù)不及時(shí)等缺點(diǎn)。而小部分GPRS無線傳輸預(yù)付費(fèi)終端,也會(huì)出現(xiàn)因外部因素干擾導(dǎo)致數(shù)據(jù)傳輸不穩(wěn)定。針對(duì)這種情況,本文提出采用GPRS無線網(wǎng)絡(luò)與微信支付、IC卡讀寫相結(jié)合的方式對(duì)自來水公司收費(fèi)業(yè)務(wù)進(jìn)行智能化改造的方案,該方案投資小、維護(hù)成本低,特別適合大面積實(shí)施。同時(shí)提出CRC報(bào)文緩存技術(shù),顯著改善了網(wǎng)絡(luò)異常下刷卡未同步數(shù)據(jù)庫的問題。
1 IC水卡預(yù)付費(fèi)終端硬件設(shè)計(jì)
IC水卡預(yù)付費(fèi)終端工作流程大致如下:首先用戶通過微信關(guān)注自來水公司的公眾號(hào),輸入卡號(hào)、充值金額等信息進(jìn)行預(yù)付費(fèi)。用戶收到預(yù)付費(fèi)成功的消息之后將IC水卡插入預(yù)付費(fèi)終端完成充值,交易完成之后預(yù)付費(fèi)終端語音播報(bào)同時(shí)屏幕顯示充值量、充值結(jié)果等信息。根據(jù)預(yù)付費(fèi)終端的業(yè)務(wù)特點(diǎn)將硬件分為兩大部分:主板部分和外設(shè)部分。外設(shè)部分主要由處理器通過串口驅(qū)動(dòng),主要有語音顯示模塊、屏幕顯示模塊,負(fù)責(zé)用戶刷卡過程中的語音提示和屏幕展示,提升了人機(jī)交互體驗(yàn)。主板部分主要用于讀取用戶IC水卡信息并上傳以及解析服務(wù)器返回的報(bào)文最終寫卡。
設(shè)計(jì)目的主要實(shí)現(xiàn)用戶預(yù)付費(fèi)完成之后刷卡充值時(shí),預(yù)付費(fèi)刷卡終端讀取卡內(nèi)用戶號(hào)、余額(量)等信息通過GPRS上傳服務(wù)器,服務(wù)器下傳充值金額(量)等信息,最終完成充值。因此按功能分為讀寫卡模塊和GPRS子模塊。讀寫卡模塊通過端口與預(yù)付費(fèi)刷卡終端的主控制器相連,GPRS模塊則為串口。這種設(shè)計(jì)方案硬件實(shí)現(xiàn)簡單、易于調(diào)試,另外為軟件的編寫也帶來很大的便利。這一切都?xì)w功于基于ARM Cortex-M3內(nèi)核STM32系列單片機(jī)的廣泛應(yīng)用。此外預(yù)付費(fèi)刷卡終端還需具有存儲(chǔ)模塊和供電模塊,整體結(jié)構(gòu)如圖1所示。
2 lC水卡預(yù)付費(fèi)終端軟件設(shè)計(jì)
2.1 軟件概述
軟件主要采用C語言在Keil平臺(tái)下編寫,除完成對(duì)STM32及各個(gè)子模塊的初始化之外主要編寫與服務(wù)器之間的通信程序,讀T5557卡時(shí)的曼徹斯特解碼程序以及模擬IIC讀寫24卡程序。
預(yù)付費(fèi)終端開機(jī)后初始化流程如圖2所示。終端上電后首先進(jìn)行中斷優(yōu)先級(jí)、各端口串口的初始化,然后讀取存儲(chǔ)模塊中的服務(wù)器IP、機(jī)器號(hào)等信息,接著M6311上電、初始化,向服務(wù)器發(fā)送心跳包,20 s內(nèi)收到服務(wù)器返回報(bào)文則初始化成功,5次未收到則初始化失敗,進(jìn)入錯(cuò)誤處理程序。初始化完成后進(jìn)入自檢程序如圖3所示:系統(tǒng)通過對(duì)存儲(chǔ)模塊、語音模塊顯示模塊、GPRS信號(hào)強(qiáng)度等檢測后語音播報(bào)自檢成功,若某一模塊故障則退出進(jìn)入錯(cuò)誤處理程序。
此外,為了解決在外部電磁環(huán)境惡劣的情況下,GPRS無線網(wǎng)絡(luò)數(shù)據(jù)傳輸過程中出現(xiàn)的誤碼率升高和網(wǎng)絡(luò)中斷的問題。為此設(shè)計(jì)了基于循環(huán)冗余碼校驗(yàn)(Cyclic RedundancyCheck,CRC)的報(bào)文緩存技術(shù),良好地解決了這一問題。
2.2 CRC報(bào)文緩存技術(shù)的實(shí)現(xiàn)
2.2.1 CRC報(bào)文設(shè)計(jì)
CRC算法是計(jì)算機(jī)網(wǎng)絡(luò)通信中常用的差錯(cuò)檢測控制方法,其主要目的是減少數(shù)據(jù)通信線路的傳輸錯(cuò)誤。其原理是:在發(fā)送端將發(fā)送的數(shù)據(jù)追加CRC校驗(yàn)碼,CRC校驗(yàn)碼是由原數(shù)據(jù)與選取的多項(xiàng)式數(shù)學(xué)運(yùn)算所得,追加CRC校驗(yàn)碼的原數(shù)據(jù)發(fā)送到接收端后,接收端檢驗(yàn)原數(shù)據(jù)和CRC校驗(yàn)碼的數(shù)學(xué)關(guān)系是否正確,正確則數(shù)據(jù)傳輸無誤。CRC算法的關(guān)鍵是多項(xiàng)式的選取,本系統(tǒng)選用了國際電報(bào)電話咨詢委員會(huì)(Comite Consultatif International Telephoniqueet Telegraphique,CCITT)推薦的CRC16(多項(xiàng)式是G(X)=X16+X12+X5+1)作為報(bào)文的多項(xiàng)式,其對(duì)于大于16位的突發(fā)性錯(cuò)誤檢測出的概率為99.9%,非常適用于抗干擾能力弱的GPRS網(wǎng)絡(luò)。
參照自來水公司收費(fèi)業(yè)務(wù)邏輯在預(yù)付費(fèi)終端與服務(wù)器之間設(shè)計(jì)了如表1所示的CRC報(bào)文。
字段簡要說明:報(bào)頭表示前兩個(gè)字節(jié)為固定,第3個(gè)字節(jié)為應(yīng)答字,其中Ox00為發(fā)送端報(bào)文,Oxll表示應(yīng)答成功報(bào)文,Oxl0為應(yīng)答失敗報(bào)文。第4個(gè)字節(jié)為報(bào)文類型如:Ox00-Ox06為T5557預(yù)付費(fèi)報(bào)文,OxlO-Ox16為T5557階梯報(bào)文。第5個(gè)字節(jié)為協(xié)議版本號(hào)。報(bào)文長度表示從報(bào)頭到報(bào)文內(nèi)容的整個(gè)報(bào)文長度的16進(jìn)制數(shù)。機(jī)器編號(hào)表示預(yù)付費(fèi)刷卡終端的編號(hào),共10位以16進(jìn)制表示,如2018010925。報(bào)文內(nèi)容表示不同類型的報(bào)文,報(bào)文內(nèi)容不同,如T5557預(yù)付費(fèi)請(qǐng)求訂單報(bào)文:“卡號(hào)%卡內(nèi)售水量”,中間以“%”隔開。
預(yù)付費(fèi)刷卡終端與服務(wù)器之間的通信為一種擴(kuò)展的C/S模式,預(yù)付費(fèi)終端作為Client端向Server端(Socket中間件)請(qǐng)求訂單信息并將刷卡結(jié)果上傳,期間報(bào)文傳輸時(shí)CRC校驗(yàn)方法如下:發(fā)送方首先將被校驗(yàn)的K位數(shù)據(jù)M(x)左移16位得到數(shù)據(jù)M(x)。X16,目的是為了給將來拼接16CRC校驗(yàn)碼留出空位;將選取的17位CRC多項(xiàng)G(X)=X16+X12+X5+1對(duì)M(x)。X16做模2除法得到1 6位CRC校驗(yàn)碼R(x):由移16位的被校驗(yàn)K數(shù)據(jù)與余數(shù)R(x)模2加法,即拼接為循環(huán)校驗(yàn)碼。并發(fā)送至接收端;接收端接收到循環(huán)校驗(yàn)碼后與約定的多項(xiàng)式G(x)做模2除法,若余數(shù)為0則數(shù)據(jù)無誤。
2.2.2 CRC報(bào)文的緩存方法
預(yù)付費(fèi)終端和服務(wù)器之間的數(shù)據(jù)傳輸都以CRC報(bào)文形式傳輸,主要分為4個(gè)過程:終端將包含卡號(hào)、卡內(nèi)余量等信息上傳服務(wù)器;服務(wù)器根據(jù)卡號(hào)查詢數(shù)據(jù)庫,得到該卡的訂單信息并下傳至終端;若訂單狀態(tài)為已預(yù)付費(fèi)未刷卡狀態(tài),終端執(zhí)行寫卡操作并將寫卡結(jié)果上傳至服務(wù)器服務(wù)器收到寫卡結(jié)果以后更改數(shù)據(jù)庫訂單狀態(tài),并將結(jié)果下傳。
系統(tǒng)僅在終端寫卡并上傳寫卡結(jié)果后,未收到服務(wù)器返回或返回一直錯(cuò)誤的情況下,執(zhí)行報(bào)文緩存操作。目的在于防止用戶在充值完IC水卡后,系統(tǒng)出現(xiàn)斷電、GPRS故障、網(wǎng)絡(luò)通信受阻,從而導(dǎo)致終端請(qǐng)求服務(wù)器修改訂單狀態(tài)失敗,造成一個(gè)訂單多次充值的情況。
終端寫卡并上傳寫卡結(jié)果后,若20 s內(nèi)未收到應(yīng)答,則判斷為網(wǎng)絡(luò)故障,立即緩存報(bào)文重置網(wǎng)絡(luò)后重新發(fā)送,若終端接收到循環(huán)校驗(yàn)碼,則將其與約定的多項(xiàng)式G(x)做模2除法,當(dāng)余數(shù)不為0時(shí),應(yīng)答報(bào)文報(bào)頭中的應(yīng)答字應(yīng)為Oxl0,終端判斷為接收到錯(cuò)誤應(yīng)答,此時(shí)服務(wù)器重發(fā)報(bào)文,若3次應(yīng)答錯(cuò)誤則緩存報(bào)文,等待下一個(gè)心跳重發(fā)報(bào)文。緩存方法流程如圖4所示。
緩存的報(bào)文存儲(chǔ)于終端的存儲(chǔ)模塊,該模塊采用256字節(jié)的EEPROM-24C02作為存儲(chǔ)芯片,利用其掉電數(shù)據(jù)不丟失的特性,實(shí)現(xiàn)了終端斷電和GPRS模塊故障狀況下的報(bào)文緩存,待系統(tǒng)恢復(fù)正常后重新將緩存報(bào)文上傳服務(wù)器。緩存報(bào)文存儲(chǔ)于100字節(jié)以后。
2.2.3 CRC報(bào)文緩存方法容錯(cuò)率驗(yàn)證
通過實(shí)驗(yàn)對(duì)比未使用CRC報(bào)文緩存技術(shù)的終端,發(fā)現(xiàn)刷卡未同步數(shù)據(jù)庫問題得到了明顯改善。對(duì)比實(shí)驗(yàn)采用模擬實(shí)際使用場景的方法,在5個(gè)未使用CRC報(bào)文緩存技術(shù)的終端執(zhí)行的1 000次刷卡。
經(jīng)過對(duì)比發(fā)現(xiàn)采用了CRC報(bào)文緩存技術(shù)的預(yù)付費(fèi)終端,在2 000次刷卡充值中刷卡未同步數(shù)據(jù)庫概率從0.8%降至0.1%,提高了系統(tǒng)的穩(wěn)定性。
3 結(jié)語
經(jīng)測試基于CRC報(bào)文緩存技術(shù)的IC水卡預(yù)付費(fèi)終端能夠良好地完成IC水卡數(shù)據(jù)的讀寫以及與服務(wù)器之間的通信,同時(shí)利用CRC報(bào)文緩存技術(shù),保證了在通信環(huán)境惡劣的情況下報(bào)文的正確性,以及在終端斷電、GPRS模塊故障狀況下水費(fèi)充值業(yè)務(wù)的完整性。同時(shí)還具有語音播報(bào)屏幕顯示等人機(jī)交互功能。終端運(yùn)行穩(wěn)定可靠、功能豐富、抗干擾性良好、資費(fèi)計(jì)算準(zhǔn)確。能夠?qū)崿F(xiàn)自來水公司收費(fèi)業(yè)務(wù)智能化改造的同時(shí),節(jié)約了運(yùn)營成本,具有廣闊市場前景。