4 окт. 2013 г.

Вывод сообщения на дисплей принтера от производителя Hewlett Packard

      В данной инструкции будет рассказано, как вывести ваше сообщение на дисплей принтера от производителя Hewlett Packard. Делается это при помощи отправки на принтер специальной команды. Для большинства принтеров, работающих с языком PCL, вывод сообщения делается при помощи команд PJL (от Printer Job Language - язык заданий принтера), язык, разработанный Hewlett Packard, обеспечивающий управление принтерами на уровне заданий печати. 
      При помощи команд PJL можно изменить стандартные параметры принтера, такие как количество печатаемых копий. Команды PJL позволяют также переключать языки управления от задания к заданию без участия пользователя. При наличии двусторонней связи PJL-совместимый принтер может отправлять серверу печати сведения, такие как номер модели или состояние задания. Команда для установки сообщения будет выглядеть так:

ESC%-12345X@PJL JOB
@PJL RDYMSG DISPLAY=Ваше сообщение
@PJL EOJ
@PJL RESET
ESC%-12345X


      Начинается она с символа ESC (код 27 в десятичном представлении или 1B в шестнадцатеричном) и после него следуют служебные символы. Для отправки данного сообщения воспользуемся поддержкой сокетов TCP на платформе .NET, которая значительно усовершенствована по сравнению с предыдущей моделью программирования. Раньше большинство разработчиков, использовавших Visual С++, для реализации любых типов взаимодействия сокетов, обращались к классам CSocket и CAsyncSocket или пользовались библиотеками независимых поставщиков.
      Для высокоуровневого программирования, в TCP встроенная поддержка практически отсутствовала. В .NET для работы с сокетами предоставлено особое пространство имен System.Net.Sockets. Это пространство имен содержит не только такие низкоуровневые классы, как Socket, но и классы высокого уровня TcpClient и TcpListener, предлагающие простые интерфейсы для взаимодействия через TCP.

      Воспользуемся классом TcpClient. Класс TcpClient обеспечивает TCP-сервисы для соединений на стороне клиента. В отличие от класса Socket, в котором для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели.
      Создайте проект Windows Form в Microsoft Visual Studio и добавьте три компонента на форму:

  • Button1 – Кнопка отправки сообщения на принтер;
  • textBox1 – Текстовое поле для ввода Ip адреса принтера;
  • textBox2 – Текстовое поле для ввода текста сообщения.
      Сделайте двойной клик по компоненту Button1 и перейдите в автоматически созданный метод button1_Click. Для подключения к принтеру создадим объект TcpClient, с указанием в качестве IP адреса textBox1, порт для подключения укажите 9100:
TcpClient client = new TcpClient(textBox1.Text, 9100);
      Для обеспечения базового потока данных для доступа к сети, как канал между вашим приложением и принтером, используется класс NetworkStream. Прежде чем отправлять и получать любые данные, нужно определить базовый поток. Класс TcpClient предоставляет метод GetStream() исключительно для этих целей. С помощью базового сокета он создает экземпляр класса NetworkStream и возвращает его вызывающей программе.
NetworkStream stream = client.GetStream();
      Для того чтобы отправить сообщение его надо представить в виде массива типа Byte, содержащий данные для записи в объект NetworkStream.
Byte[] data = System.Text.Encoding.ASCII.GetBytes(
string.Format("\x1B%-12345X@PJL JOB\r\n@PJL RDYMSG DISPLAY=\"{0}\"\r\n@PJL EOJ\r\n@PJL RESET\r\n\x1B%-12345X\r\n", textBox2.Text.Trim()));
      Что бы отправить данные воспользуемся методом Write(), который принимает три параметра: массив байтов, содержащий данные, которые надо отправить хосту, позицию в потоке, с которой хотим начать запись, и длину данных:
stream.Write(data, 0, data.Length);
Для успешного запуска вам необходимо подключить следующее пространство имен:
using System.Net.Sockets;
      Запустите ваш проект, нажав на клавишу «F5», введите IP адрес принтера и ваше сообщение, нажмите на единственную вашу кнопку. Если все прошло успешно, то результат вы можете посмотреть как на самом принтере:
Так и на Web страничке:

Было успешно протестировано на следующих моделях:

  • HP Color LaserJet 3600
  • HP Color LaserJet 4650
  • HP Color LaserJet 5550
  • HP Color LaserJet CP3525
  • HP Color LaserJet CP5520 
  • HP Designjet 1055
  • HP Designjet 4020
  • HP Designjet T790
  • HP LaserJet 4050
  • HP LaserJet 4200
  • HP LaserJet 4250
  • HP LaserJet 500 MFP M525
  • HP LaserJet 5000
  • HP LaserJet 5100
  • HP LaserJet 5200
  • HP LaserJet 9040
  • HP LaserJet M1536 
  • HP LaserJet M3035 
  • HP LaserJet M5035
  • HP LaserJet M725
  • HP LaserJet P2055