<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux電子收款機的稅源數據采集

Linux電子收款機的稅源數據采集

作者: 時(shí)間:2012-03-12 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:采集數據,對加強稅務(wù)監控有著(zhù)重要意義。本文基于稅控標準GB18240.1~GB18240.6,以使用 操作系統、并口打印機的為平臺,以采集銷(xiāo)售明細數據并在打印***上增加稅控碼為目的,提出了一種利用內核打印驅動(dòng)模塊修改和netlink socket 技術(shù)實(shí)現的方案。

本文引用地址:http://dyxdggzs.com/article/149461.htm

1. 引言

稅收是國家財政的重要組成部分,但是在稅收領(lǐng)域依法納稅意識淡薄,偷稅逃稅現象依然比較嚴重,尤其是對財務(wù)核算不健全的*,稅務(wù)機關(guān)難以實(shí)施有效監控。這種現狀不但嚴重擾亂正常的經(jīng)濟秩序,而且導致國家稅收大量流失。為了進(jìn)一步加強監控,堵塞稅收漏洞,減少稅收流失,國家先后出臺了稅控標準GB18240.1~GB18240.6 等六個(gè)部分,建立了以收款機+稅控器+稅控IC 卡+稅控收款機管理系統的基本工作模式,明確了以票控稅的基本原則。要求每當收款機上完成一筆銷(xiāo)售時(shí),收集其銷(xiāo)售明細數據,將其交由稅控器記錄統計,并將稅控器依據銷(xiāo)售明細數據生成的稅控碼添加到銷(xiāo)售小票上,以此來(lái)表示此筆銷(xiāo)售已被稅務(wù)機關(guān)記錄。本文所討論的便是一種從電子收款機采集稅源數據即銷(xiāo)售明細數據的解決方案。

因為電子收款機使用的操作系統有很多種,對于不同操作系統采集稅源數據的方案都有所不同。本文具體討論 操作系統下使用并口打印機的電子收款機的稅源方案,使用串口打印機的情形亦可參照。Windows 操作系統下的采集方案請查閱參考文獻。

2 方案設計

系統將打印機設備視為文件,通過(guò)對該文件的寫(xiě)操作來(lái)實(shí)現打印功能。通常情況下,對文件系統的監控是通過(guò)系統調用劫持來(lái)實(shí)現的。但是1) Linux 2.6 版本之后的內核,系統調用表的地址已經(jīng)不能導出,系統調用劫持的實(shí)現難度加大;2) 劫持 sys_write 系統調用后,所有的文件寫(xiě)入操作都會(huì )被劫持,對系統的性能有較大影響;3) 修改后的打印數據必須存入銷(xiāo)售軟件進(jìn)程的用戶(hù)內存空間,才能調用文件驅動(dòng)模塊write 函數將其打印出來(lái)。而侵入銷(xiāo)售軟件進(jìn)程將大大降低系統的獨立性和可靠性。

基于以上考慮,選擇了通過(guò)修改內核打印驅動(dòng)模塊來(lái)實(shí)現對電子收款機上銷(xiāo)售小票打印數據的截獲。

然而設備驅動(dòng)運行于內核態(tài),具有很大的局限性,如不能在終端上打印、不能做大延時(shí)的操作、不能使用C 的庫函數等等,難以滿(mǎn)足稅源系統的功能需要。所以需要一個(gè)用戶(hù)態(tài)的守護進(jìn)程常駐內存,對內核態(tài)采集到的數據進(jìn)行處理。

這樣整個(gè)稅源數據采集系統可以分為如下兩個(gè)部分:

1)內核空間

在 Linux 并口打印驅動(dòng)模塊中增加一個(gè)攔截函數,替換原有的lp_write 函數,負責將打印數據發(fā)送給用戶(hù)態(tài)的守護進(jìn)程,并在收到守護進(jìn)程返回的新的打印數據之后,將其打印出來(lái)。

2)用戶(hù)空間

實(shí)現一個(gè)常駐內存的用戶(hù)態(tài)守護進(jìn)程,負責接收內核截取到的打印數據,并在進(jìn)行處理后回送給內核。


