新闻动态   News
联系我们   Contact
搜索   Search
你的位置:首页 > 新闻动态 > 公司新闻
  • 主页
  • 塑胶挤出机
  • 圆线槽
  • 齿轮齿条伞齿轮
  • 主页 > 齿轮齿条伞齿轮 >

    Linux电子收款机的税源数据

      发布时间:2018-03-15 08:35

      税收是国家财政的重要组成部分,但是在税收领域依法纳税意识淡薄,偷税逃税现象依然比较严重,尤其是对财务核算不健全的*,税务机关难以实施有效监控。这种现状不但严重扰乱正常的经济秩序,而且导致国家税收大量流失。

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

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

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

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

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

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

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

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

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

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

      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 将其打印出来。

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

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

      本文详细说明了如何修改可加载的内核驱动模块实现并口打印数据的拦截与修改,如何运用netlink socket 技术实现内核与用户进程的通讯,以及进程的阻塞及唤醒技术。并在此基础上提出了一种利用上述技术实现的

      ①凡本网注明来源:中国测控网的所有作品,版权均属于中国测控网,转载请必须注明中国测控网。违反者本网将追究相关法律责任。

      ②本网转载并注明自来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。如其他媒体、网站或个人从本网下载使用,必须保留本网注明的稿件来源,并自负版权等法律责任。

      ③如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。more测控名词Linux

      Linux是一套免费使用和自由传播的操作系统,它主要用于基于Intel系列CPU的计算机上详情

      通常来说,状态监测系统由测量仪器、分析软件、状态监测用户、技术解决方案等组成。使用状态监测系统,可通过长期监测诸如机器振动详情

      在FPGA 上设计一个高性能、灵活的、面积小的通信体系结构是一项巨大的挑战。大多数基于FPGA的片上网络都

      RFID作为一种新型自动识别技术,广泛应用于各种人员定位系统,如矿山矿井的井下人员定位系统。该系统的

    上一篇:电子收款机新促销 中崎ECR1200报9
    下一篇:没有了