Предисловие
Вообще у DYMO LabelManager 280 есть режим работы в качестве обычного принтера без какого-либо софта. Но в таком режиме есть проблемы, связанные с ограничениями драйвера, из-за чего не все напечатанные этикетки получаются такими, какими хотелось бы. Более предсказуемо принтер печатает этикетки, если создавать их при помощи софта от производителя и через него же отправлять на печать. К счастью, у этого софта имеется api в виде веб-сервиса Dymo Connect Web Service, вот только документации на него нет нигде. Производитель предлагает взаимодействовать с ним через библиотеку DYMO Connect Framework на базе JavaScript и в качестве примеров приводит несколько частично рабочих веб-страниц. Пришлось потратить немало времени в отладчике браузера, чтобы понять, как общаться с веб-сервисом напрямую посредством отправки HTTP-запросов и, прорываясь через бесконечные бэд реквесты, в итоге получить заветный код 200 и вылезшую из принтера безупречную этикетку. На данный момент эта статья является единственным мануалом по взаимодействию с Dymo Connect Web Service через http-запросы, который можно найти в свободном доступе. В конце статьи будут перечислены все необходимые ссылки, а так же приведен пример печати этикетки через веб-сервис прямо из 1С.
Как установить драйвер и ПО от производителя
Скачиваем с сайта производителя пакет DYMO Connect для Windows, на момент написания статьи актуальная версия 1.4.3.131.
Сам процесс установки ничем не примечателен, в компонентах для установки нужно не забыть выбрать Dymo Connect Web Service. После установки в меню Пуск появятся ярлыки для запуска Dymo Connect и Dymo Connect Web Service.
Как сделать этикетку
Интерфейс программы Dymo Connect русифицирован и интуитивно понятен - запутаться в нём сложно. Так что просто запускаем, верстаем и сохраняем. В результате получится файл с расширением dymo, внутренняя структура которого представляет собой обычный XML, благодаря чему можно использовать готовую этикетку как шаблон, программно подставляя параметры в соответствующие места перед отправкой на печать. В этой же программе в нижней части отображается статус и заряд АКБ подключенного принтера.
<?xml version="1.0" encoding="utf-8"?>
<DesktopLabel Version="1">
<DYMOLabel Version="3">
<Description>DYMO Label</Description>
<Orientation>Landscape</Orientation>
<LabelName>12MMX7M BLK/WHI BL1</LabelName>
<InitialLength>1</InitialLength>
<BorderStyle>SolidLine</BorderStyle>
<DYMORect>
<DYMOPoint>
<X>0.4166667</X>
<Y>0.07777777</Y>
</DYMOPoint>
<Size>
<Width>2.979245</Width>
<Height>0.3222222</Height>
</Size>
</DYMORect>
<BorderColor>
<SolidColorBrush>
<Color A="1" R="0.1372549" G="0.1215686" B="0.1254902"></Color>
</SolidColorBrush>
</BorderColor>
<BorderThickness>1</BorderThickness>
<Show_Border>False</Show_Border>
<GrowingDynamicLayoutManager>
<RotationBehavior>ClearObjects</RotationBehavior>
<LabelObjects>
<BarcodeObject>
<Name>IBarcodeObject0</Name>
<Brushes>
<BackgroundBrush>
<SolidColorBrush>
<Color A="1" R="1" G="1" B="1"></Color>
</SolidColorBrush>
</BackgroundBrush>
<BorderBrush>
<SolidColorBrush>
<Color A="1" R="0.1372549" G="0.1215686" B="0.1254902"></Color>
</SolidColorBrush>
</BorderBrush>
<StrokeBrush>
<SolidColorBrush>
<Color A="1" R="0.1372549" G="0.1215686" B="0.1254902"></Color>
</SolidColorBrush>
</StrokeBrush>
<FillBrush>
<SolidColorBrush>
<Color A="1" R="0.1372549" G="0.1215686" B="0.1254902"></Color>
</SolidColorBrush>
</FillBrush>
</Brushes>
<Rotation>Rotation0</Rotation>
<OutlineThickness>1</OutlineThickness>
<IsOutlined>False</IsOutlined>
<BorderStyle>SolidLine</BorderStyle>
<Margin>
<DYMOThickness Left="0" Top="0" Right="0" Bottom="0" />
</Margin>
<BarcodeFormat>Code128Auto</BarcodeFormat>
<Data>
<MultiDataString>
<DataString>00000130928</DataString>
</MultiDataString>
</Data>
<HorizontalAlignment>Left</HorizontalAlignment>
<VerticalAlignment>Middle</VerticalAlignment>
<Size>SmallMedium</Size>
<TextPosition>Bottom</TextPosition>
<FontInfo>
<FontName>Arial</FontName>
<FontSize>10</FontSize>
<IsBold>False</IsBold>
<IsItalic>False</IsItalic>
<IsUnderline>False</IsUnderline>
<FontBrush>
<SolidColorBrush>
<Color A="1" R="0.1372549" G="0.1215686" B="0.1254902"></Color>
</SolidColorBrush>
</FontBrush>
</FontInfo>
<ObjectLayout>
<DYMOPoint>
<X>0.4166662</X>
<Y>0.08531889</Y>
</DYMOPoint>
<Size>
<Width>2.979246</Width>
<Height>0.2911678</Height>
</Size>
</ObjectLayout>
</BarcodeObject>
</LabelObjects>
</GrowingDynamicLayoutManager>
</DYMOLabel>
<LabelApplication>Blank</LabelApplication>
<DataTable>
<Columns></Columns>
<Rows></Rows>
</DataTable>
</DesktopLabel>
Как запустить веб-сервис
Запуск происходит через ярлык Dymo Connect Web Service, после чего сразу же поднимается веб-сервис по адресу https://127.0.0.1:41951/DYMO/DLS/Printing/. Запускать и останавливать его можно через соответствующий значок в трее. Список возможных настроек ограничивается лишь выбором порта из диапазона 41951-41960 и языка. Каких либо конфигурационных файлов или записей в реестре я не нашел, что создаёт определенные проблемы, но об этом позже.
Как пользоваться веб-сервисом
Отправляем на сервис HTTP-запрос, в ответ получаем результат. Из всего списка доступных методов интерес представляют вот эти:
• StatusConnected (GET)
- Получить состояние работы веб-сервиса. Вернулся ответ True - сервис работает. Параметров нет.
• GetPrinters (GET)
- Получить список имен доступных принтеров в виде XML. Этот запрос обязательно должен быть выполнен перед первым использованием метода PrintLabel. Опытным путем выяснено, что без этого не происходит инициализация принтера на веб-сервисе. Параметров нет.
• RenderLabel (POST)
- Скомпилировать изображение этикетки по её XML представлению. Может потребоваться для предпросмотра того, что будет напечатано, когда этикетка формируется по шаблону с программно заполняемыми параметрами. При успехе возвращается картинка в виде строки Base64. В теле запроса должен присутствовать обязательный параметр
LabelXml - XML представление этикетки
• PrintLabel (POST)
- Отправить этикетку на печать. Вернулся ответ True - этикетка отправлена на печать. В теле запроса должны присутствовать два обязательных параметра:
PrinterName - имя принтера
LabelXml - XML представление этикетки
Вот пример выполнения метода PrintLabel через Postman, в результате выполнения которого принтер напечатает отправленную на него в параметре labelXml этикетку:
Почему при обращении с другого компьютера веб-сервис не доступен
Если с запущенным веб-сервисом посмотреть открытые порты через netstat, то можно увидеть, что Dymo Connect Web Service слушает запросы только от localhost:
TCP 127.0.0.1:41951 ComputerName:0 LISTENING
Повторюсь, что каких либо конфигурационных файлов веб-сервиса ни в папке с программой, ни в реестре нет, так что проблему придется решать при помощи стороннего софта. Например, можно организовать проксирование через веб-сервер nginx. В результате получится открытый для внешних соединений порт, запросы с которого будут локально перенаправляться на localhost:41951.
Как установить и запустить nginx
Установка nginx не требуется, запуск происходит путем открытия nginx.exe через cmd или powershell. Перед запуском потребуется сгенерировать SSL-сертификат, поскольку служба Dyno Connect Web Service работает по протоколу https, а так же сконфигурировать nginx.conf.
Как сгенерировать сертификат для https через OpenSSL
Для генерации сертификата потребуется OpenSSL. Скачать его с официального репозитория можно только в виде исходников для последующей компиляции. Тем не менее, на официальной wiki-странице проекта есть ссылки, откуда рекомендуется брать собранные для windows бинарники. Генерация сертификата происходит при помощи команды
openssl.exe req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out nginx-certificate.pem -keyout nginx.key
Полученные файлы nginx-certificate.pem и nginx.key помещаем в папку \nginx\conf\ рядом с файлом nginx.conf
Как настроить проксирование в nginx
Открываем файл nginx.conf и добавляем в секцию HTTP вот это:
server {
listen 55555 ssl;
ssl_certificate nginx-certificate.pem;
ssl_certificate_key nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://127.0.0.1:41951/;
}
}
После перезапуска nginx подхватит измененный конфигурационный файл и Dymo Connect Web Service станет доступен извне через порт 55555.
Как напечатать этикетку из 1С через веб-сервис
&НаСервере
Процедура ОтправитьНаПринтерЧерезВебСервисНаСервере()
//1. Инициализация принтера
Соединение = Новый HTTPСоединение("192.168.1.105:55555/DYMO/DLS/Printing/GetPrinters",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос();
Результат = Соединение.Получить(Запрос);
//2. Печать
Соединение = Новый HTTPСоединение("192.168.1.105:55555/DYMO/DLS/Printing/PrintLabel",,,,,,
Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");
Запрос = Новый HTTPЗапрос("/", Заголовки);
ЗначениеШтрихкода = "0123456789";
ТелоЗапроса = ПолучитьТелоЗапроса(ЗначениеШтрихкода);
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса);
Результат = Соединение.ОтправитьДляОбработки(Запрос);
КонецПроцедуры
&НаСервере
Функция ПолучитьТелоЗапроса(ЗначениеШтрихкода)
ИмяПринтера = "DYMO LabelManager 280";
//XML шаблон этикетки помещен в общий макет с типом текстовый документ
//Для параметризации шаблона содержимое тега DataString в макете предварительно
//заменено на "[ЗначениеШтрихкода]"
МакетЭтикеткиXML = ПолучитьОбщийМакет("ШаблонЭтикеткиDYMO");
ЭтикеткаXML = МакетЭтикеткиXML.ПолучитьТекст();
ЭтикеткаXML = СтрЗаменить(ЭтикеткаXML, "[ЗначениеШтрихкода]", ЗначениеШтрихкода);
ТелоЗапроса = "printerName=" + ИмяПринтера + "&labelXml=" + ЭтикеткаXML + "&labelSetXml" + "&printParamsXml";
Возврат ТелоЗапроса;
КонецФункции
Полезные ссылки
Официальный сайт Dymo с драйверами и ПО: https://www.dymo.com/support?cfid=user-guide
Репозиторий c Dymo Connect Framework для любителей JS: https://github.com/dymosoftware/dymo-connect-framework
Пример использования фреймворка: https://s3.amazonaws.com/download.dymo.com/dymo/Software/JavaScript/PreviewAndPrintLabel/PreviewAndPrintLabel.html
Официальный сайт nginx: https://nginx.org/ru/download.html
Официальная wiki OpenSSL с источниками загрузки бинарников под windows: https://wiki.openssl.org/index.php/Binaries