PHP - 从磁卡读取数据

时间:2012-10-08 10:02:36

标签: php device magnetic-cards

我必须制作一个应用程序,其中读卡器将连接到系统,如果有人在读卡器上更换卡,我必须读取磁卡读卡器数据。

磁卡基本上保存用户注册信息。因此用户将在接收时给卡。接待员将交换卡和系统将从卡读取数据并在我的方管理应用程序中注册该用户。

不知道怎么做? Php有可能吗?

请分享如何做到这一点。

3 个答案:

答案 0 :(得分:5)

  

我必须制作一个应用程序,其中读卡器将连接到系统,如果有人在读卡器上更换卡,我必须读取磁卡读卡器数据。

由于您希望在PHP中执行此操作,我认为这是一个 Web应用程序,并且在客户端计算机上刷卡,其中浏览器< / em>正在运行。

您可能有一个键盘模拟画笔(您通常会收到“ 123456 ”等文字),在这种情况下,您需要拦截键盘/焦点和将数据上传为表单字段或AJAX。如果字段或浏览器失去焦点,这可能会很棘手,您需要以“kiosk模式”运行浏览器。

或者您可以使用其他技术,例如串行(RS232 [C]),我相信这已经过时了,或者自定义界面(通常意味着正常) USB swiper和一套API)。如果是这种情况,那一切都取决于实施的API;某些设备附带一个ActiveX小程序,它会强制您在Windows平台上使用Internet Explorer技术。其他一些人使用Java applet,你必须将它们集成到网页中。

最后,他们中的一些人有一个完全自定义的应用程序,它可以通过多种方式与系统连接(“自定义LIBRARY”的情况相同,只是你必须开发自定义应用程序< EM>亲自的):

  • 通过向可编程服务器发送自定义HTTP查询。如果是这样的话你很幸运;您可以为每个终端编写查询,例如的 “http:// yourserver / gotcard终端= LODGE&安培;卡= $$ CODE $$”。自定义应用程序将潜伏在后台,抓取刷过的代码,将其发送到服务器;并且您应该轮询服务器以了解每个终端何时收到代码。您需要处理虚假和重复的代码。这些应用程序带有几个“占位符”,例如$$ CODE $$,$$ TIMESTAMP $$,有时还有$$ SWIPEDIRECTION $$;它们用于人员时间跟踪(进入工作时从左向右滑动,回家时从右向左滑动)。
  • 通过可编程占位符将代码上传到MySQL或SQL Server。在这里,您可能会被迫使用VPN / SSH连接来拦截查询,并且提供的数据库驱动程序可能会限制您的架构选择。
  • 通过使用常规占位符运行自定义应用程序或脚本。在这种情况下,您最好的选择是,恕我直言,编写一个调用lynx(Linux或Windows)的脚本,并与案例#1“自定义HTTP查询”相吻合。

不幸的是,各种供应商倾向于“hacky”方面(即,它们为您提供硬件和最少的软件,库和示例MFC应用程序或源代码,您自己)或者“包括所有内容和不可协商”的一面(即,您的读者可以使用完全配置的POS或员工时间记录器应用程序,并且无法使用它进行任何其他操作)。

如果您正在运行服务器端,即PHP脚本(不是其HTML /文本输出)和徽章阅读器位于同一台计算机上,那么它又取决于您提供的软件。对于服务器,键盘仿真要么是最好的(如果你有一个没有理由连接键盘的无头服务器),要么遇到麻烦(如果磁性阅读器和真正的键盘发现自己处于竞争中)。 RS232 [C]也非常易于使用,在Linux中,您可以在日志文件上ttytail甚至tail -f设备并轮询日志文件。 您可能有隐私问题(想想“用纯文本记录所有客户的信用卡号码”)。或者您可以使用fopen()在PHP中附加设备,没有问题。

自定义API库可能很棘手。您可能不得不求助于创建套接字或命名管道“服务器”的技巧,该服务器打开设备并通过fsockopen()将其结果提供给PHP。需要Unix套接字和客户端/服务器编程知识。

<强>更新

我在评论中看到你有条形码阅读器库。我仍然认为你是在一个网络应用场景(比如,三个带读者的POS,一个服务器)。

这样做的方法可能是:

// PHP "server" application running as CLI on POS #1
// (will read some data from an INI file)

* application initialization

for(;;)
{
    /* Hypothesis 1: blocking library */
    $code = read_barcode();

    /* Hypothesis 2: nonblocking, but buffering library */
    if (!barcode_available())
    {
        sleep(1);
        continue;
    }
    /* Hypothesis 3 is left as an exercise ;-) - remember to reinit the buffer */


    if (!checks_if_valid_barcode($code))
       continue;

    // Unless there's some reason of using cURL, we keep it simple
    // We might want to use mcrypt() function to encrypt the code, though.
    $response = file_get_contents(
         $CONFIG['server_url'].'?terminal='.$CONFIG['terminal']
         .'&code='.$code
    );
    // Do something with the response - maybe just an OK or an ERROR
    // (e.g. play a sound, just for kicks).
    // The server, which generates the error, knows all about the error itself
    // and the webapp will poll details from the server, not from this app.
}

Web应用程序将定期查询服务器;我们有两个并行工作流程:

  • (1)AJAX检查滑动
  • (2)CLI侦听滑动
  • (1)服务器响应'none yet'
  • (2)CLI应用程序发送滑动
  • (1)AJAX检查滑动
  • (1)服务器响应'none yet'
  • (2)服务器验证滑动
  • (1)AJAX检查滑动
  • (1)服务器响应'我明白了'
  • (2)回到聆听
  • (1)客户端显示表单并开始处理
  • ...

答案 1 :(得分:2)

使用条形码阅读器构建模块化系统 - 您可以使用的一种方法是使用像VB这样的语言,或使用c#来构建一个简单的Web浏览器(C#有一个组件供您在大约5分钟内完成此操作) 。然后C#可以与浏览器交互,将数据发送到网站?

答案 2 :(得分:2)

在unix系统上,我会使用命名管道,并使用python处理磁卡。我使用的那些使用RS232,python处理得很好。然后可以管道到PHP。 PHP也可以在此管道上发回信息,例如要求重新读取等。