基于Linux的电子收款机税源数据采集方案

发布者:静心悠然最新更新时间:2010-12-04 关键字:Linux  税源数据采集  Netlink  socket 手机看文章 扫描二维码
随时随地手机看文章

  1. 引言

  税收是国家财政的重要组成部分,但是在税收领域依法纳税意识淡薄,偷税逃税现象依然比较严重,尤其是对财务核算不健全的*,税务机关难以实施有效监控。这种现状不但严重扰乱正常的经济秩序,而且导致国家税收大量流失。为了进一步加强税源监控,堵塞税收漏洞,减少税收流失,国家先后出台了税控收款机标准GB18240.1~GB18240.6 等六个部分,建立了以电子收款机+税控器+税控IC 卡+税控收款机管理系统的基本工作模式,明确了以票控税的基本原则。要求每当电子收款机上完成一笔销售时,收集其销售明细数据,将其交由税控器记录统计,并将税控器依据销售明细数据生成的税控码添加到销售小票上,以此来表示此笔销售已被税务机关记录。本文所讨论的便是一种从电子收款机采集税源数据即销售明细数据的解决方案。

  因为电子收款机使用的操作系统有很多种,对于不同操作系统采集税源数据的方案都有所不同。本文具体讨论Linux 操作系统下使用并口打印机的电子收款机的税源数据采集方案,使用串口打印机的情形亦可参照。Windows 操作系统下的采集方案请查阅参考文献。

  2 方案设计

  Linux 系统将打印机设备视为文件,通过对该文件的写操作来实现打印功能。通常情况下,对文件系统的监控是通过系统调用劫持来实现的。但是1) Linux 2.6 版本之后的内核,系统调用表的地址已经不能导出,系统调用劫持的实现难度加大;2) 劫持 sys_write 系统调用后,所有的文件写入操作都会被劫持,对系统的性能有较大影响;3) 修改后的打印数据必须存入销售软件进程的用户内存空间,才能调用文件驱动模块write 函数将其打印出来。而侵入销售软件进程将大大降低系统的独立性和可靠性。

  基于以上考虑,选择了通过修改内核打印驱动模块来实现对电子收款机上销售小票打印数据的截获。

  然而设备驱动运行于内核态,具有很大的局限性,如不能在终端上打印、不能做大延时的操作、不能使用C 的库函数等等,难以满足税源数据采集系统的功能需要。所以需要一个用户态的守护进程常驻内存,对内核态采集到的数据进行处理。

  这样整个税源数据采集系统可以分为如下两个部分:

  1)内核空间

  在 Linux 并口打印驱动模块中增加一个拦截函数,替换原有的lp_write 函数,负责将打印数据发送给用户态的守护进程,并在收到守护进程返回的新的打印数据之后,将其打印出来。

  2)用户空间

  实现一个常驻内存的用户态守护进程,负责接收内核截取到的打印数据,并在进行处理后回送给内核。

  

