プロトコル esc pos. オンライン レジの中に隠されているもの: 会計レジストラの開発。 法律: レジのグローバルなオンライン管理

09.02.2022

ESC * は、ESC/POS のいくつかの「ピクチャ ビット」コマンドの 1 つです。 8 ピクセルまたは 24 ピクセルの 1 行のみを表すことができる「列形式」データを受け入れます。 したがって、ここには 2 つの良い選択肢があります。

ESC* を使用した複数行の印刷

1行なら印刷できるようなので、データ形式自体は問題ないのだと思います。

\n 改行で区切って追加の行を印刷するコマンドを繰り返すだけで、複数行を印刷できます。 これには、画像を切り取って、高さが 8 ピクセルまたは 24 ピクセルの倍数になるようにスペースを埋め込む必要があります (これもフォーマットによるものです)。

行間隔があるため、イメージの印刷中にリニア チャネルのサイズを変更するコマンドを発行し、最後にリニア チャネルをリセットする別のコマンドを発行する必要があります。

16 チャネル ラインには ESC 3 0x10 (バイト 0x1b 0x33 0x10) を使用し、リセットには ESC 2 (バイト 0x1b 0x32) を使用します。

この印刷方法は古いプリンタとの互換性に優れていますが、出力に細い横線が発生する場合があります。

GS v 0 で画像全体を印刷します

画像コマンドのこのビットは、さまざまな「ラスター形式」データを受け入れます。 この形式の BLOB は、広く使用されている PBM ビットマップ形式のバイナリ データ (特に、P4 ヘッダー ファイルのバイナリ データ) と同一であるという事実を利用しています。

画像の高さはプリント バッファーのサイズに応じて制限されますが、最大 65535 ピクセルまで可能です。 表現上、幅は 8 で割り切れる必要があります。

ESC/POS はレシートプリンターに印刷を行わせるコマンドセットです。

導入

始める前に、ESC/POS について知っておくべきことが 3 つあります。

  1. 最新のレシート プリンターのほとんどは、何らかの形式でこれをサポートしています。
  2. 書くのはとても簡単です。
  3. コマンドは ESC 文字 (ASCII 27) で始まります。

ちなみに、上記のビデオで印刷されたレシートは、escpos-php リポジトリからの例です。 このプリントアウトでは、基本的な ESC/POS 機能のすべてが示されているので、順を追って説明します。

コマンド構造

4 つの特定の ASCII 文字がコマンド シーケンスに出現します。

略語 名前 コード (16 進数)
NUL ヌル 0x00
LF 改行 0x0A
ESC 逃げる 0x1B
G.S. グループ区切り文字 0x1D

通常のテキストは、改行で区切られてプリンターに送信されます。 コマンドは ESC または GS で始まり、その後に印刷可能な文字が続き、場合によっては数字が続きます。

数値は単に文字として渡されます。 たとえば、「5」は 0x05 として渡されます。

初期化

初めてプリンターに接続するときは、プリンターを初期化する必要があります。 これにより、以前の印刷出力で使用されていた 3 つの下線が入った二重取り消し線のフォントではなく、デフォルトの書式設定に戻ります。

フォーマットをリセットするコマンドは次のとおりです。

__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); $printer -> close();

00000000 1b 40 |.@| 00000003

「Hello world」のテキスト

これは最も単純なタイプの領収書であり、書式設定されていないテキストのみが含まれます。

テキストは改行で区切られてプリンターに送信されるだけです。

__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* テキスト */ $printer -> text("Hello world\n"); $printer -> Cut(); $printer -> close();

00000000 1b 40 48 65 6c 6c 6f 20 77 6f 72 6c 64 0a 1d 56 |.@Hello world..V| 00000010 41 03 |A.| 00000012

改行

プリンターは、このコマンドを使用して、指定された行数を超えてすぐにスキップできます。

コマンドは次のとおりです。

LF
ESCd[数値]
ESC v[数値]

最初のコマンドは順方向にフィードし、2 番目のコマンドは逆方向にフィードします。 この例から、デモ プリンタは逆給紙をサポートしていないことがわかります。

