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

?>

 

Вступайте в нашу телеграмм-группу Инфостарт

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Периферийные устройства Пользователь Отраслевые Автомобили, автосервисы Абонемент ($m)

В результате простой интеграции на экране отображаются записи клиентов, статусы работ и ответственные мастера — вся информация обновляется автоматически прямо из 1С. Тестировалось на релизе 6.1.23.17

1 стартмани

30.03.2026    421    0    krumenko    0    

2

Периферийные устройства Управленческий учет Абонемент ($m)

Материал отражает личное мнение по оценке рисков использованию торгового оборудования, приобретенного на маркетплейсах.

2 стартмани

20.03.2026    1761    2    aximo    21    

12

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

Очередной баян на эту тему. Конечно же, многие скажут, это лишнее, и никому не нужно, и стоит дорого! Но тем не менее это так или иначе повышает уровень продаж как акционных продуктов, так и обычных. И в этом, конечно же, огромную роль играет психология покупателей. Когда они вживую видят все на экране, это типа продавец открыт и ничего не скрывает, продажи становятся более эффективными.

6 стартмани

10.03.2026    638    1    kras_71    1    

6

Мобильная разработка Периферийные устройства Программист 1С:Предприятие 8 Россия Бесплатно (free)

Подключение Bluetooth сканера в режиме SPP с помощью внешней компоненты "1С:Устройства ввод (NativeApi)" на Android.

25.08.2025    2847    42    maikl007    2    

4

Периферийные устройства ККМ 1С:Предприятие 8 1С:Управление торговлей 11 Россия Абонемент ($m)

С приходом онлайн-касс фирма 1С начала удалять в типовых конфигурациях возможность печатать нефискальные чеки на принтерах чеков. Однако многие пользователи до сих пор хотели бы иметь такую возможность (например, для тестирования или обучения персонала работе в РМК). Данное расширение возвращает этот функционал в конфигурацию 1С: УТ 11.

2 стартмани

26.05.2025    3031    21    Stæg    29    

1

Периферийные устройства Разработка внешних компонент Программист 1С:Предприятие 8 Абонемент ($m)

Представлена обработка и компонента интеграции планшетов подписи от компании Signotec.

7 стартмани

27.03.2025    2060    0    IgorKissil    3    

3

Периферийные устройства ККМ Пользователь 1С 8.3 1С:Розница 2 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Абонемент ($m)

С приходом онлайн-касс фирма 1С начала удалять в типовых конфигурациях возможность печатать нефискальные чеки на принтерах чеков. Однако многие пользователи до сих пор хотели бы иметь такую возможность (например, для тестирования или обучения персонала работе в РМК). Данное расширение возвращает этот функционал в конфигурации 1С: Розница 2.3 (3) и 1С: УНФ 3.

2 стартмани

24.03.2025    6467    138    Stæg    105    

5

Периферийные устройства Системный администратор Программист Пользователь Стажер 1С:Предприятие 8 1С:Управление торговлей 11 Абонемент ($m)

Предлагаются обработки, с помощью которой вы сможете протестировать ваш принтер чеков через БПО версий 2.1 и 3.2.

4 стартмани

18.02.2025    2432    5    aximo    1    

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