石晨 曹永忠



摘 要:以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模塊故障狀況下水費充值業務的完整性。同時還具有語音播報屏幕顯示等人機交互功能。終端運行穩定可靠、功能豐富、抗干擾性良好、資費計算準確。能夠實現自來水公司收費業務智能化改造的同時,節約了運營成本,具有廣闊市場前景。