Require_once(dirname(__FILE__) . "/escpos-php/Escpos.php"); $printer = 新しい Escpos(); /* 改行 */ $printer -> text("ABC"); $printer -> feed(7); $printer -> text("DEF"); $printer -> feedReverse(3); $printer -> text("GHI"); $printer -> feed(); $printer -> Cut(); $printer -> close();

00000000 1b 40 41 42 43 1b 64 07 44 45 46 1b 65 03 47 48 | [メールで保護されています]| 00000010 49 0a 1d 56 41 03 |I..VA.| 00000016

印刷モード

印刷モードには、フォントの高さ、幅、太字が 1 つの属性に含まれます。

コマンドは次のとおりです。

フォント モードは、選択した属性を論理的に OR して結合して作成されます。 0 はプラン フォント A のテキストを表します。 モードフラグは次のとおりです。

モード 番号
フォント A (モードなし) 0
フォントB 1
強調した 8
ダブルハイト 16
倍幅 32
下線 128

レシートの例は、各フラグの効果を示しています。

__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* フォント モード */ $modes = array(Printer:::MODE_FONT_A, Printer:::MODE_FONT_B, Printer:::MODE_EMPHASIZED, Printer:::MODE_DOUBLE_HEIGHT, Printer:::MODE_DOUBLE_WIDTH, Printer:::MODE_UNDERLINE); for($i = 0; $i< 2 ** count($modes); $i++) { $bits = str_pad(decbin($i), count($modes), "0", STR_PAD_LEFT); $mode = 0; for($j = 0; $j < strlen($bits); $j++) { if(substr($bits, $j, 1) == "1") { $mode |= $modes[$j]; } } $printer ->selectPrintMode($mode);

00000000 1b 40 1b 21 00 41 42 43 44 45 46 47 48 49 4a 61 |.@.!.ABCDEFGHIJa| 00000010 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 80 41 42 |bcdefghijk..!.AB| 00000020 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 00000030 69 6a 6b 0a 1b 21 20 41 42 43 44 45 46 47 48 49 |ijk..! ABCDEFGHI| 00000040 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 a0 |Jabcdefghijk..!| 00000050 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 00000060 67 68 69 6a 6b 0a 1b 21 10 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000070 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk..| 00000080 21 90 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 00000090 65 66 67 68 69 6a 6b 0a 1b 21 30 41 42 43 44 45 |efghijk..!0ABCDE| 000000a0 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 000000b0 0a 1b 21 b0 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 000000c0 63 64 65 66 67 68 69 6a 6b 0a 1b 21 08 41 42 43 |cdefghijk..!.ABC| 000000d0 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 000000e0 6a 6b 0a 1b 21 88 41 42 43 44 45 46 47 48 49 4a |jk.!.ABCDEFGHIJ| 000000f0 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 28 41 |abcdefghijk..!(A| 00000100 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 67 |BCDEFGHIJabcdefg| 00000110 68 69 6a 6b 0a 1b 21 a8 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 00000120 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 |IJabcdefghijk..!| 0 18 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 |.ABCDEFGHIJabcde| 00000140 66 67 68 69 6a 6b 0a 1b 21 98 41 42 43 44 45 46 |fghijk..!.ABCDEF| 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.| 00000160 1b 21 38 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!8ABCDEFGHIJabc| 1 42 43 44 | defghijk..!.ABCD | 00000180 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 6b 0a 1b 21 01 41 42 43 44 45 46 47 48 49 4a 61 |k.!.ABCDEFGHIJa|000001a0 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 81 41 42 |bcdefghijk..!.AB| 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 0001c0 69 6a 6b 0a 1b 21 21 41 42 43 44 45 46 47 48 49 |ijk..!!ABCDEFGHI| 000001d0 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 a1 |Jabcdefghijk..!| 000001e0 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 000001f0 67 68 69 6a 6b 0a 1b 21 11 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000200 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk。 .| 00000210 21 91 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 00000220 65 66 67 68 69 6a 6b 0a 1b 21 31 41 42 43 44 45 |efghijk..!1ABCDE| 00000230 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 00000240 0a 1b 21 b1 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 00000250 63 64 65 66 67 68 69 6a 6b 0a 1b 21 09 41 42 43 |cdefghijk..!.ABC| 00000260 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 00000270 6a 6b 0a 1b 21 89 41 42 43 44 45 46 47 48 49 4a |jk.!.ABCDEFGHIJ| 00000280 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 29 41 |abcdefghijk..!)A| 00000290 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 |BCDEFGHIJabcdefg| 000002a0 68 69 6a 6b 0a 1b 21 a9 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 000002b0 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 |IJabcdefghijk..!| 000002c0 19 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 |.ABCDEFGHIJabcde| 000002d0 66 67 68 69 6a 6b 0a 1b 21 99 41 42 43 44 45 46 |fghijk..!.ABCDEF| 000002e0 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.| 000002f0 1b 21 39 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!9ABCDEFGHIJabc| 00000300 64 65 66 67 68 69 6a 6b 0a 1b 21 b9 41 42 43 44 |defghijk..!.ABCD| 00000310 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 00000320 6b 0a 1b 21 00 41 42 43 44 45 46 47 48 49 4a 61 |k..!.ABCDEFGHIJa| 00000330 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 80 41 42 |bcdefghijk..!.AB| 00000340 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 00000350 69 6a 6b 0a 1b 21 20 41 42 43 44 45 46 47 48 49 |ijk..! ABCDEFGHI| 00000360 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 a0 |Jabcdefghijk..!| 00000370 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 00000380 67 68 69 6a 6b 0a 1b 21 10 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000390 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk..| 000003a0 21 90 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 000003b0 65 66 67 68 69 6a 6b 0a 1b 21 30 41 42 43 44 45 |efghijk..!0ABCDE| 000003c0 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 000003d0 0a 1b 21 b0 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 000003e0 63 64 65 66 67 68 69 6a 6b 0a 1b 21 08 41 42 43 |cdefghijk..!.ABC| 000003f0 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 00000400 6a 6b 0a 1b 21 88 41 42 43 44 45 46 47 48 49 4a |jk.!.ABCDEFGHIJ| 00000410 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 28 41 |abcdefghijk。 .!(A| 00000420 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 |BCDEFGHIJabcdefg| 00000430 68 69 6a 6b 0a 1b 21 a8 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 00000440 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 |IJabcdefghijk..!| 4 65 |.ABCDEFGHIJabcde| 00000460 66 67 68 69 6a 6b 0a 1b 21 98 41 42 43 44 45 46 |fghijk..!.ABCDEF| 00000470 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.| 1b 21 38 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!8ABCDEFGHIJabc| 00000490 64 65 66 67 68 69 6a 6b 0a 1b 21 b8 41 42 43 44 |defghijk..!.ABCD| 7 4 8 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 000004b0 6b 0a 1b 21 01 41 42 43 44 45 46 47 48 49 4a 61 |k..!.ABCDEFGHIJa| 000004c0 66 67 6 8 69 6a 6b 0a 1b 21 81 41 42..!AB 000004d0 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |ijk..!! 4f0 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 a1 |Jabcdefghijk..!.| 00000500 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 00000510 67 68 69 6a 6b 0a 1b 21 11 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000520 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk..| 00000530 21 91 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 00000540 65 66 67 68 69 6a 6b 0a 1b 21 31 41 42 43 44 45 |efghijk..!1ABCDE| 00000550 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 00000560 0a 1b 21 b1 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 00000570 63 64 65 66 67 68 69 6a 6b 0a 1b 21 09 41 42 43 |cdefghijk..!.ABC| 00000580 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 00000590 6a 6b 0a 1b 21 89 41 42 43 44 45 46 47 48 49 4a |jk.!.ABCDEFGHIJ| 000005a0 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 29 41 |abcdefghijk..!)A| 000005b0 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 |BCDEFGHIJabcdefg| 000005c0 68 69 6a 6b 0a 1b 21 a9 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 000005d0 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 |IJabcdefghijk..!| 000005e0 19 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 |.ABCDEFGHIJabcde| 000005f0 66 67 68 69 6a 6b 0a 1b 21 99 41 42 43 44 45 46 |fghijk..!.ABCDEF| 00000600 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.| 00000610 1b 21 39 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!9ABCDEFGHIJabc| 00000620 64 65 66 67 68 69 6a 6b 0a 1b 21 b9 41 42 43 44 |defghijk。 .!.ABCD| 00000630 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 00000640 6b 0a 1b 21 00 1d 56 41 03 |k..!.VA.| 00000649

$printer -> text("ABCDEFGHIJabcdefghijk\n"); ) $printer -> selectPrintMode(); // リセット $printer -> Cut(); $printer -> close();

