设为首页 收藏本站
查看: 509|回复: 0

[经验分享] php控制针式打印机和磁卡读卡器

[复制链接]

尚未签到

发表于 2017-4-8 10:12:13 | 显示全部楼层 |阅读模式
最近开发一个餐饮管理系统,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搞定了两个没有解决过的问题,心情愉快,记之

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361829-1-1.html 上篇帖子: 20150320----php中利用数组,实现对象的操作。利用value找key,然后递归生成xml 下篇帖子: php 性能分析工具xhprof使用手册
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表