Статья успешно отправлена на почту
PDF

Беспроводная печать с помощью Mobile SMARTS

Применимо к продуктам: Mobile SMARTS платформа
Последние изменения: 2023-01-09

C 15 декабря 2009 г. в Mobile SMARTS доступна печать на беспроводные принтеры этикеток. В этой статье я хочу подробно рассказать об особенностях её использования. Статья отражает функционал Mobile SMARTS на момент 12 июля 2012 г., время от времени она будет обновляться, а указанная дата меняться.

Печать на обычные принтеры в Mobile SMARTS проходит через посредника в виде специального сервера печати Mobile SMARTS. То есть обычно терминал сбора данных сам этикетку не формирует и никуда её не отсылает, он всего лишь передает своему серверу терминалов название шаблона и список значений, которые нужно подставить в него при печати.

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

Это что касается обычной печати. Для беспроводной печати клиент Mobile SMARTS умеет самостоятельно обрабатывать этикетки, написанные на языке команд печати конкретного используемого принтера. Это означает, что каждую этикетку для беспроводной печати придется создавать с использованием языка команд принтера. По крайней мере, пока это так.

Для поддержки беспроводной печати в Mobile SMARTS внесены следующие изменения:

Добавлено новое действие «Выбор принтера», которое позволяет искать и выбирать bluetooth-принтеры;

В действие «Печать этикетки» добавлено свойство «Принтер». В нем можно указать путь к беспроводному принтеру или путь к переменной, в которой лежит такой путь или объект принтера, выбранный действием «Выбор принтера». Если свойство не заполнено, то печать выполняется в обычном режиме через сервер.

Конкретные шаги по каждому из приведенных этапов будут рассмотрены ниже в статье.

Создание шаблона этикетки для печати

У каждого производителя принтера есть свой набор любимых языков печати, которыми управляются их принтеры. В данной статье мы печатаем на принтер Zebra RW420, поэтому любимым языком будет CPCL. Язык CPCL поддерживается всеми RW, QL и MZ моделями Zebra. Скачать документацию по языку, а также по самому принтеру можно после регистрации на сайте Zebra.com

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

Например, для создания этикеток на CPCL компанией Zebra Technologies предоставляется программа Label Vista.

Используя Label Vista можно нарисовать следующую этикетку:

! 0 200 200 240 1
LABEL
CONTRAST 0
TONE 0
SPEED 5
PAGE-WIDTH 390
T 7 0 11 62 цена
T 4 3 99 49 100.00
BT 7 0 5
B EAN13 2 2 60 45 147 1234567890123
BT OFF
T 0 3 8 9 Название товара
FORM
PRINT
При этом Label Vista предупредит, что этикетка содержит непечатаемые символы, а результат печати будет такой:

То есть русский текст не отобразился.

Шрифты и печать русских текстов на принтер Zebra

Русские шрифты для конкретного купленного принтера не всегда существуют. А существующие могут не подходить по размеру. И новые взять негде. Например, в Label Vista существует возможность конвертирования обычных Windows-шрифтов (TrueType) в шрифты принтера (Scalable Fonts).

Для вывода русских текстов на CPCL в Mobile SMARTS добавлена возможность вставки в этикету кода, который преобразует текст в картинку. Для этого необходимо открыть этикетку в простом текстовом редакторе и написать следующее:

{global::Zebra.CPCL.Text([<название шрифта>, <высота шрифта в миллиметрах>,] [<x>, <y>,] <текст>, <доступная ширина>)}

Координаты <x>, <y> задаются в единицах, которые в данный момент выбраны текущими (см. руководство по CPCL).

Метод global:Zebra.CPCL.Text возвращает команду UG и соответствующую картинку. Из шрифтов доступны «Tahoma» и «Courier New».

Например:

{global::Zebra.CPCL.Text("Tahoma", 3, 0, 26, "Русский текст", 360)} {global::Zebra.CPCL.Text("Tahoma", 3, "Русский текст", 360)}

Также можно указывать:

! 0 200 200 290 1
PAGE-WIDTH 390
; SetFont(<название шрифта>, <высота в шрифта миллиметрах>).
{global::Zebra.CPCL.SetFont("Tahoma", 4)}
{global::Zebra.CPCL.Text("Русский текст", 360)}
{global::Zebra.CPCL.Text("Ещё текст", 360)}
{global::Zebra.CPCL.Text("Tahoma", 1.7, "мелкий текст", 360)}
{global::Zebra.CPCL.Text("Tahoma", 1.7, "мелкий текст", 360)}
{global::Zebra.CPCL.Text("Tahoma", 1.7, "мелкий текст", 360)}
{global::Zebra.CPCL.Text("Tahoma", 1.7, "мелкий текст", 360)}
; SetLP(<отступ до> [, отступ после]) в миллиметрах.
{global::Zebra.CPCL.SetLP(10, 0)}
{global::Zebra.CPCL.Text("Tahoma", 1.7, "мелкий текст с отступом 10 мм", 360)}
POSTFEED 20
PRINT

То есть координаты текста можно пропускать.

Параметры, для которых указанно «в миллиметрах», работают правильно только при разрешении 200dpi, т. е. только если этикетка начинается на «! X 200 200 .»
Важное замечание: код global:Zebra не является расширением языка печати и совершенно ничего не знает о том, что мы там пишем на CPCL. То есть вызовы SetLP, выравнивания текста Left|Right/CenterAlign и прочие вещи никак не связаны с SETLP, LEFT/RIGHT/CENTER и прочим в языке CPCL, т. е. одно о другом ничего не знает и друг на друга они не влияют.
Еще одно важное замечание: прямые («), косые («) и русские («) кавычки — фактически являются различными символами и не взаимозаменяемы! В качестве «кавычек» для обрамления строк в вызовах Zebra.CPCL следует использовать только прямые («) кавычки. За этим следует следить отдельно, т.к. такую ошибку легко пропустить.

Вставка в этикетку переменных значений

К сожалению, этикетки, созданные визуально, приходится много переделывать вручную. Как известно, в Mobile SMARTS шаблоны задаются путями к данным в фигурных скобках, например «{ScannedBarcode}» или «{Item.Product.Barcode}». В Label Vista можно задавать такие тексты, однако для штрихкода в ней можно указать только те символы, которые этим штрихкодом реально поддерживаются. Например, для EAN13 можно задать только цифры, мало того — только 12 или 13 цифр.

Несмотря на то, что принтер Zebra RW420 поддерживает параметризацию этикеток с помощью так называемых файлов формата, в которых вместо данных нужно указывать ««, строка «» тоже не поддерживается Label Vista в качестве данных штрихкода EAN13. Тем более нельзя указать что-нибудь вроде «{ScannedBarcode}». В настоящий момент полноценно реализовать автоматическое выравнивание, вставку данных и прочие вещи только с привлечением языка управления принтером.

Ручной правкой кода этикетки можно добиться следующего результата:

! 0 200 200 530 1
PAGE-WIDTH 390
{global::Zebra.CPCL.Text("Tahoma", 4, 0, 0, "Мой магазин", 360)}
{global::Zebra.CPCL.Text("Tahoma", 2, 0, 40, "Адрес моего магазина", 360)}
TEXT 7 0 0 62 (495) 555-444-333
{global::Zebra.CPCL.Text("Courier New", 4, 0, 100, SelectedProduct.Product.Name, 360)}
{global::Zebra.CPCL.Text("Tahoma", 3, 0, 260, "цена", 60)}
RIGHT 390
TEXT 4 4 70 260 {SelectedProduct.Packing.price:0.00}
BARCODE-TEXT 7 0 5
CENTER 0
BARCODE EAN13 2 2 60 0 430 {SelectedProduct.Packing.Barcode}
POSTFEED 20
PRINT

Отделение этикетки от ленты

Команда AUTO-PACE в шаблоне этикетки отвечает за включение режима сканирования по отделению этикетки от ленты.


Загрузка русских шрифтов на принтер

Существует еще один способ напечатать этикетку русским шрифтом. Нужно загрузить русский шрифт непосредственно на принтер и создать этикетку. Более подробно о загрузке шрифта на принтер можно прочитать здесь.