コマンドは次のとおりです。

下線

ESC – [数字]

引数は、下線なしの場合は 0、下線の場合は 1、太い下線の場合は 2 に設定されます。< 3; $i++) { $printer ->__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* 下線 */ for($i = 0; $i

setUnderline($i); [メールで保護されています]$printer -> text("機敏な茶色のキツネが怠惰な犬を飛び越えます\n"); ) $printer -> setUnderline(0); // リセット $printer -> Cut(); $printer -> close();

00000000 1b 40 1b 2d 00 54 68 65 20 71 75 69 63 6b 20 62 |

コマンドは次のとおりです。

すぐにB| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |キツネがジャンプします| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |怠惰な犬版| 00000030 0a 1b 2d 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..-.クイック br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |自分のキツネがジャンプ ov| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |あの怠け者の犬。| 00000060 1b 2d 02 54 68 65 20 71 75 69 63 6b 20 62 72 6f |.-.素早い仲間| 00000070 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 |wn フォックス ジャンプ オーバー| 00000080 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a 1b |r 怠け者の犬..| 00000090 2d 00 1d 56 41 03 |-..VA.| 00000096

カット

ESC V [数値]< 5; $i++) { $printer ->この引数は明らかに「部分的」 (65) カットを実行するか、「完全」 (66) カットを実行するかを表していますが、私のプリンターのモデルには影響しません。

__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* カット */ for($i = 0; $i [メールで保護されています]| 00000010 41 03 1d 56 42 03 1d 56 41 03 1d 56 42 03 1d 56 |A..VB..VA..VB..V| 00000020 41 03 1d 56 42 03 1d 56 41 03 1d 56 41 03 |A..VB..VA..VA.| 0000002e

強調

コマンドは次のとおりです。

ESC E [数値]

強調を有効にするには 1 を使用し、無効にするには 0 を使用します。

__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* 強調 */ for($i = 0; $i< 2; $i++) { $printer ->setEmphasis($i == 1);

$printer -> text("機敏な茶色のキツネが怠惰な犬を飛び越えます\n"); ) $printer -> setEmphasis(false); // リセット $printer -> Cut(); $printer -> close(); [メールで保護されています] 00000000 1b 40 1b 45 00 54 68 65 20 71 75 69 63 6b 20 62 |

すぐにB| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |キツネがジャンプします| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |怠惰な犬版| 00000030 0a 1b 45 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..E.クイック br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |自分のキツネがジャンプ ov| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |あの怠け者の犬。| 00000060 1b 45 00 1d 56 41 03 |.E..VA.| 00000067

ダブルストライク< 2; $i++) { $printer ->__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* 二重打ち (基本的に強調と同じに見えます) */ for($i = 0; $i

setDoubleStrike($i == 1); [メールで保護されています]$printer -> text("機敏な茶色のキツネが怠惰な犬を飛び越えます\n"); ) $printer -> setDoubleStrike(false); $printer -> Cut(); $printer -> close();

00000000 1b 40 1b 47 00 54 68 65 20 71 75 69 63 6b 20 62 |

すぐにB| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |キツネがジャンプします| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |怠惰な犬版| 00000030 0a 1b 47 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..G.クイック br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |自分のキツネがジャンプ ov| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |あの怠け者の犬。| 00000060 1b 47 00 1d 56 41 03 |.G..VA.| 00000067< count($fonts); $i++) { $printer ->setFont($fonts[$i]);

$printer -> text("機敏な茶色のキツネが怠惰な犬を飛び越えます\n"); ) $printer -> setFont(); // リセット $printer -> Cut(); $printer -> close(); [メールで保護されています] 00000000 1b 40 1b 4d 00 54 68 65 20 71 75 69 63 6b 20 62 |

すぐにB| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |キツネがジャンプします| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |怠惰な犬版| 00000030 0a 1b 4d 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..M. クイック br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |自分のキツネがジャンプ ov| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |あの怠け者の犬。| 00000060 1b 4d 02 54 68 65 20 71 75 69 63 6b 20 62 72 6f |.M.素早い仲間| 00000070 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 |wn フォックス ジャンプ オーバー| 00000080 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a 1b |r 怠け者の犬..| 00000090 4d 00 1d 56 41 03 |M..VA.| 00000096

コマンドは次のとおりです。

正当化

ESC a [数字]

0 を使用して左揃え、1 を使用してテキストを中央揃え、2 を使用して右揃えにします。< count($justification); $i++) { $printer ->__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* 位置揃え */ $justification = array(Printer:::JUSTIFY_LEFT, Printer:::JUSTIFY_CENTER, Printer:::JUSTIFY_RIGHT); for($i = 0; $i

setJustification($justification[$i]); [メールで保護されています]$printer -> text("男はパナマ運河を計画する\n"); ) $printer -> setJustification(); // リセット $printer -> Cut(); $printer -> close();

00000000 1b 40 1b 61 00 41 20 6d 61 6e 20 61 20 70 6c 61 |

コマンドは次のとおりです。

男はプラ| 00000010 6e 20 61 20 63 61 6e 61 6c 20 70 61 6e 61 6d 61 |パナマ運河| 00000020 0a 1b 61 01 41 20 6d 61 6e 20 61 20 70 6c 61 6e |...a.男には計画がある| 00000030 20 61 20 63 61 6e 61 6c 20 70 61 6e 61 6d 61 0a | パナマ運河。| 00000040 1b 61 02 41 20 6d 61 6e 20 61 20 70 6c 61 6e 20 |.a.男は計画を立てる | 00000050 61 20 63 61 6e 61 6c 20 70 61 6e 61 6d 61 0a 1b |パナマ運河..| 00000060 61 00 1d 56 41 03 |a..VA.| 00000066
バーコード

GS h [数値] ESC k [数値] [テキスト] NUL最初のコマンドはバーコードの高さをドット単位で設定し、2 番目のコマンドは実際のバーコードを印刷します。 数字はバーコード規格を表します。

ほとんどの人にとって

__DIR__ が必要です。 "/autoload.php"; Mike42\Escpos\Printer を使用します。 Mike42\Escpos\PrintConnectors\FilePrintConnector を使用します。 $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = 新しいプリンター($connector); /* バーコード */ $barcodes = array(Printer:::BARCODE_UPCA, Printer:::BARCODE_UPCE, Printer:::BARCODE_JAN13, Printer:::BARCODE_JAN8, Printer:::BARCODE_CODE39, Printer:::BARCODE_ITF, Printer:::バーコード_CODABAR); $printer -> setBarcodeHeight(80); for($i = 0; $i< count($barcodes); $i++) { $printer ->text("バーコード $i " . "\n");

$printer -> barcode("9876", $barcodes[$i]); [メールで保護されています]$printer -> feed(); ) $printer -> Cut(); $printer -> close();

00000000 1b 40 1d 68 50 42 61 72 63 6f 64 65 20 30 20 0a |

0 .| 00000010 1d 6b 00 39 38 37 36 00 0a 42 61 72 63 6f 64 65 |.k.9876..バーコード| 00000020 20 31 20 0a 1d 6b 01 39 38 37 36 00 0a 42 61 72 | 1 ..k.9876..バー| 00000030 63 6f 64 65 20 32 20 0a 1d 6b 02 39 38 37 36 00 |コード 2 ..k.9876.| 00000040 0a 42 61 72 63 6f 64 65 20 33 20 0a 1d 6b 03 39 |.バーコード 3 ..k.9| 00000050 38 37 36 00 0a 42 61 72 63 6f 64 65 20 34 20 0a |876..バーコード 4 .| 00000060 1d 6b 04 39 38 37 36 00 0a 42 61 72 63 6f 64 65 |.k.9876..バーコード| 00000070 20 35 20 0a 1d 6b 05 39 38 37 36 00 0a 42 61 72 | 5 ..k.9876..バー| 00000080 63 6f 64 65 20 36 20 0a 1d 6b 06 39 38 37 36 00 |コード 6 ..k.9876.| 00000090 0a 1d 56 41 03 |..VA.| 00000095



店舗で買い物をするときに、レジ技術がどのように機能するかについて考える人はほとんどいません。 実際、これは技術的な観点からだけでなく、法的な観点からもうまく機能しているメカニズムです。 重要なのは小切手を受け取ることであることは誰もが知っていますが、なぜ小切手が購入を確認する会計文書なのかを知っているのは起業家自身だけです。 この記事では、レジ開発における私たちの経験を共有し、すべてが内部からどのように機能するかを説明します。

古い

レジ

1. システム: レジのハードウェア + ソフトウェア


レジ係の職場にインストールされるソフトウェアとハ​​ードウェアの複合体全体は、英語の販売場所 (販売場所) に由来する POS システムまたは POS 端末と呼ぶことができます。

POS システムがどのように機能するかを見てみましょう。 システムと端末の基本的な違いは、フィスカル メモリ (FP) またはフィスカル ストレージ (FN) の場所にあるため、POS システムの場合は印刷デバイスに組み込まれ、POS 端末の場合はコンピュータに配置されます。ユニット。 – 会計登録機関に基づいて動作するソフトウェアとハ​​ードウェアの複合体。 通常、POS コンピューター、モニターとキーボード、レシート プリンター、会計レコーダー、カスタマー ディスプレイ、キャッシュ ドロワー、リーダーで構成されます。 銀行カード。 典型的な現金機能のセット: 会計と商品の発行、お金の受け取りと発行、購入のキャンセル。

POS システムの最も興味深い部分は、 会計登録官 - これはシステムの中心部であり、レジ機 (CCM) のクラスの 1 つです。

会計メモリを内蔵したレシート プリンタは会計レジストラとして機能します。 通信チャネルを介して情報を受信し、処理して印刷します。 現金取引に関するデータは、リセットが必要になるまで、必要なだけフィスカル メモリに保存できます。

サーバーは会計登録官から税務サービスにデータを直接転送するために使用されます。 会計データオペレーター - OFD - 会計データの受信、処理、保存、税務局への送信を担当する特別な法人。

昨年、ロシアの起業家らは、法律54-FZ「レジ設備の使用に関する」の採択に関連して、オンラインレジへの移行とOFDを通じた税務署への小切手の送付について活発に議論した。


OFDの役割。 54-FZ とオンライン レジへの移行に関する記事の図

FTS は連邦税務局です ロシア連邦。 カザフスタンでは、この機能は財務省の歳入委員会によって行われています。 そしてベラルーシには租税公務省があります。

ロシア連邦では複数の OFD が運営されていますが、カザフスタンには Kazakhtelecom JSC の 1 つだけがあります。

2. 法律: レジのグローバルなオンライン管理

小売業務のオンライン監視はすでに多くの国で実施されています。 韓国(2005)、スウェーデン (2008)、カナダ (2010)、ポーランド (2011)、クロアチア (2013)。 2015 年に、このアプローチはカザフスタンで導入され始めました。 そしてベラルーシでは、レジを遠隔収益管理システムに接続する期限が2018年7月1日に延期された(ロシアでも同じ期限が予定されている)。

カザフスタンにおけるオンライン キャッシュ レジスターの使用は、税法第 90 章によって規制されています。 2015年以降、燃料やアルコールの販売業者は領収書をインターネット経由で税務署に送信し始めた。 2016 年からの第 2 段階では、さまざまな資材や設備の卸売業に携わる人々がシステムに接続されました。 家具、ソフトウェア、電子機器の小売販売。 ホテル、レストラン、美容院、映画館のオーナー。 プロジェクトの第 3 段階が計画されています。

私たちが法律に言及するのには理由があります。法律には、その基礎となるデータを収集して税務署に送信するためのソフトウェアおよびハードウェア システムの必須の技術要件が記載されています。 開発エンジニアのタスク。 たとえば、カザフスタン共和国財務大臣の命令により、現金支払いに関する情報を送信するためのレジの要件リストが発行されました。これは、会計レジストラを開発する際に非常に役立ちました。

3. 会計レジストラの設計とビジネスロジック

当社の基本開発装置はサーマルレシートプリンターです。 アセンブリ システムは Buildroot です。 プログラミング - Qt で

このプロジェクトでは以下の開発が必要でした。

1) 技術仕様。
2) POS コンピュータとの交換プロトコル。これを POS-C プロトコルと呼びます。
3) デバイスを制御するデーモン アプリケーション:

  • CCTプロトコルを使用したOFDサーバーとのデータ交換用モジュール(レジ機器)。
  • POS-Cプロトコルを使用してPOSコンピュータとデータ交換するためのモジュール。
  • 印刷制御モジュール。
  • 通信インターフェース制御モジュール。
  • データベース対話モジュール。
  • ウェブサーバー。

