`
yeaha
  • 浏览: 49793 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

php控制针式打印机和磁卡读卡器

    博客分类:
  • php
阅读更多
最近开发一个餐饮管理系统,web方式实现,我开发收银员使用的前端界面,中间有两个功能,打印小票和VIP磁卡刷卡。打印小票就是到超市买完东西以后打印的那种小票,VIP磁卡刷卡就是在收银时,顾客提供VIP卡,收银员在界面上点“读卡”按钮,然后在读卡器上刷一下,程序就直接拿到磁卡上的VIP会员号。
这两个功能很多程序员都实现过,不是什么复杂的功能,但问题在于,我是一个通常意义上的php程序员,只开发过那些通常意义上的网站,从来没有想到过要用php去和打印机、读卡器这些设备打交道。
用c、java这些来干这件事情会更简单一些,但我只会php,perl名言说:“对一个拿着锤子的人来说,所有的问题看上去都像是钉子”,默念着这句名言,我划着php这条“小破船”出海了。

系统的环境是linux,收银员使用firefox,这台机器既是服务器,也是前端,打印机和读卡器(型号:HCE-302)都同时连接在这台机器上。

针式打印机这一块解决起来比我想象的要简单,重新编译编译一下内核,把并口驱动起来,然后就有/dev/lp0设备可以使用了,只要向这个设备echo内容就可以打印出来。php生成打印内容,然后用fopen()、fwrite()几个函数就可以搞定,蛮简单的。

读卡器就比较复杂一些,问题有以下几个:
1、从来没有接触过串口设备,有恐惧感
2、和打印不同,打印只需要写,而读卡器需要先发送读卡命令,然后读卡器上的灯会亮起来,然后再刷一次卡(刷卡的时间不定),最后把卡的内容读回来,流程上要复杂一些
3、读写命令的格式需要研究

解决问题之后再回顾问题的时候都有一种轻松感,但问题还没有解决之前感觉一点也不轻松。读卡器光盘上附带了一些c、delphi、vb例程,给我的感觉就是非这些语言不可,php怎么能够也搞定这种事情?而且还是和串口设备通讯!

总之按照打印机的解决方法,先把串口驱动起来再说,/dev/ttyS0顺利的出现了,然后就echo 'xxxx' > /dev/ttyS0,果然没反应;)
接下来的工作就是阅读读卡器的开发手册和google,两个同事也在旁边出了不少主意,一个以前有很丰富的串口开发经验,不过都是在Windows下,而且是用c,这次linux/php读写串口是老革命遇上新问题,不过在读写命令上给了很好的帮助,另外一个同事硬件经验丰富,串口设备的波特率/读写位/xxoo什么的都是他给我说的,总之,我是站在两个巨人的肩膀上,呵呵

废话不说,上干货
首先,需要用stty设置一下串口(知其然不知其所以然):
/bin/stty -F /dev/ttyS0 raw ispeed 9600 ospeed 9600 cs8 -ignpar -cstopb -echo

读卡器的读磁道2命令是:"Esc ]"(没有")
发送到读卡器的命令需要用16进制的ascii编码,"Esc ]"编码为"\x1b\x5d"
echo -e "\x1b\x5d" > /dev/ttyS0之后,果然看到读卡器的灯亮起来了,另外开一个终端,cat /dev/ttyS0也可以在刷卡后看到数据读出
简化的php读卡程序如下:
$handle = fopen('file:///dev/ttyS0', 'w+');

if ($handle === false) die('open /dev/ttyS0 failed');

if (fwrite($handle, "\x1b\x5d") === false) echo 'write /dev/ttyS0 failed';

$content = '';
while (true) {
    $code = fread($handle, 1);
    if (preg_match('/^\d$/', $code)) $content .= $code;
    if ($code === '?') break;
}
fclose($handle);

echo $content;


一番折腾之后,还是fwrite()/fread()上场,unix的设备文件机制的确很NB

现在我已经实现了收银员点“读卡”按钮,ajax发起请求,php返回磁卡内容这个功能

用php搞定了两个没有解决过的问题,心情愉快,记之
3
0
分享到:
评论
4 楼 xieye 2011-03-07  
现在是热敏打印机,如何控制,希望lz给予帮助
3 楼 xieye 2011-03-07  
求交往   
2 楼 yeaha 2010-09-15  
http://www.php.net/manual/en/book.printer.php
这个因为只能用在Windows下,所以当时随便看了一下就放弃了
貌似已经很久没更新过,不知道你用不用得上
1 楼 purpen 2010-09-15  
楼主,那如果是windows系统呢?是否有相关的研究,目前,我有这方面的困难,需求解决方案?

相关推荐

Global site tag (gtag.js) - Google Analytics