Для печати значений из базы данных в шаблон вставляются описания переменных.

Для вывода коллекции строк используется конструкция с вложенными скобками:

! 0 200 200 30 1
IN-MILLIMETERS
T DEJAVUSA.CPF 0 5 5 {SelectedProduct.Product.Name}
T DEJAVUSA.CPF 0 20 9 {SelectedProduct.Packing.price:0.00} РУБ
B 128 0.125 1 6 12 14 {SelectedProduct.Packing.Barcode} 
T DEJAVUSA.CPF 0 16 20 {SelectedProduct.Packing.Barcode}
PRINT

DEJAVUSA.CPF — шрифт, загруженный на принтер.

Печать списков и длинных чеков

Программирование печати чеков на принтере отличается от программирования печати этикеток. Отличие заключается в переменной длине чека. Принтер работает в режиме LINE PRINT MODE.

Основные команды печати чеков:

  • Задание шрифта, его высоты и расстояния между строками.

! U1 SETLP {имя шрифта или встроенный номер шрифта} {Размер} {Размер шага}

  • Задание ширины чека

! U1 PAGE-WIDTH {Ширина}

  • Жирный текст

!  U1 SETBOLD {Значение}

где {Значение} задается в диапазоне 0 — 5.

  • Смещение текста

! U1 X {Значение}

Смещение текста относительно левого края чека. Если эти команды пишутся в конце строки, то переход на следующую строку в печати чека не происходит и можно выводить текст в той же строке чека.

Пример программирования принтера:

! U1 SETLP DEJAVUSA.CPF 0 15
! U1 PAGE-WIDTH 550
! U1 SETBOLD 2
ООО Ромашка
ИНН:  1234567890
---------------------------------------
Вентилятор BINATONE ALPINE 160вт, н
! U1 X 20
1068.00! U1 X 180
 *1.000! U1 X 400
 =1068.00
 ---------------------------------------
ИТОГ = 1068.00 РУБ
НДС = 162.92 РУБ
! U1 X 200
ЭКЛЗ: 00000012345
! U1 X 200
ККМ:  1234567
! U1 X 200
Кассир: Омуркулова Ж.
! U1 X 100
СПАСИБО ЗА ПОКУПКУ 

  • Необходимо обращать внимание на невидимые символы в виде пробелов в конце строки.
  • Высоту шрифта нужно задавать равной нулю, т.к. высота определена при загрузке шрифта в принтер.
  • Следует обращать внимание на знаки «!» (восклицательный знак) в тексте, выводимом на печать. Принтер может их воспринимать как начало командной подстроки.
  • Следует так же знать, что принтер, если он не выключался, помнит установки на конец печати предыдущего чека. Поэтому для надежности необходимо повторять задание параметров в начале описания шаблона чека.
  • Обращать внимание на кодировку файла чека. Необходимая кодировка UTF-8.

Вставка в чек переменных значений

Для печати значений из базы данных в шаблон вставляются описания переменных. Например, по описанию {GlobalVars.Идентификатор} будет выводиться глобальная переменная программы. Для вывода коллекции строк используется конструкция с вложенными скобками. Для выравнивания и форматирования текста в чеке можно использовать форматирование по шаблону.

! U1 SETLP DEJAVUSA.CPF 0 15
! U1 PAGE-WIDTH 550
! U1 SETBOLD 2
{GlobalVars.Компания}
! U1 SETBOLD 0
{GlobalVars.Адрес}
ИНН: ! U1 X 100
{GlobalVars.ИНН}
---------------------------------------
{Document.CurrentItems: {Item.Product.Name:T35}
! U1 X 20
{Item.Packing.price:(0:0.00)}! U1 X 180
{Item.CurrentQuantity:(0,7, :*0.000)}! U1 X 400
{Item.Стоимость:(0,9, :=0.00)}

---------------------------------------
! U1 SETBOLD 2
ИТОГ =! U1 X 150
{Document.CurrentItems.Стоимость:(0:0.00) РУБ}
! U1 SETBOLD 0
НДС = ! U1 X 150
{Document.CurrentItems.Стоимость*18/118:(0:0.00) РУБ}
! U1 X 200
ЭКЛЗ: ! U1 X 300
{GlobalVars.ЭКЛЗ}
! U1 X 200
ККМ: ! U1 X 300
{GlobalVars.ККМ}
! U1 X 200
Кассир: ! U1 X 350
{CurrentUser.Name}
! U1 SETBOLD 2
! U1 X 100
СПАСИБО ЗА ПОКУПКУ

Лог принтера

Проверить информацию, выдаваемую на печать, можно, посмотрев файл \MobileSMARTS\printlog.txt на ТСД. Фрагмент лог файла приведен ниже.

------------ [01.01.2009 10:09]---------------
------------ [printer: XXQLJ120200215]--
------------ [labelstart]--
! U1 SETLP DEJAVUSA.CPF 0 15
! U1 PAGE-WIDTH 550
! U1 SETBOLD 2
 
! U1 SETBOLD 0
ИНН: ! U1 X 100
---------------------------------------
 Вентилятор ОРБИТА,STERLING,ЯП.
! U1 X 20
1424.00! U1 X 180
 *1.000! U1 X 400
 =1424.00
 ---------------------------------------
! U1 SETBOLD 2
ИТОГ =! U1 X 150
1424.00 РУБ
! U1 SETBOLD 0
НДС = ! U1 X 150
217.22 РУБ
! U1 X 200
ЭКЛЗ: ! U1 X 300
 
! U1 X 200
ККМ: ! U1 X 300
 
! U1 X 200
Кассир: ! U1 X 350
Омурзакова А.
! U1 SETBOLD 2
! U1 X 100
СПАСИБО ЗА ПОКУПКУ !
 
------------ [/labelend]--- 

Отладка печати на принтере

Для отладки печати на принтере можно использовать прямую связь с принтером. Эту утилиту можно использовать так же посылая команды настройки принтера, например команды настройки сетевых принтеров Zebra.

Копирование шаблона этикетки на терминал сбора данных

Созданный шаблон этикетки кладется в папку «LabelTemplates» либо на сервере Mobile SMARTS (если терминалы сбора данных работают с сервером), либо напрямую в папку установки клиента Mobile SMARTS на терминале сбора данных (если терминалы работают без сервера). Именем шаблона будет являться имя файла, а расширение у файла должно быть «.lbl». То есть шаблон «Ценник» должен называться «Ценник.lbl».

Настройка операций в Mobile SMARTS

Указание пути к принтеру

Zebra RW420 printout

У каждого bluetooth-принтера есть свой уникальный адрес, а у каждого Wi-Fi-принтера свои IP и публичный порт, которые можно получить через меню при помощи кнопок на лицевой панели. Еще большее количество настроек можно увидеть на информационной распечатке принтера (на картинке справа). Практически каждый этикеточный принтер на планете печатает информацию о себе с номерами прошивки и прочим, если его выключить, зажать кнопку «Feed», а затем, удерживая её, включить принтер и дождаться начала печати (2-3 секунды).

Печать на bluetooth-принтер

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

Mobile SMARTS позволяет реализовать все такие сценарии. Действие «Выбор принтера» позволяет искать bluetooth-устройства, а действие «Печать этикетки» позволяет задать, откуда будет взята информация о том, куда печатать.

Самый простой способ тестовой печати — использовать действие выбора принтера, указать в нем, что выбранный принтер следует сложить в переменную «{SelectedPrinter}», а затем в действии печати указать, что принтер следует брать из «{SelectedPrinter}». Чтобы не искать принтер по 100 раз при последовательной печати, можно вставить перед выбором принтера проверку, лежит ли уже что-нибудь в переменной («{SelectedPrinter} != null»), и если лежит, то переходить сразу к печати.

Другой вариант — указать в действии печати прямой путь к принтеру или путь к переменной, где лежит такой путь. Формат пути следующий:

«bluetooth://» или «bt://», затем необязательное «[имя]@» и адрес вида «ЦЦ:ЦЦ:.» или «ЦЦЦ.».

Если имя не указано, то в качестве имени будет использоваться «unknown». Вот примеры того, как разными способами можно указать один и тот же bluetooth-принтер:

bluetooth://XXRC07-40-5254@00:03:7A:17:E5:3A
bluetooth://00:03:7A:17:E5:3A
bluetooth://00:03:7A:17:E5:3A/
bluetooth://00037A17E53A/
bluetooth://03:7A:17:E5:3A
bt:// XXRC07-40-5254@00:03:7A:17:E5:3A
bt:// XXRC07-40-5254@00:00:00:03:7A:17:E5:3A
bt://MeinePrintere@03:7A:17:E5:3A
bt:// XXRC07-40-5254@00:03:7A:17:E5:3A/
bt://03:7A:17:E5:3A
bt://037A17E53A

Печать на Wi-Fi-принтер

Wi-Fi-принтеры, а также простые сетевые и публичные принтеры доступны по протоколу TCP/IP, т. е. печатать на них можно, зная IP и номер порта. Wi-Fi и другие сетевые принтеры сами хранят свой IP и имеют прямой доступ в сеть. Кроме того, любой самый обычный офисный принтер можно вывесить в сеть по IP и порту, если завести виртуальный TCP-порт на компьютере, к которому он подключен.

Формат пути следующий:

«tcp://», необязательное «[имя]@», а затем IP и номер порта «в виде «XXX.XXX.XXX.XXX:<номер порта>». Если имя не указано, то в качестве него будет использоваться «unknown». Вот примеры того, как разными способами можно указать один и тот же сетевой принтер:

tcp://Zebra-Z4M@10.10.1.24:169
tcp://Zebra-Z4M@10.10.1.24:169/
tcp://10.10.1.24:169  

Печать через шнур

Хотя эта статья и называется «беспроводная печать», пару слов стоит сказать о печати через кабель. Действие печати этикетки понимает пути вида «COM0:», «COM3:» или «LPT:», отправляя этикетку в серийный порт и через соответствующий кабель прямо на принтер.

Собираем всё вместе

В целом процесс печати происходит следующим образом:

  1. Действие печати этикетки ищет шаблон этикетки по указанному имени. Если клиент Mobile SMARTS работает в онлайн режиме с сервером, то шаблон скачивается с сервера. Если шаблон скачался, он сохраняется в папке «LabelTemplates», и для него запоминается, что до следующего обмена данными повторно его скачивать не нужно. То есть если шаблон этикетки на сервере обновился, а клиент по нему уже печатал, обновление шаблона на терминале произойдет только после цикла обмена данными (автоматически или по нажатию кнопки «Обмен данными»). Если же шаблон скачать с сервера не удалось, то файл с соответствующим именем ищется в папке «LabelTemplates». Для батч-режима работы или в отсутствии соединения с сервером шаблон сразу ищется в папке «LabelTemplates» на терминале. Если ничего из этого не вышло, на экран выдается сообщение об ошибке, объясняющее что конкретно не удалось;
  2. Действие печати этикетки ищет данные для подключения к принтеру по указанной переменной или пути;
  3. Действие печати этикетки обрабатывает текст шаблона и получает на выходе готовый к печати текст этикетки;
  4. Действие печати этикетки устанавливает соединение с bluetooth-принтером или сетевое соединение с Wi-Fi-принтером или открывает поток для случая печати через COM или LPT и отправляет этикетку на печать.

Если на каком-то из предыдущих этапов возникла ошибка, она записывается в лог ошибок на терминале, затем ошибка выдаётся на экран, после чего операция переходит к действию, указанному в свойстве «При ошибке печати».

Итак, мы рассмотрели новый механизм беспроводной печати в Mobile SMARTS, который позволяет использовать терминалы сбора данных в еще более широком круге практически полезных приложений.

Была ли статья полезна?
Спасибо за ваш отзыв!
Отзыв
Заполните, пожалуйста, данную форму, что конкретно вы не нашли, оставьте свои комментарии о работе сайта / полезности / сложности с навигацией
0/500