Печать на мобильных принтерах TSC и Zebra по сети

08.03.20

Интеграция - Периферийные устройства

Описан метод печати на мобильных принтерах марок TSC и Zebra, подключенных к корпоративной сети по Wi-Fi, без необходимости устанавливать драйверы на сервере и/или клиенте.

Поставлена задача - организовать печать по сети на мобильных принтерах производства компаний TSC и Zebra без необходимости установки на серверах драйверов принтеров, регистрации и СМС. В эксплуатации находятся несколько десятков принтеров. Подключение к общей сети выполнено по Wi-Fi. Печать необходимо производить из трех видов приложений: "1С-Управление торговлей", приложения для ТСД, мобильного приложения для обычных смартфонов/планшетов (при этом мобильное приложение непосредственного доступа в корпоративную сеть не имеет). Печатные формы генерируются обработкой в 1С в виде скриптов на языках разметки TSPL/ZPL.

Решение: поскольку в сети уже есть Web-сервер под IIS, где подняты Web-сервисы и HTTP-сервисы для мобильных приложений, то на сервере дополнительно запускаем скрипт на PHP, на вход принимающий пакет данных, где содержится IP принтера и скрипт на TSPL/ZPL, и отправляющий данные по IP-адресу принтера.

Пакет формируется в JSON, выглядит следующим образом:
Шаблон кодируется в base64, поскольку в командах TSPL/ZPL могут быть символы, невалидные для JSON.

{
 "printer_ip":"192.168.X.XXX",
 "template":"Здесь должен быть шаблон этикетки, закодированный в base64"
}

 

Схема работы для печати ценника, например, следующая - в мобильном приложении сканируется ШК товара, на сервер уходит пакет данных с этим ШК, кодом пользователя/магазина/отдела, в 1С по ним формируется вышеприведенный пакет, и из 1С же методом POST передается по URL на Web-сервере в скрипт на PHP. Результат выполнения скрипта анализируется, и передается мобильному приложению.

Собственно, базовый функционал скрипта выглядит следующим образом:
 

<?php

class M_Response {
    public $success;
    public $reason;
}
error_reporting(E_ALL);
ob_implicit_flush(1);

$mresponse = new M_Response();
$entityBody = file_get_contents('php://input');
// получили на входе пакет в JSON
if ($entityBody === false || $entityBody === null || $entityBody === "") {
// Что-то пошло не так, вернем статус и причину ошибки
    $mresponse->success = false;
    $mresponse->reason = "Ошибка при получении исходных данных";
    http_response_code(400);
    $respJSON = json_encode($mresponse , JSON_UNESCAPED_UNICODE);
    echo $respJSON;
    exit();
}
$obj = json_decode($entityBody);
if ($obj === false || $obj === null) {
    $mresponse->success = false;
    $mresponse->reason = "Ошибка декодирования входных данных";
    http_response_code(400);
    $respJSON = json_encode($mresponse , JSON_UNESCAPED_UNICODE);
    echo $respJSON ;
    exit();
}

$template = $obj->template;

$decoded_template = base64_decode($template);
if ($decoded_template === false || $decoded_template === null) {
    $mresponse->success = false;
    $mresponse->reason = "Ошибка декодирования шаблона печати";
    http_response_code(400);
    $respJSON = json_encode($mresponse , JSON_UNESCAPED_UNICODE);
    echo $respJSON ;
    exit();
}

$service_port = 9100;
$address = $obj->printer_ip;

// Данные передаем через TCP-socket (описание этого метода есть на сайтах производителей принтеров)
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    $reason = socket_strerror(socket_last_error());
// IIS на сервере отдает сообщения в Win-1251, потому перекодируем
// для других серверов, возможно, это и не понадобится
    $reason2 = iconv("Windows-1251", "UTF-8", $reason);
    $mresponse->success = false;
    $mresponse->reason = $reason2;
    http_response_code(400);
} else {
    $result = socket_connect($socket, $address, $service_port);
    if ($result === false) {
        $reason = socket_strerror(socket_last_error());
        $reason2 = iconv("Windows-1251", "UTF-8", $reason);
        $mresponse->success = false;
        $mresponse->reason = $reason2;
        http_response_code(400);
    } else {
        $result = socket_write($socket, $decoded_template, strlen($decoded_template));
        if ($result === false) {
            $reason = socket_strerror(socket_last_error());
            $reason2 = iconv("Windows-1251", "UTF-8", $reason);
            $mresponse->success = false;
            $mresponse->reason = $reason2;
            http_response_code(400);
        }
        else {
            $mresponse->success = true;
            $mresponse->reason = "";
            http_response_code(200);
        }
        socket_close($socket);
    }
}
$respJSON = json_encode($mresponse, JSON_UNESCAPED_UNICODE);
echo $respJSON ;

?>

 

массовая печать мобильные принтеры интеграция приложений.

См. также

Периферийные устройства Системный администратор Пользователь Платформа 1С v8.3 1С:Бухгалтерия 3.0 Абонемент ($m)

Простая в использовании обработка https://infostart.ru/1c/tools/1001819/ в целом решает поставленную задачу, но имеет явный недостаток - взаимодействует только с принтерами, подключенными к серверу. Доработанная версия позволяет работать как с принтерами на клиенте, так и на сервере

1 стартмани

30.08.2024    296    3    Sergey1CSpb    0    

4

Периферийные устройства Пользователь Платформа 1С v8.3 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Розничная и сетевая торговля (FMCG) Россия Абонемент ($m)

