ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Получение USB-чекового принтера, работающего в Linux

В этой статье мы расскажем, как получить термопринтер для печати чеков с интерфейсом USB, в Linux. Цель этого состоит в том, чтобы иметь возможность указать драйвер, такой как escpos-php, на устройство. Используемый здесь принтер Epson TM-T20 для печати самоклеющих этикеток, который очень распространен в торговых точках.

Приведенные ниже указания относятся к Debian, но могут быть адаптированы для любого другого Linux.

Поиск файла устройства

Подключите принтер и убедитесь, что usblp видит его:

dmesg
[11535.985647] usb 8-4: new full-speed USB device number 5 using ohci-pci
[11536.142563] usb 8-4: New USB device found, idVendor=04b8, idProduct=0e03
[11536.142568] usb 8-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[11536.142563] usb 8-4: Product: TM-T20
[11536.142567] usb 8-4: Manufacturer: EPSON
[11536.142570] usb 8-4: SerialNumber: ....
[11536.151283] usblp 8-4:1.0: usblp1: USB Bidirectional printer dev 5 if 0 alt 0 proto 2 vid 0x04B8 pid 0x0E03

 

Этот модуль ядра делает ваш принтер видимым как файл устройства, так что к нему можно получить доступ старым способом. Найдите новый файл устройства в /dev/usb :

ls /dev/usb

 

В нашем случае это был /dev/usb/lp1 . Следующий шаг – посмотреть, можете ли вы написать в него:

echo "Hello" >> /dev/usb/lp1

 

Скорее всего, в этот момент вы получите сообщение об отказе в разрешении, поэтому выясните, в какой группе находится принтер:

stat /dev/usb/lp1

 

Который покажет вывод что-то вроде:

File: ‘/dev/usb/lp1’
  Size: 0         	Blocks: 0          IO Block: 4096   character special file
Device: 5h/5d	Inode: 220997      Links: 1     Device type: b4,1
Access: (0660/crw-rw----)  Uid: (    0/    root)   Gid: (    7/      lp)
...

 

Этот файл принадлежит группе lp («line printer»). Если ваше имя пользователя было andreyex, вы бы добавили себя в эту группу, используя:

sudo usermod -a -G lp andreyex

 

Если вы планируете создать систему торговых точек на основе веб-интерфейса, добавьте в эту группу пользователя www-data.

Теперь выйдите и снова войдите, и предыдущий тест теперь должен работать:

echo "Hello" >> /dev/usb/lp1

 

Устранение неполадок: проверьте usblp

Если эти шаги не работают, то ваш компьютер не работает или не использует usblp. Вам нужно проверить несколько вещей:

Печать чего-то полезного

Принтер использует ESC / POS, что означает, что он принимает открытый текст с некоторыми специальными командами для форматирования.

Простой генератор квитанций, foo.php , может выглядеть так:

<?php
/* Константы ASCII */
const ESC = "\x1b";
const GS="\x1d";
const NUL="\x00";

/* Вывод примера поступления */
echo ESC."@"; // Сбросить настройки по умолчанию
echo ESC."E".chr(1); // Жирный
echo "ANDREYEX CORP Ltd.\n"; // Компания
echo ESC."E".chr(0); // Не жирный
echo ESC."d".chr(1); // Пустая строка
echo "Receipt for whatever\n"; // Печатный текст
echo ESC."d".chr(4); // 4 пустые строки

/* Штрих-код в конце */
echo ESC."a".chr(1); // Печать по центру
echo GS."k".chr(4)."987654321".NUL; // Печать баркода
echo ESC."d".chr(1); // Пустая строка
echo "987654321\n"; // Печать номера
echo GS."V\x41".chr(3); // Вырезать
exit(0);

 

И вы бы могли отправить его на принтер следующим образом:

php foo.php > /dev/usb/lp1

 

Масштабирование

С кодами довольно сложно работать вручную, поэтому надо собрать драйвер escpos-php. Вы можете найти его по адресу:

Приведенный выше пример будет написан с использованием escpos-php, как:

<?php
require __DIR__ . '/autoload.php';
use AndreyEx\Escpos\Printer;
use AndreyEx\Escpos\PrintConnectors\FilePrintConnector;
$connector = new FilePrintConnector("/dev/usb/lp1");
$printer = new Printer($connector);

/* Печать полужирного текста */
$printer -> setEmphasis(true);
$printer -> text("ANDREYEX CORP Ltd.\n");
$printer -> setEmphasis(false);
$printer -> feed();
$printer -> text("Receipt for whatever\n");
$printer -> feed(4);

/* Штрих-код в конце */
$printer -> setJustification(Printer::JUSTIFY_CENTER);
$printer -> barcode("987654321");
$printer -> cut();
?>

 

Данный код будет отправлен на принтер, загрузив его из Интернета или запустив скрипт в командной строке:

php foo2.php
Exit mobile version