1) OFDサーバーとのデータ交換モジュール

デバイスとサーバー間の交換は、TCP/IP プロトコルを使用して実行されます。 この対話では、デバイスがクライアントであり、OFD がサーバーです。 プロトコル バッファは、CCP プロトコル経由で送信される情報のエンコードおよびデコードの基礎として使用されます。

Web インターフェースの目的:

  1. パラメータの設定。
  2. デバイスのステータスの表示。
  3. ソフトウェアのアップデート。


ウェブインターフェース

4. 結論

リストされたテクノロジーに基づいて、Web インターフェイスを介した多くの機能と設定、POS コンピューターとのさまざまな交換プロトコルのサポート、およびソフトウェアの更新機能を備えたデバイスを開発しました。

そして現在、Promwad のエンジニアリング チームは、オンライン レジの内部構造、データ転送プロトコル、法的要件、キッチン全体の印刷について考えずに、ただ店に来て何かを買うことは決してできないようです。
- 小切手を受け取ってください!
- ありがとう、その必要はありません! :-)

追伸 そして最後にユーモアの瞬間を。ArtAlienTV チームの英国のUFO研究家は、探査車キュリオシティの画像から古いレジに似た物体を発見しました。

プロトコルベース

レシート プリンターの標準的なタスクは、テキストを印刷することです。 さらに、フォント、サイズ、密度、その他のデバイス設定のカスタム設定を作成できます。 すべての情報 (有用な情報と制御) はテキストの形式で送信され、プリンターは制御コマンドを「キャッチ」して分離し、テキスト部分のみを印刷します。 したがって、制御はテキスト自体に含まれます。 サービス部分と情報部分を分離するには、印刷されず、コンピューターのキーボードから入力できない特殊文字が使用されます。 このような文字の例としては、「ESC」または 10 進コード文字 27 があります。この文字をプリンタに送信するということは、その後に短い印刷制御コマンドが続くことを意味します。 ESC/POS プロトコル コマンドの説明は通常、デバイスに付属しており、プリンタのマニュアルの一部です。

