В этой статье мы расскажем, как получить термопринтер для печати чеков с интерфейсом 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. Вам нужно проверить несколько вещей:
- Установите другой linux-образ, если драйвер вообще отсутствует на вашем компьютере.
- modprobe или insmod usblp
- черный список драйвера поставщика, заявившего интерфейс.
- запустите lsusb -v и usb-devices (ищите драйвер = )
Печать чего-то полезного
Принтер использует 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 на GitHub
Приведенный выше пример будет написан с использованием 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