Печать на мобильных принтерах 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 ;

?>

 

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

См. также

Распознавание номеров автомашин с ip - камер, видео, фото

Распознавание документов и образов Периферийные устройства Автомобили, автосервисы Россия Платные (руб)

Программа считывает кадры с ip-камер (http - запрос к камере), видео, фото (источники кадров (нет ограничения на их количество) настраивается в конфигурационном файле), находит и распознает номера автомашин и сохраняет в базу db, с сохранением фото номера и автомашины, а также времени детекции.

20400 руб.

31.05.2023    4019    3    2    

5

Тернистый путь к физической клавиатуре для программиста 1С

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

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

1 стартмани

15.04.2024    6059    madonov    52    

33

[История разработки] Управляем промышленным принтером EBS-1500 из 1С

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

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

01.04.2024    1596    Interrupted    14    

34

Получение изображения с веб-камеры с возможностью его кадрирования по произвольной области

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

Внешняя обработка получения изображения с веб-камеры с возможностью его кадрирования по произвольно выделенной области. Использует собственную внешнюю компоненту на основе библиотеки AForge. Содержит примеры интерактивного взаимодействия с полем HTML.

20.03.2024    452    2    AndSem    2    

4

Прямая печать на принтерах TSC из 1С

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

Прямая печать на принтерах TSC из 1С при вызове с сервера позволяет печатать из тонкого клиента, мобильного клиента и веб-клиента. Потребуется установка драйвера и библиотеки для отправки команд на этот драйвер.

1 стартмани

19.02.2024    732    6    realslavyan    2    

5

HotKeys на Python для 1С

Периферийные устройства Конфигурации 1cv8 Бесплатно (free)

Недавно прочитал статью на Инфостарте о KeyPad и вначале захотел себе такой, но через какое-то время я понял, что дополнительная даже маленькая клавиатура занимает место, и нужно все время держать ее под рукой. Это все создает дополнительные неудобства.

20.12.2023    5628    John_d    27    

76

Очистка очереди печати конкретного принтера

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

Очистка очереди печати выбранного принтера, перезапуск службы печати, вывод списка системных принтеров, открытие свойств принтера из 1С.

1 стартмани

07.11.2023    1340    2    vsnazarov    1    

26

Печать этикеток на DYMO LabelManager 280 через DYMO Connect Web Service

Периферийные устройства WEB-интеграция Этикетки, ценники Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

На сайте производителя принтера DYMO LabelManager 280 вместе с драйвером поставляется пакет DYMO Connect, который предлагает функционал вёрстки этикеток в фирменном формате и отправки их напрямую на принтер. Так же в этом пакете есть веб-сервис для взаимодействия с принтером через HTTP-запросы, о котором и пойдет речь в этой статье.

29.08.2023    1582    GeraltSnow    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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>!? 
Оставьте свое сообщение