プリンターのおおよその機能

どうやって おおよその可能性標準のレシート プリンターのいずれについても、次のアクションを定義できます。

  • フォントサイズを増減します。
  • 反転フォント(黒地に白文字)の有効化
  • バーコード印刷。
  • アクティベーション 音声信号プリンター。
  • キャッシュドロワーを開くための電気信号を提供します。
  • プリンターのナイフを作動させて紙をカットします。

プリンターのモデルと機能に応じて、これらのアクションは ESC/POS コマンドを使用してアクティブ化されます。 この場合、プリンターは各コマンドを監視し、即座に実行します。

ESC/POS コマンドを使用する場合

ESC/POS コマンドは、プリンターがサポートしている場合 (ほぼすべてのプリンター)、中間コマンドを使用せずにプリンターを直接操作する場合にはいつでも使用できます。 Windowsドライバー A. Microinvest Warehouse Pro Light はデバイスを直接制御し、必要なコマンドをプリンターに送信します。 彼らは完璧に動作し、 USBを使用する中間ドライバーと USB - COM エミュレーションのないプリンター。

ESC/POSコマンドが使用できない場合

ESC/POS コマンドの使用が原理的に不可能なケースは 3 つあります。 1. 会計登録機関。 Fiscal プリンタは、ESC/POS プロトコルとはまったく互換性のない複雑な通信プロトコルを使用します。 その結果、プリンターは ESC/POS コマンドに応答しません。 2. プリンターを制御する場合 インストールされたWindowsドライバ。 この場合、ドライバー自体が ESC/POS コマンドを実行し、送信されたコマンドを断固として拒否します。 ソフトウェア。 その結果、プリンターには影響はありません。 3. プリント サーバーや他の同様のテクノロジなどの中間手段が使用される印刷時。 この場合、ESC/POS コマンドはフィルタリングされ、プリンタに到達することなく通信中に失われます。 システムを構築する際には、プリンターの管理を適切に計画する必要があります。 各プリンターを制御コンピューターに直接リンクし、ドライバーを使用せずにプロトコルに従って直接動作させることをお勧めします。