圖 1 Linux 電子收款機稅源數據采集系統框架圖

3 關(guān)鍵實(shí)現技術(shù)

實(shí)現上述設計的關(guān)鍵在于解決“內核態(tài)與用戶(hù)態(tài)的進(jìn)程間通信”、“攔截并口打印驅動(dòng)的write 操作”、“打印進(jìn)程的阻塞及喚醒”三個(gè)問(wèn)題。

3.1 內核態(tài)與用戶(hù)態(tài)的進(jìn)程間通信

本方案這種分為內核空間和用戶(hù)空間兩部分的結構設計,首先需要解決的就是內核態(tài)與用戶(hù)態(tài)的進(jìn)程間通信(interprocess communicatiON, IPC)。而在各種IPC 方法中,最適合此處設計需要的就是netlink socket 技術(shù)。

Netlink socket 最早出現于Linux 2.2 版的內核中,并在2. 4 版以后的版本中作為主要的內核與用戶(hù)空間的通信方式而被廣泛使用。相對于系統調用、ioctl 以及proc 文件系統等IPC方法而言,它具有簡(jiǎn)單易用、異步通信(適合大數據傳輸)、無(wú)編譯依賴(lài)(可模塊實(shí)現)、支持多播、支持內核發(fā)起會(huì )話(huà)等優(yōu)點(diǎn)。其中“異步通信、無(wú)編譯依賴(lài)、支持內核發(fā)起會(huì )話(huà)”

這三點(diǎn)正是本系統需要的關(guān)鍵特性,也是選用該技術(shù)的最主要原因。

Netlink socket 的通信依據是一個(gè)對應于進(jìn)程的標識,一般定為該進(jìn)程的ID。當通信的一端處于中斷過(guò)程時(shí),該標識為0。當使用netlink socket 進(jìn)行通信,通信的雙方都是用戶(hù)態(tài)進(jìn)程,則使用方法類(lèi)似于消息隊列。但通信雙方有一端是中斷過(guò)程,使用方法則不同。Netlinksocket 的最大特點(diǎn)是對中斷過(guò)程的支持,它在內核空間接收用戶(hù)空間數據時(shí)不再需要用戶(hù)自行啟動(dòng)一個(gè)內核線(xiàn)程,而是通過(guò)另一個(gè)軟中斷調用用戶(hù)事先指定的接收函數,這樣就可以保證數據接收的實(shí)時(shí)性。

當 netlink socket 用于內核空間與用戶(hù)空間的通信時(shí),在用戶(hù)空間的創(chuàng )建方法和一般套接字使用類(lèi)似,但內核空間的創(chuàng )建方法則不同。在內核模塊中使用netlink_kernel_create()函數創(chuàng )建socket 時(shí)需要指明接收函數。之后用戶(hù)空間進(jìn)程創(chuàng )建socket,并將通信標識(一般是該進(jìn)程的ID)發(fā)送到內核空間。這樣內核空間獲得了用戶(hù)空間進(jìn)程的通信標識后就可以進(jìn)行通信了。

3.2 攔截并口打印驅動(dòng)的write 操作

Linux 操作系統將設備看作文件,每個(gè)Linux 的設備驅動(dòng)程序都定義了一個(gè) file_operation結構,結構中的各個(gè)成員是驅動(dòng)模塊中定義函數的指針, 通過(guò)這些函數具體實(shí)現對文件的open, read, write 等操作。因此,只要將并口打印驅動(dòng)模塊的file_operation 結構常量——lp_fops的write 成員的值由lp_write 替換為指向攔截函數的指針就能實(shí)時(shí)地攔截并口打印機的打印操作。

這里需要實(shí)現兩個(gè)關(guān)鍵函數:

1)lp_write_from_kernellp_write_from_kernel 函數實(shí)現內核空間的緩沖區數據的打印功能。來(lái)自守護進(jìn)程的修改后打印數據是保存在內核空間的,因此不能調用原有的lp_write 函數進(jìn)行打印。具體的實(shí)現可依照l(shuí)p_write,只要將調用copy_from_user 函數的地方改為調用memcpy 函數即可。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>