图 1 Linux 电子收款机税源数据采集系统框架图

  3 关键实现技术

  实现上述设计的关键在于解决“内核态与用户态的进程间通信”、“拦截并口打印驱动的write 操作”、“打印进程的阻塞及唤醒”三个问题。

  3.1 内核态与用户态的进程间通信

  本方案这种分为内核空间和用户空间两部分的结构设计,首先需要解决的就是内核态与用户态的进程间通信(interprocess communicatiON, IPC)。而在各种IPC 方法中,最适合此处设计需要的就是netlink socket 技术。

  Netlink socket 最早出现于Linux 2.2 版的内核中,并在2. 4 版以后的版本中作为主要的内核与用户空间的通信方式而被广泛使用。相对于系统调用、ioctl 以及proc 文件系统等IPC方法而言,它具有简单易用、异步通信(适合大数据传输)、无编译依赖(可模块实现)、支持多播、支持内核发起会话等优点。其中“异步通信、无编译依赖、支持内核发起会话”

  这三点正是本系统需要的关键特性,也是选用该技术的最主要原因。

  Netlink socket 的通信依据是一个对应于进程的标识,一般定为该进程的ID。当通信的一端处于中断过程时,该标识为0。当使用netlink socket 进行通信,通信的双方都是用户态进程,则使用方法类似于消息队列。但通信双方有一端是中断过程,使用方法则不同。Netlinksocket 的最大特点是对中断过程的支持,它在内核空间接收用户空间数据时不再需要用户自行启动一个内核线程,而是通过另一个软中断调用用户事先指定的接收函数,这样就可以保证数据接收的实时性。

  当 netlink socket 用于内核空间与用户空间的通信时,在用户空间的创建方法和一般套接字使用类似,但内核空间的创建方法则不同。在内核模块中使用 netlink_kernel_create()函数创建socket 时需要指明接收函数。之后用户空间进程创建socket,并将通信标识(一般是该进程的ID)发送到内核空间。这样内核空间获得了用户空间进程的通信标识后就可以进行通信了。

  3.2 拦截并口打印驱动的write 操作

  Linux 操作系统将设备看作文件,每个Linux 的设备驱动程序都定义了一个 file_operation结构,结构中的各个成员是驱动模块中定义函数的指针, 通过这些函数具体实现对文件的open, read, write 等操作。因此,只要将并口打印驱动模块的file_operation 结构常量——lp_fops的write 成员的值由lp_write 替换为指向拦截函数的指针就能实时地拦截并口打印机的打印操作。

  这里需要实现两个关键函数:

  1)lp_write_from_kernellp_write_from_kernel 函数实现内核空间的缓冲区数据的打印功能。来自守护进程的修改后打印数据是保存在内核空间的,因此不能调用原有的lp_write 函数进行打印。具体的实现可依照lp_write,只要将调用copy_from_user 函数的地方改为调用memcpy 函数即可。

  2)lp_interceptlp_intercept 函数函数用于替换lp_write,拦截并口打印驱动的write 操作,实现打印数据截取与修改:当电子收款机的销售软件调用并口打印驱动的write 函数时,将写缓冲区的打印数据发送给守护进程;待守护进程返回修改后的打印数据(附加了税控码),调用lp_write_from_kernel 将其打印出来。

  3.3 打印进程的阻塞及唤醒

  当收到电子收款机的销售软件向并口打印机发出的打印请求时,内核态的并口打印模块需在将数据发送给用户态的守护进程之后阻塞打印请求进程。并且,当且仅当接收到守护进程的返回数据时,才会唤醒打印请求进程完成打印。

  如何实现打印进程的阻塞及唤醒就是最后一个关键技术点。因为电子收款机只配备一个打印机、不需要复杂的互斥技术,所以只要使用“简单睡眠”就可以达到这个目标——通过使用下面的宏或函数:

  4 小结

  本文详细说明了如何修改可加载的内核驱动模块实现并口打印数据的拦截与修改,如何运用netlink socket 技术实现内核与用户进程的通讯,以及进程的阻塞及唤醒技术。并在此基础上提出了一种利用上述技术实现的Linux 电子收款机税源数据采集方案。此方案在无需改变电子收款机原有设计架构的条件下,实现了税源数据采集及***税控码添加功能,经实际环境测试可行,符合对税源数据采集系统的整体要求。

关键字:Linux  税源数据采集  Netlink  socket 引用地址:基于Linux的电子收款机税源数据采集方案

上一篇:基于ARM9的仿人机器人分布式控制系统
下一篇:基于XML技术的自动评阅系统的设计与实现

推荐阅读最新更新时间:2024-05-02 21:12

