온라인 금전 등록기 내부에 숨겨진 것: 회계 등록 기관의 개발. ESC POS ESC * 프린터에 비트맵을 인쇄하는 명령 ESC를 사용하여 여러 줄 인쇄

ESC *는 ESC/POS의 여러 "그림 비트" 명령 중 하나입니다. 8 또는 24픽셀의 한 행만 나타낼 수 있는 "열 형식" 데이터를 허용합니다. 여기에는 두 가지 좋은 옵션이 있습니다.

ESC*를 사용하여 여러 줄 인쇄

한 줄만 인쇄해도 될 것 같으니 데이터 형식 자체에는 문제가 없다고 가정하겠습니다.

\n 줄 바꿈으로 구분된 추가 줄을 인쇄하는 명령을 반복하면 여러 줄을 인쇄할 수 있습니다. 이를 위해서는 이미지를 자르고 높이가 8픽셀 또는 24픽셀의 배수가 되도록 공백을 채워야 합니다(역시 형식으로 인해).

줄 간격으로 인해 이미지가 인쇄되는 동안 선형 채널의 크기를 조정하는 명령을 실행한 다음 마지막에 이를 재설정하는 또 다른 명령을 실행해야 합니다.

16개 채널 라인(바이트 0x1b 0x33 0x10)에는 ESC 3 0x10을 사용하고 재설정에는 ESC 2(바이트 0x1b 0x32)를 사용합니다.

이 인쇄 방법은 기존 프린터와 호환성이 뛰어나지만 출력물에 가는 가로줄이 나타날 수 있습니다.

GS v 0으로 전체 이미지 인쇄

image 명령의 이 비트는 다양한 "래스터 형식" 데이터를 허용합니다. 나는 이 형식의 블롭이 널리 사용되는 PBM 비트맵 형식의 이진 데이터(특히 P4 헤더 파일의 이진 데이터)와 동일하다는 사실을 활용하고 있습니다.

이미지 높이는 인쇄 버퍼의 크기에 따라 제한되지만 최대 65535픽셀까지 가능합니다. 표현으로 인해 너비는 8로 나누어야 합니다.

매장에서 쇼핑할 때 계산원 기술이 어떻게 작동하는지 생각하는 사람은 거의 없습니다. 실제로 이는 기술적인 관점뿐만 아니라 법적 관점에서도 매우 효율적인 메커니즘입니다. 수표를 받는 것이 가장 중요하다는 것은 누구나 알고 있지만 수표가 구매를 확인하는 재정 문서인 이유는 기업가들만이 알고 있습니다.

이 기사에서는 금전 등록기 개발 경험을 공유하고 모든 것이 내부에서 어떻게 작동하는지 알려 드리겠습니다.



빈티지 금전 등록기

1. 시스템: 계산원의 하드웨어 + 소프트웨어

계산원의 작업장에 설치된 전체 소프트웨어 및 하드웨어 단지는 영어 POS (Point of Sale)-판매 장소에서 POS 시스템 또는 POS 터미널이라고 부를 수 있습니다.

POS 시스템이 어떻게 작동하는지 살펴보겠습니다. 시스템과 단말기의 근본적인 차이점은 재정 메모리(FP) 또는 재정 저장 장치(FS)의 위치이므로 POS 시스템의 경우 인쇄 장치에 내장되어 있고 POS 단말기의 경우 컴퓨터에 있습니다. 단위.


전형적인 금전 등록기. 러시아 회사 "SHTRIKH-M"의 POS 시스템

POS 시스템 – 회계 등록 기관을 기반으로 운영되는 소프트웨어 및 하드웨어 복합체입니다. 일반적으로 POS 컴퓨터, 모니터 및 키보드, 영수증 프린터, 회계 기록기, 고객 디스플레이, 금전함 및 은행 카드 리더기로 구성됩니다. 일반적인 현금 기능 세트: 상품 회계 및 발행, 자금 수령 및 발행, 구매 취소.

POS 시스템에서 가장 흥미로운 부분은 재정 등록 기관 - 이것은 시스템의 핵심이자 금전 등록기(CCM) 클래스 중 하나입니다.

회계 메모리가 내장된 영수증 프린터는 회계 등록 기관 역할을 합니다. 통신 채널을 통해 정보를 수신하여 처리하고 인쇄합니다. 현금 거래 데이터는 재설정이 필요할 때까지 원하는 기간 동안 회계 메모리에 저장할 수 있습니다.

서버는 회계 등록 기관에서 세무 서비스로 데이터를 직접 전송하는 데 사용됩니다. 회계 데이터 운영자 - OFD - 재정 데이터를 수신, 처리, 저장 및 세무 서비스로 전송하는 일을 담당하는 특수 법인입니다.

작년에 러시아 기업가들은 "금전 등록기 장비 사용에 관한 법률 54-FZ"의 채택과 관련하여 온라인 금전 등록기로의 전환과 OFD를 통해 세무서에 수표를 보내는 것에 대해 적극적으로 논의했습니다.


OFD의 역할. 54-FZ에 관한 기사의 계획과 온라인 금전 등록기로의 전환

연방세청은 러시아 연방의 연방세청입니다. 카자흐스탄에서는 재무부 국가세입위원회가 이 기능을 수행합니다. 벨로루시에서는 세금 및 관세부입니다.

러시아 연방에는 여러 개의 OFD가 운영되고 있지만 카자흐스탄에는 Kazakhtelecom JSC가 하나만 있습니다.

2. 입법: 금전등록기의 글로벌 온라인 통제

소매 운영에 대한 온라인 모니터링은 이미 한국(2005), 스웨덴(2008), 캐나다(2010), 폴란드(2011), 크로아티아(2013) 등 많은 국가에서 운영되고 있습니다. 2015년에 이 접근법이 카자흐스탄에서 시행되기 시작했습니다. 그리고 벨로루시에서는 금전 등록기를 원격 수익 관리 시스템에 연결하는 마감일이 2018년 7월 1일로 연기되었습니다(러시아에서도 동일한 마감일이 예정되어 있음).

카자흐스탄의 온라인 금전등록기 사용은 세금법 90장에 의해 규제됩니다. 2015년부터 연료 및 주류 판매자는 인터넷을 통해 영수증을 세무서에 전송하기 시작했습니다. 두 번째 단계에서는 2016년부터 다양한 자재 및 장비 도매 거래에 종사하는 사람들이 시스템에 연결되었습니다. 가구, 소프트웨어, 전자제품 소매 판매; 호텔, 레스토랑, 미용실, 영화관의 소유자. 프로젝트의 세 번째 단계가 예상됩니다.

우리가 법률을 참조하는 이유는 데이터를 수집하고 세무서에 전송하기 위한 소프트웨어 및 하드웨어 시스템에 대한 필수 기술 요구 사항을 설명하는 것입니다. 개발 엔지니어를 위한 작업입니다. 예를 들어, 카자흐스탄 공화국 재무부 장관의 명령에 따라 현금 지불 정보 전송을 위한 금전 등록기 요구 사항 목록이 공개되었는데 이는 재정 등록 기관을 개발하는 데 매우 유용했습니다.

3. 회계 등록기관의 설계 및 비즈니스 로직

우리의 기본 개발 장치는 열전사 영수증 프린터입니다. 어셈블리 시스템은 Buildroot입니다. 프로그래밍 - Qt.

이 프로젝트에는 다음의 개발이 필요했습니다.

1) 기술 사양
2) POS 컴퓨터와의 교환 프로토콜을 POS-C 프로토콜이라고 부르겠습니다.
3) 장치를 제어하는 ​​데몬 애플리케이션:

  • CCT 프로토콜(금전등록기)을 사용하여 OFD 서버와 데이터를 교환하기 위한 모듈;
  • POS-C 프로토콜을 사용하여 POS 컴퓨터와 데이터를 교환하기 위한 모듈;
  • 인쇄 제어 모듈;
  • 통신 인터페이스 제어 모듈;
  • 데이터베이스 상호작용 모듈;
  • 웹 서버.

1) OFD 서버와의 데이터 교환 모듈

장치와 서버 간의 교환은 TCP/IP 프로토콜을 사용하여 수행됩니다. 이 상호 작용에서 장치는 클라이언트이고 OFD는 서버입니다. 프로토콜 버퍼는 CCP 프로토콜을 통해 전송되는 정보를 인코딩 및 디코딩하기 위한 기초로 사용됩니다.

웹 인터페이스의 목적:

  1. 설정;
  2. 장치 상태 보기;
  3. 소프트웨어 업데이트.


웹 인터페이스

4. 결론

나열된 기술을 기반으로 웹 인터페이스를 통한 많은 기능과 설정, POS 컴퓨터와의 다양한 교환 프로토콜 지원, 소프트웨어 업데이트 기능을 갖춘 장치를 개발했습니다.

이제 Promwad 엔지니어링 팀은 온라인 금전 등록기의 모든 내부 요소, 데이터 전송 프로토콜, 법적 요구 사항 및 이 전체 주방 인쇄에 대해 생각하지 않고 매장에 와서 무언가를 구입할 수 없을 것 같습니다.
- 수표를 받아주세요!
- 고맙지 만 사양 할게! :-)

추신 그리고 마지막으로 유머의 순간입니다. ArtAlienTV 팀의 영국 ufologists는 Curiosity 탐사선의 이미지에서 오래된 금전 등록기와 유사한 물체를 발견했습니다.

ESC/POS는 영수증 프린터를 인쇄하는 명령 세트입니다.

소개

시작하기 전에 ESC/POS에 대해 알아야 할 세 가지 사항이 있습니다.

  1. 대부분의 최신 영수증 프린터는 어떤 형태로든 이를 지원합니다.
  2. 쓰기엔 정말 간단해요.
  3. 명령은 ESC 문자(ASCII 27)로 시작됩니다.

참고로 위 영상에 출력된 영수증은 escpos-php 저장소의 예시입니다. 기본적인 ESC/POS 기능을 모두 보여주므로 이 인쇄물을 단계별로 살펴보겠습니다.

명령 구조

4개의 특정 ASCII 문자가 명령 시퀀스에 나타납니다.

약어 이름 코드(16진수)
없는 0x00
LF 줄 바꿈 0x0A
ESC 탈출하다 0x1B
G.S. 그룹 구분자 0x1D

일반 텍스트는 줄 바꿈으로 구분되어 프린터로 전송됩니다. 명령은 ESC 또는 GS로 시작하고 그 뒤에 인쇄 가능한 문자가 오고 때로는 숫자가 옵니다.

숫자는 단순히 문자로 전달됩니다. 예를 들어 '5'는 0x05로 전달됩니다.

초기화

프린터에 처음 연결하면 초기화를 해야 합니다. 이전 인쇄물에서 사용했던 삼중 밑줄 이중 스트라이크 글꼴이 아닌 기본 형식으로 되돌아갑니다.

서식을 재설정하는 명령은 다음과 같습니다.

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); $프린터 -> 닫기();

00000000 1b 40 |.@| 00000003

'Hello World' 텍스트

이것은 가장 간단한 영수증 유형이며 서식이 지정되지 않은 텍스트만 포함합니다.

텍스트는 줄 바꿈으로 구분되어 프린터로 전송됩니다.

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); /* 텍스트 */ $printer -> text("Hello world\n"); $프린터 -> 잘라내기(); $프린터 -> 닫기();

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[번호]

첫 번째 명령은 정방향으로 피드되고 두 번째 명령은 역방향으로 피드됩니다. 예제에서 데모 프린터는 역방향 용지 공급을 지원하지 않는 것을 볼 수 있습니다.

Require_once(dirname(__FILE__) . "/escpos-php/Escpos.php"); $프린터 = 새로운 Escpos(); /* 줄 바꿈 */ $printer -> text("ABC"); $프린터 -> 피드(7); $프린터 -> text("DEF"); $프린터 -> FeedReverse(3); $프린터 -> text("GHI"); $프린터 -> 피드(); $프린터 -> 잘라내기(); $프린터 -> 닫기();

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

인쇄 모드

인쇄 모드에는 단일 속성에 글꼴 높이, 너비 및 굵기가 포함됩니다.

명령은 다음과 같습니다:

글꼴 모드는 선택한 속성을 논리적으로 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"); $프린터 = 새 프린터($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); $printer -> text("ABCDEFGHIJabcdefghijk\n"); ) $프린터 -> selectPrintMode(); // $printer 재설정 -> cut(); $프린터 -> 닫기();

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| 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| 68 69 6a 6b 0a 1b 21 b8 41 42 43 44 | 데프기크..!.ABCD 00000180 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 00000190 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| 000001b0 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 001c0 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 |안녕..!.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 6 47 48 |하이크..!.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.| b 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| 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 62 63 64 65 66 67 6 8 69 6a 6 b 0a 1b 21 81 41 42 | .!.AB| 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 45 46 47 48 49 |ijk..!! 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 |안녕..!.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

밑줄

명령은 다음과 같습니다:

ESC – [번호]

인수는 밑줄이 없는 경우 0, 밑줄이 있는 경우 1, 두꺼운 밑줄의 경우 2로 설정됩니다.

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); /* 밑줄 */ for($i = 0; $i< 3; $i++) { $printer ->setUnderline($i); $printer -> text("빠른 갈색 여우가 게으른 개를 뛰어넘습니다\n"); ) $프린터 -> setUnderline(0); // $printer 재설정 -> cut(); $프린터 -> 닫기();

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 |rown fox 점프 o| 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 [번호]

이 주장은 분명히 '부분'(65) 또는 '전체'(66) 자르기를 수행할지 여부를 나타내지만 내 프린터 모델에는 영향을 미치지 않습니다.

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); /* 컷 */ for($i = 0; $i< 5; $i++) { $printer ->cut(프린터:::CUT_PARTIAL); $프린터 -> 잘라내기(프린터:::CUT_FULL); ) $프린터 -> 잘라내기(); $프린터 -> 닫기();

00000000 1b 40 1d 56 42 03 1d 56 41 03 1d 56 42 03 1d 56 | [이메일 보호됨]| 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"); $프린터 = 새 프린터($connector); /* 강조 */ for($i = 0; $i< 2; $i++) { $printer ->setEmphasis($i == 1); $printer -> text("빠른 갈색 여우가 게으른 개를 뛰어넘습니다\n"); ) $프린터 -> setEmphasis(false); // $printer 재설정 -> cut(); $프린터 -> 닫기();

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 |rown fox 점프 o| 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

이중 타격

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); /* 두 번 스트라이크(기본적으로 강조와 동일해 보입니다) */ for($i = 0; $i< 2; $i++) { $printer ->setDoubleStrike($i == 1); $printer -> text("빠른 갈색 여우가 게으른 개를 뛰어넘습니다\n"); ) $printer -> setDoubleStrike(false); $프린터 -> 잘라내기(); $프린터 -> 닫기();

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 |rown fox 점프 o| 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

글꼴

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); /* 글꼴(많은 프린터에는 "글꼴 C"가 없습니다) */ $fonts = array(Printer:::FONT_A, Printer:::FONT_B, Printer:::FONT_C); for($i = 0; $i< count($fonts); $i++) { $printer ->setFont($fonts[$i]); $printer -> text("빠른 갈색 여우가 게으른 개를 뛰어넘습니다\n"); ) $프린터 -> setFont(); // $printer 재설정 -> cut(); $프린터 -> 닫기();

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 |rown fox 점프 o| 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를 사용합니다.

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); /* 정당화 */ $justification = array(Printer:::JUSTIFY_LEFT, Printer:::JUSTIFY_CENTER, Printer:::JUSTIFY_RIGHT); for($i = 0; $i< count($justification); $i++) { $printer ->setJustification($justification[$i]); $printer -> text("남자는 파나마 운하를 계획하고 있습니다\n"); ) $프린터 -> setJustification(); // $printer 재설정 -> cut(); $프린터 -> 닫기();