コマンドコーディング

ESC/POS コマンドは 1 つ以上の方法でエンコードされます。 特殊文字そしてコマンドパラメータ。 これらすべては、Microinvest Warehouse Pro Light または Microinvest のプリンター設定の対応するセクション (ヘッダー、詳細、合計、またはフッター) に説明されています。 デバイスマネージャ. 基本コマンドコントロールは次のとおりです。

それらのアクションはプリンターのマニュアルに説明されており、ESC/POS プロトコルによって標準化されています。

人気チーム

最も一般的な ESC/POS プロトコル コマンドのおおよそのリスト:

  • !- フォント A をアクティブ化します。
  • !- フォント B をアクティブ化します。
  • !- 倍の高さのフォント;
  • !- 全角フォント。
  • !- 通常の高さのフォント A;
  • E - 太字フォントが含まれています。
  • E - 太字フォントをオフにします。
  • B - 反転印刷が含まれます。
  • B - 反転印刷をオフにします。
  • i – プリンターのナイフをアクティブにします。

リストされているコマンドは、さまざまなプリンターの ESC/POS プロトコルからの抜粋に従って標準化されていますが、それぞれのプリンターには独自のコマンド実行テクノロジがあり、結果はメーカーまたはモデルによって異なる場合があります。 望ましい効果を実現するには、プリンターによって実行されるコマンドをテストして選択する必要があります。

その他の情報

ESC/POS は、非常に強力なプリンタ制御テクノロジです。 このプロトコルを使用すると、ほとんどすべての最新のプリンタで優れた結果を得ることができます。 残念ながら、両者の間に 100% の互換性はありません。 さまざまなデバイスしたがって、各コマンドは実際の特定のデバイスでテストする必要があります。 一部のコマンドは実行時間に依存します。 したがって、たとえば、ナイフをアクティブにすると、内容の印刷が先に進み、間違った場所でレシートが切り取られる可能性があります。 したがって、ESC/POS コマンドを使用するには、プリンターのモデルに応じて、実際のテストと慎重な構成が必要です。

役立つリソース

  • すべての製品のドキュメント。
  • Microinvest テクニカル サポート フォーラム。質問に対する回答がすぐに得られます。