понедельник, 24 ноября 2014 г.

Работа с фискальными принтерами АТОЛ и Штрих-М из PHP

В процессе работы над парой проектов интернет-магазинов мне довелось подключать фискальные принтеры к PHP-приложениям. 1С не было и не планировалось. Значит подключать надо было напрямую к PHP безо всяких системных драйверов.
Значит надо было реализовать протокол обмена с фискальным принтером на PHP, благо для этого имелся качественный официальный мануал.
В статье выкладываю получившийся PHP драйвер для моделей сразу двух производителей: АТОЛ (FPrint-5200K) и Штрих-М (Штрих-Light 100).
Код расширяемый, и не составит труда допилить при необходимости до другой схожей модели того же производителя.
Для демонстрации подключения FPrint-5200K к PHP напишем консольный скрипт:
<?php
require('KKM/_lib.php'); // там нужно раскомментировать нужную модель
$port = new LocalComPort('/dev/ttyUSB0'); // COM-порт, куда включен принтер
#$kkm = new Shtrih_Light_100($port, 'printf'); // printf - callback для debug вывода
$kkm = new FPrint5200K($port, 'printf');
try {
    $kkm->openConnection();
    if ($kkm->isReady()) {
        echo 'Ready' . PHP_EOL;
        $kkm->beep(); // см.команды в файлах FPrint5200K, Shtrih_Light_100, *HiLevel
    }
    else {
        echo 'Not ready' . PHP_EOL;
    }
    $kkm->closeConnection();
}
catch (Exception $e) {
    echo 'E: ' . $e->getMessage() . ' [' . $e->getCode() . ']' . PHP_EOL;
}
А вообще пример скрипта есть в комплекте - называется runcli.php
Также в комплекте PDF руководства для программистов по реализации протокола обмена.

И на всякий случай отдельно:
Протокол обмена АТОЛ FPrint

Протокол обмена Штрих-М


Проект на Github https://github.com/mexxval/KKM

8 комментариев:

  1. Добрый день, Валерий ! Ваша задумка очень даже полезная. Но я не очень силен в PHP. У меня возникла потребность общаться с принтером ккм через браузер на PHP. Запись в порт я представляю как fopen("comX", "w"); fwrite($fp, $command); но не знаю как правильно посылать команды (в каком виде) и как обрабатывать ответ. Принтер используется ATOL Fprint11 и Меркурий 119. вы не могли бы посодействовать в решении данного вопроса ?

    ОтветитьУдалить
    Ответы
    1. добрый день. Вам стоит ознакомиться с кодом и примером его использования (вызов метода beep()).

      Удалить
  2. Отличная идея! Необходима от вас помощь за финансовое вознаграждение. Укажите пожалуйста любую удобную форму связи. vinnikia at mail.ru

    ОтветитьУдалить
  3. Валерий, здравствуйте! Вы случайно через протокол обмена используя Ethernet не пробовали работать? Например с Атол FPrint22ПТК

    ОтветитьУдалить
    Ответы
    1. здравствуйте. с FPrint22ПТК не работал. через ethernet я прокидывал COM-порт на немецкий сервер с офисного через ssh и работал с ним из веб-приложения, как с локальным COM-портом.

      Удалить
    2. Спасибо за идею! Попробую, если не получится напрямую.

      Удалить
  4. Привет! Отличная штуковина! Локально работает на ура. Не могли бы подробнее описать как реализовать вариант с удалённым php-сервером?

    ОтветитьУдалить