php制御ニードルプリンタと磁気カードリーダ


最近1つの飲食管理システムを開発して、web方式は実現して、私はレジの使用するフロントエンドのインターフェースを開発して、中間は2つの機能があって、領収書とVIP磁気カードを印刷してカードを払います.レシートを印刷するのはスーパーで买い物をした后に印刷するあのようなレシートで、VIP磁気カードはレジの时、顾客はVIPカードを提供して、レジの人はインタフェースの上で“カードを読む”ボタンをクリックして、それからカードリーダーの上でブラシをかけて、プログラムは直接磁気カードの上のVIP会员の番号を手に入れます.
この2つの機能は多くのプログラマーが実現したことがあり、複雑な機能ではありませんが、問題は、私は通常の意味でのphpプログラマーで、通常の意味でのウェブサイトだけを開発したことがあり、phpでプリンタ、カードリーダーなどのデバイスと付き合うとは思わなかったことです.
c、javaなどでやるともっと簡単ですが、phpしかできません.perlの名言は「ハンマーを持っている人にとって、すべての問題は釘のように見えます」と、この名言を黙読して、phpという「小さな破れた船」を漕いで海に出ました.
システムの環境はlinuxで、レジはfirefoxを使って、この機械はサーバーで、フロントエンドで、プリンタとカードリーダー(型番:HCE-302)はすべて同時にこの機械に接続します.
針式プリンタという解決は私が想像していたより簡単で、カーネルを再コンパイルしてコンパイルし、パラレルポートを駆動して、/dev/lp 0デバイスが使用できます.このデバイスにechoコンテンツを印刷すればいいです.phpは印刷内容を生成しfopen()、fwrite()のいくつかの関数で済むので簡単です.
カードリーダーは複雑ですが、次のような問題があります.
1、シリアル機器に触れたことがなく、恐怖感がある
2、印刷と违って、印刷は书くだけで、カードリーダーは先にカードを読むコマンドを送る必要があります.それからカードリーダーの明かりが点灯して、それからもう一度カードをブラシします(カードを払う时间が决まっていません).最后にカードの内容を読み返して、流れが复雑です.
3、読み書き命令のフォーマットについて検討する必要がある
問題を解決してから問題を振り返るときは楽な感じがしますが、問題が解決するまでは少しも楽ではありません.カードリーダーのディスクにはc、delphi、vbのルーチンが付いていて、これらの言語でなければならないという感じがします.phpはどうしてこのようなことをすることができますか.しかもシリアルデバイスと通信!
とにかくプリンタの解決方法に従って、まずシリアルポートを駆動してから、/dev/ttyS 0は順調に現れて、それからecho'xxxx'>/dev/ttyS 0で、やはり反応しませんでした;
次の仕事はカードリーダーの開発マニュアルとgoogleを読むことです.2人の同僚もそばで多くのアイデアを出しました.1つは以前豊富なシリアル開発経験を持っていましたが、Windowsの下で、cを使っていました.今回のlinux/php読み書きシリアルは古い革命で新しい問題に遭遇しましたが、読み書きコマンドでよく助けられました.もう1人の同僚はハードウェアの経験が豊富です.シリアルデバイスのボーレート/読み書きビット/xxooなんて彼が言ってくれたので、とにかく、私は2人の巨人の肩に立っていました.ほほほ
くだらないことは言わないで,干物に行く.
まずsttyでシリアルポートを設定する必要があります(その理由を知りません):

/bin/stty -F /dev/ttyS0 raw ispeed 9600 ospeed 9600 cs8 -ignpar -cstopb -echo

カードリーダのリードトラック2コマンドは、「Esc」(「なし」)
カードリーダーに送信するコマンドは16進数のasciiで符号化する必要があり、「Esc」は「x 1 bx 5 d」で符号化する
echo-e"x 1 bx 5 d">/dev/ttyS 0の後、やはりカードリーダーのランプが点灯しているのを見て、別の端末をつけて、cat/dev/ttyS 0もカードを使った後にデータの読み出しを見ることができます
簡略化された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で解決していない2つの問題を解決して、気持ちが楽しくて、覚えています