00000000 1b 40 1b 61 00 41 20 6d 61 6e 20 61 20 70 6c 61 | [이메일 보호됨]남자는 pla| 00000010 6e 20 61 20 63 61 6e 61 6c 20 70 61 6e 61 6d 61 |n 운하 파나마| 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.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

첫 번째 명령은 도트로 측정된 바코드 높이를 설정하는 반면, 두 번째 명령은 실제 ​​바코드를 인쇄합니다. 숫자는 바코드 표준을 나타내며 대부분의 경우 CODE39를 나타내는 "4"여야 합니다. PHP 드라이버는 6가지 표준을 지원합니다.

드라이버 결함이나 프린터 비호환성으로 인해 일부 바코드가 인쇄되지 않는 것을 알 수 있습니다! 위와 같이 이런 문제가 발생하면 CODE39를 사용하는 것이 좋습니다.

__DIR__이 필요합니다. "/autoload.php"; Mike42\Escpos\Printer를 사용하십시오. Mike42\Escpos\PrintConnectors\FilePrintConnector를 사용합니다. $connector = new FilePrintConnector("/dev/usb/lp0"); $프린터 = 새 프린터($connector); /* 바코드 */ $barcodes = array(프린터:::BARCODE_UPCA, 프린터:::BARCODE_UPCE, 프린터:::BARCODE_JAN13, 프린터:::BARCODE_JAN8, 프린터:::BARCODE_CODE39, 프린터:::BARCODE_ITF, 프린터::: BARCODE_CODABAR); $printer -> setBarcodeHeight(80); for($i = 0; $i< count($barcodes); $i++) { $printer ->text("바코드 $i " . "\n"); $프린터 -> 바코드("9876", $barcodes[$i]); $프린터 -> 피드(); ) $프린터 -> 잘라내기(); $프린터 -> 닫기();

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

프로토콜 기반

영수증 프린터의 표준 작업은 텍스트를 인쇄하는 것입니다. 또한 글꼴, 크기, 밀도 및 기타 장치 설정에 대한 사용자 정의 설정을 만들 수 있습니다. 모든 정보(유용하고 제어)는 텍스트 형식으로 전송됩니다. 프린터는 제어 명령을 "잡아" 분리하고 텍스트 부분만 인쇄합니다. 따라서 제어는 텍스트 자체에 포함됩니다. 서비스 부분과 정보 부분을 구분하기 위해 인쇄되지 않고 컴퓨터 키보드로 입력할 수 없는 특수 문자가 사용됩니다. 이러한 문자의 예로는 "ESC" 또는 10진수 코드 문자 27이 있습니다. 이 문자를 프린터로 보내는 것은 이 문자 뒤에 짧은 인쇄 제어 명령이 따른다는 의미입니다. ESC/POS 프로토콜 명령에 대한 설명은 일반적으로 장치와 함께 제공되며 프린터 설명서의 일부입니다.

대략적인 프린터 기능

다음 작업은 표준 영수증 프린터의 대략적인 기능으로 정의할 수 있습니다.

  • 글꼴 크기를 늘리거나 줄입니다.
  • 역글꼴 활성화(검은색 배경에 흰색 글자)
  • 바코드 인쇄;
  • 프린터 경고음을 활성화하십시오.
  • 현금 서랍을 열도록 전기 신호를 제공하는 단계;
  • 프린터의 칼을 활성화하여 종이를 자릅니다.

프린터의 모델과 기능에 따라 이러한 작업은 ESC/POS 명령을 사용하여 활성화됩니다. 이 경우 프린터는 각 명령을 모니터링하고 즉시 실행합니다.

ESC/POS 명령을 사용하는 경우

ESC/POS 명령 사용은 프린터가 이를 지원할 때마다(거의 모든 프린터) 가능하며 중간 Windows 드라이버를 사용하지 않고 프린터에서 직접 작업할 때 가능합니다. Microinvest Warehouse Pro Light는 장치를 직접 제어하여 필요한 명령을 프린터로 보냅니다. 중간 드라이버 없이 USB 프린터를 사용하고 USB-COM 에뮬레이션을 사용할 때 완벽하게 작동합니다.

ESC/POS 명령을 사용할 수 없는 경우

원칙적으로 ESC/POS 명령 사용이 불가능한 경우는 3가지입니다. 1. 회계 등록 기관. 회계 프린터는 ESC/POS 프로토콜과 전혀 호환되지 않는 복잡한 통신 프로토콜을 사용합니다. 결과적으로 프린터는 ESC/POS 명령에 응답하지 않습니다. 2. 설치된 Windows 드라이버를 통해 프린터를 제어하는 ​​경우. 이 경우 드라이버 자체는 ESC/POS 명령을 실행하며 소프트웨어에서 보낸 명령을 엄격히 거부합니다. 결과적으로 프린터에는 아무런 영향이 없습니다. 3. 인쇄 서버 또는 기타 유사한 기술과 같은 중간 매체를 사용하여 인쇄하는 경우. 이 경우 ESC/POS 명령은 프린터에 도달하지 못한 채 통신 중에 필터링되어 손실됩니다. 시스템을 구축할 때 프린터 관리를 적절하게 계획하는 것이 필요합니다. 각 프린터를 제어 컴퓨터에 직접 연결하고, 드라이버 없이 프로토콜에 따라 직접 작업하는 것을 권장합니다.

명령 코딩

ESC/POS 명령은 하나 이상의 특수 문자와 명령 매개변수를 통해 인코딩됩니다. 이 모든 내용은 Microinvest Warehouse Pro Light 또는 Microinvest Device Manager의 프린터 설정에 있는 해당 섹션(머리글, 세부 정보, 총계 또는 바닥글)에 설명되어 있습니다. 주요 제어 명령은 다음과 같습니다.

해당 작업은 프린터 설명서에 설명되어 있으며 ESC/POS 프로토콜로 표준화되어 있습니다.

인기있는 팀

가장 널리 사용되는 ESC/POS 프로토콜 명령의 대략적인 목록:

  • !- 글꼴 A를 활성화합니다.
  • !- 글꼴 B를 활성화합니다.
  • !- 이중 높이 글꼴;
  • !- 이중 너비 글꼴;
  • !- 보통 높이의 글꼴 A;
  • 이자형 - 굵은 글꼴이 포함되어 있습니다.
  • 이자형 - 굵은 글꼴을 끕니다.
  • - 역 인쇄가 포함됩니다.
  • - 역 인쇄를 끕니다.
  • i - 프린터의 칼을 활성화합니다.

나열된 명령은 다양한 프린터의 ESC/POS 프로토콜에서 발췌한 내용에 따라 표준화되어 있지만 각 명령에는 고유한 명령 실행 기술이 있으므로 제조업체나 모델에 따라 결과가 다를 수 있습니다. 원하는 효과를 얻으려면 프린터에서 실행되는 명령을 테스트하고 선택해야 합니다.

기타 정보

ESC/POS는 매우 강력한 프린터 제어 기술입니다. 이 프로토콜을 통해 거의 모든 최신 프린터에서 탁월한 결과를 얻을 수 있습니다. 안타깝게도 서로 다른 장치 간에 100% 호환성이 없으므로 각 명령은 실제 ​​특정 장치에서 테스트해야 합니다. 일부 명령은 실행 시간에 따라 달라집니다. 예를 들어, 칼을 활성화하면 내용이 인쇄보다 앞서서 잘못된 위치에서 영수증이 잘릴 수 있습니다. 따라서 ESC/POS 명령을 사용하려면 프린터 모델에 따라 실제 테스트와 신중한 구성이 필요합니다.

유용한 자료

  • 모든 제품에 대한 문서
  • 귀하의 질문에 대한 답변을 신속하게 얻을 수 있는 Microinvest 기술 지원 포럼


 

다음 내용을 읽어보는 것이 도움이 될 수 있습니다.