Расширение для вывода информации для покупателя из РМК на второй монитор. Также реализован вывод картинок из каталога в левую часть экрана покупателя. Разработано для УТ 11.5, УНФ 3.0.6 и 3.0.9.

1 стартмани

12.08.2024    800    12    Rastopchinss    15    

3

Периферийные устройства Пользователь Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Абонемент ($m)

Вывод для клиента на второй монитор (информационное табло) номера заказа в браузер (по умолчанию, например, Яндекс). Внешняя обработка может быть легко переделана под другие конфигурации (нужды) даже начинающим программистом.

1 стартмани

02.08.2024    615    0    AlOkt    0    

5

Периферийные устройства Программист Пользователь Платформа 1С v8.3 1С:Розница 3.0 Абонемент ($m)

Пример работы с эмулятором дисплея покупателя через библиотеку БПО.

6 стартмани

10.07.2024    605    4    aximo    0    

3

Периферийные устройства Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Речь пойдет не о сканерах штрихкодов 2D/3D/RF/распознавании лиц и прочего, а о старом добром аппарате, позволяющем считать страницу и отправить ее образ в ПК через COM/USB порт. Рассмотрим, как можно подключить и использовать сканер в типовых 1С-конфигурациях. И что делать, если никак не найти команду настройки сканера.

1 стартмани

28.05.2024    938    Sergey1CSpb    2    

6

Периферийные устройства Пользователь Платформа 1С v8.3 1С:Розница 2 Россия Абонемент ($m)

Расширение для 1С: Розница 2.3 версий 2.3.15.ХХХ и выше. Удобный способ изменения принтера по умолчанию во встроенной обработке печати ценников и этикеток. Только для операционной системы Windows.

1 стартмани

13.05.2024    851    5    independ    0    

5

Периферийные устройства Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время я активно пользовался различными хоткеерами, шаблонами текста, специальными раскладками клавиатуры. Я из тех, кто очень долго верил в Снегопат... Так сложилось, что на моем текущем месте работы довольно строгая политика информационной безопасности, а потому со всем привычным софтом, который делал жизнь проще, мне пришлось расстаться. И даже шаблоны кода при каждом терминальном подключении требуется настраивать в конфигураторе заново. Как известно, если какую-то задачу нельзя решить на стороне софта, то стоит поискать железное решение.

1 стартмани

15.04.2024    7795    madonov    60    

36

Периферийные устройства Платформа 1С v8.3 Бесплатно (free)

«У нас было два контроллера Huidu, семьдесят две китайские монохромные панели на светоизлучающих диодах, они же LED, четыре мегабайта flash памяти, 1С и целое море поддерживаемых форматов вывода информации - текстов, картинок, анимаций, а так же литр промывочной жидкости, литр разбавителя, ящик черных чернил, и 12 патч-кордов и различных удлинителей. Не то, чтобы всё это было категорически необходимо в маркировке, но если уж начал собирать маркиратор на 1С, то к делу надо подходить серьёзно.» - Страх и ненависть в Маркировке, 2019 г.

01.04.2024    2520    Interrupted    15    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ВасяЧ 09.06.21 10:13 Сейчас в теме
Благодарю автора за поднятую актуальную тему!

Попытался воспользоваться разработкой для печати на принтере TSC MB340P. с веб- сервером Apache24

Текст скрипта сохранил в файл tscprint.php и положил в каталог htdocs

В мобильном приложении добавил форму для печати с функцией печати:

&НаКлиенте
Функция ПечатьТСЦ(Наименование,АдресПринтера,АдресВебСервера)

	НаименованиеПеч = СтрЗаменить(Наименование,"""","\[""]"); //Экранирование (") для принтера TSC

	Темплейт =
	"
	|SIZE 58 mm, 40mm
	|GAP 2 mm,0
	|DIRECTION 1
	|CLS
	|BLOCK  50,100,300,350,""ROMAN.TTF"",0,8,8,10,0,0,"""+НаименованиеПеч+"""
	|PRINT 1";

	
	ТемплейтДвоичный = СтрокаВДвоичные(Темплейт);
	Темплейт64 = Base64Строка(ТемплейтДвоичный);
	
	СкриптТСЦ = Новый Структура();
	СкриптТСЦ.Вставить("printer_ip",АдресПринтера);
	СкриптТСЦ.Вставить("template",Темплейт64);
		
	HTTPСоединение = Новый HTTPСоединение(АдресВебСервера);
	HTTPЗапрос = Новый HTTPЗапрос("/tscprint.php");
	ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку(ПараметрыЗаписиJSON);
	ЗаписатьJSON(Запись,СкриптТСЦ);
	Результат = Запись.Закрыть();
	HTTPЗапрос.УстановитьТелоИзСтроки(Результат);
	HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
	
	ОтветСервера = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
	Возврат ОтветСервера;
	
КонецФункции
Показать


Принтер начинает печатать этикетку после второго вызова функции. При печати принтер встает на паузу в 4-5 сек посередине этикетки.

Такой же точно код этикетки запускаемый из программы DiagTool_V119.exe печатает этикетку сразу.
Интересно, что если после печати из приложения в DiagTool_V119.exe нажать кнопку "Get Status", принтер допечатывает этикетку.

Попробовал сделать запуск печати с сервера, оправляя из мобильного приложения ШК и адрес принтера, формируя этикетку такой же функцией, скрипт дает ошибку 400 в месте
$obj = json_decode($entityBody);


Что я делаю не так?


Можете добавить в скрипт прием ответа от принтера? Например на команду
<ESC>!? 
Оставьте свое сообщение