第七篇:gcc和arm-linux-gcc常用选项
一、gcc和arm-linux-gcc的常用选项 常用选型 -v 查看gcc编译器的版本,显示gcc执行时的详细过程 -o Place the output into 指定输出文件名为file,这个名称不能跟源文件名同名 -E Preprocess only; do not compile, assemble or link 只预处理,不会编译、汇编、链接 -S Compile only; do not assemble or link 只编译,不会汇编、链接 -c Compile and assemble, but do not link 编译和汇编,不会链接 举例 //举例一: gcc hell.c
[单片机]
第七篇:gcc和arm-<font color='red'>linux</font>-gcc常用选项
ARMLinux与WiFi的移动智能终端门禁系统设计
引言 随着社会经济的快速发展,人们对室内人身财产安全要求越来越高,门禁系统作为智能建筑安防自动化体系中必不可少的一部分 ,发挥着极其重要的作用。当前常见的门禁系统包括:密码锁门禁系统、感应式IC卡门禁系统、基于电话短信方式的门禁系统以及生物特征识别门禁系统等。 随着科技的不断进步和人们生活水平的不断提高,移动智能终端越来越普及,包括智能手机、平板电脑等。为此,本文研究设计了一种基于嵌入式ARMLinux平台,并将用户已有的移动智能终端设备作为用户身份凭证的无线WiFi门禁系统。 1门禁系统总体结构 移动智能终端门禁系统主要由移动智能终端、门禁装置、控制部件(电锁)和PC终端组成。系统总体拓扑示意图如图1所示。
[单片机]
ARMLinux与WiFi的移动智能终端门禁系统设计
OK6410A 开发板 (八) 98 linux-5.11 OK6410A glibc提供的mmap与linux中的 sys_mmap的联动
按道理 用户空间通过 mmap 提出了需求,用户提出的需求分类 1.共享文件映射 2.私有文件映射 3.共享匿名映射 4.私有匿名映射 内核要满足需求,就要做事情 对于 需求 1 2 内核要做 A.虚拟地址的申请 B.物理地址的申请 C.映射关系的建立 D.磁盘文件内容加载到物理内存 对于 需求 3 4 内核要做 A.虚拟地址的申请 B.物理地址的申请 C.映射关系的建立 内核实际上是按照两个步骤做的这些内容 (不管是做ABCD还是ABC) 1. sys_mmap阶段 2. 访存阶段 xx文件映射 是为了访问 磁盘中的文件 私有文件映射(访问动态
[单片机]
基于嵌入式Linux操作系统的可视化安全倒车系统
   引言   电子信息与数字图像处理技术目前已被广泛地应用在各个领域,车载系统的信息化已成为现代汽车业的重要标志。现在的倒车雷达系统可以为驾驶者提供许多帮助,多数采用超声波测距技术,可以直接显示出车尾与障碍物之间的距离。但由于超声波的散射特性,如果地面有尖锐的突起或存在横在半空的棱角状物体,系统就不能有效地“察觉”。假如能为现有的倒车系统增加一个可视功能,那么驾驶员在倒车时不必回头就可清楚车后的情况。本文设计了一种可视化安全倒车系统,该系统采用嵌入式Linux操作系统内核驱动 USB摄像头实现车后状况实时监控,通过判断超声波测距是否达到阈值来启动语音报警功能。    1 系统方案设计   如图1所示,系统由主控模块、
[嵌入式]
Linux内核可能最终逐步取消对英特尔i486 CPU的支持
Linus Torvalds支持可能从Linux内核中取消英特尔486(i486)处理器支持的想法。在十年前Linux内核放弃对i386的支持后,i486一直是Linux内核主线的最低x86处理器支持。最近一次试图取消对i486的支持的提法来自Linus Torvalds本人,他表达了可能需要x86 32位CPU支持 cmpxchg8b 的想法,这指的是Pentium CPU及以后的CPU。 也许我们应该咬紧牙关,说我们只支持带有 cmpxchg8b 的x86-32(即奔腾及更高版本)。大多数(所有)Linux发行版已经启用了X86_PAE,这使得X86_CMPXCHG64成为基本要求的一部分。我并不相信现在大多数发行版
[嵌入式]
Linux 6.1继续为龙芯中科LoongArch架构带来新的CPU功能特性
尽管 Linux 社区早就通过 5.19 合并引入了对 LoongArch CPU 的初步支持,但它仍未迈过可向公众推送的成熟期。在此期间,开发人员有在坚持为其填补功能特性上的短板 —— 比如在 Linux 6.0 中带来的 LoongArch PCI 支持和其它变动。现在,Linux 6.1 内核又为源自 MIPS64 和 RISC-V 的 LoongArch CPU 带来了新的附加功能。 (图自:龙芯官网) 几天前,开发人员已经搞定了 LoongArch EFI 引导,为 Linux 6.1 的 EFI 机密计算做好了准备。而周三的主要工作,主要涉及 LongArch CPU 的移植更新合并。 此外本轮开发周期还
[嵌入式]
<font color='red'>Linux</font> 6.1继续为龙芯中科LoongArch架构带来新的CPU功能特性
OK6410A 开发板 (八) 40 linux-5.11 OK6410A buddy 的 alloc 和 free
第三阶段建立的是 buddy buddy 的使用期限 mm_init- mem_init返回 - 无结束点 buddy 管理的内存大小 buddy 管理的内存 是 memblock 决定的 属于 memblock.memory 中 但不包括 memblock.reserved 的部分 memblock 可以通过 memblock_alloc或memblock_reserve 来 预留内存 buddy 的使用方法 alloc alloc_pages/alloc_page // 返回的是 struct page get_zeroed_page // 返回的是虚拟地址 __get_free_pages/__get_f
[单片机]
Linux2.6.32移植到MINI2440(1)初步移植
根据友善之臂提供的手册——《MINI2440 Linux移植开发实战指南-内核部分-2010.9.9》以及网络上一些帖子,在此对他们的工作表示感谢,基本过程大都一致,主要是为了熟悉内核的基本移植方法,目的是为了能够生成一个MINI2440上可用的内核。 开发环境: 主机:fedora 14 虚拟机:vmware workstation 10 交叉编译工具:arm-linux-gcc 4.3.2 开发板:mini2440(2m nor ,64m sdram,256m nand) 一、下载源码包解压到指定位置 下载地址:http://www.kernel.org/pub/l
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved