PJL (HP Printer Job Language) – это разработанный Hewlett Packard язык , реализующий уровень контроля заданий и расширенного управления принтером. Так, например, он обеспечивает переключение между языками для документов, вывод сообщений на контрольную панель, настройку конфигурации, команды по управлению файловой системой принтера и многое-многое другое. PJL-совместимый принтер также может отправлять информацию, такую как модель принтера и состояние задания на сервер печати.
Команды PJL обычно имеют следующий формат:
< ESC > %-12345X@PJL\r\n
@PJL INFO ID\r\n
< ESC > %-12345X\r\n
Esc имеет десятичный код 27 (Hex код 1В). Этот код выдается как обычный символ, но он не печатается, а переводит принтер в режим приёма команды. Символы, следующие за ним, воспринимаются принтером как команда управления. Принтер пытается распознать их как команду, входящую в его набор команд и если это ему удается, то он ее выполняет. Следующие за командой символы воспринимаются как обычный текст, предназначенный для печати (конечно, если это не следующая Esc последовательность).
Посмотреть команды можно и другим способом:
Создайте в Microsoft Word новый документ, в инструкции используется Microsoft Office 2010. Перейдите в меню «Файл» - «Печать». В меню выбора принтера в самом низу присутствует кнопка «Печать в файл», нажмите на нее. Если вы все сделали правильно, то у вас напротив этой надписи появится галочка. Нажмите на кнопку «Печать», у вас откроется диалоговое окно с предложением сохранить файл с расширением «*.prn». Файл с таким расширением будет содержать «Esc» последовательности, для того принтера, который Microsoft Word использует в данный момент. Этот файл можно посмотреть в редакторе, читающий HEX формат, т.к. файл этот двоичный.
Для отправки команд на принтер воспользуемся поддержкой сокетов TCP на платформе .NET, классом TcpClient. Класс TcpClient обеспечивает TCP-сервисы для соединений на стороне клиента. В отличие от класса Socket, в котором для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели.
В этих классах все взаимодействие между клиентом и сервером базируется на потоке с использованием класса NetworkStream.
Для обработки на уровне потока, используется класс NetworkStream. Прежде чем отправлять и получать любые данные, нужно определить базовый поток. Класс TcpClient предоставляет метод GetStream() исключительно для этих целей. С помощью базового сокета он создает экземпляр класса NetworkStream и возвращает его вызывающей программе.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте три компонента на форму:
Ниже приведены примеры других команд:
Пробуждение принтера из спящего (энергосберегающего) режима:
Счетчик печати:
Состояние памяти принтера:
Статус принтера:
В случае если принтер не понимает вашу команду, которую вы ему отправили, то он ответит знаком вопроса «?»:
Протестировано на следующих моделях:
Команды PJL обычно имеют следующий формат:
< ESC > %-12345X@PJL\r\n
@PJL INFO ID\r\n
< ESC > %-12345X\r\n
Esc имеет десятичный код 27 (Hex код 1В). Этот код выдается как обычный символ, но он не печатается, а переводит принтер в режим приёма команды. Символы, следующие за ним, воспринимаются принтером как команда управления. Принтер пытается распознать их как команду, входящую в его набор команд и если это ему удается, то он ее выполняет. Следующие за командой символы воспринимаются как обычный текст, предназначенный для печати (конечно, если это не следующая Esc последовательность).
Предупреждение: Принтеры разных фирм изготовителей имеют различные системы команд (Esc последовательностей), и, именно поэтому, нет универсальных драйверов, а для каждого принтера требуется свой драйвер. Более того, даже принтеры одной и той же фирмы могут иметь разные системы команд.
Получить информацию о Esc последовательностях можно либо из Технического описания принтера, либо зайдя на сервер соответствующей фирмы (например, www.hp.com фирма Hewlett-Packard). Информация, представленная там обычно на английском языке.Посмотреть команды можно и другим способом:
Создайте в Microsoft Word новый документ, в инструкции используется Microsoft Office 2010. Перейдите в меню «Файл» - «Печать». В меню выбора принтера в самом низу присутствует кнопка «Печать в файл», нажмите на нее. Если вы все сделали правильно, то у вас напротив этой надписи появится галочка. Нажмите на кнопку «Печать», у вас откроется диалоговое окно с предложением сохранить файл с расширением «*.prn». Файл с таким расширением будет содержать «Esc» последовательности, для того принтера, который Microsoft Word использует в данный момент. Этот файл можно посмотреть в редакторе, читающий HEX формат, т.к. файл этот двоичный.
Для отправки команд на принтер воспользуемся поддержкой сокетов TCP на платформе .NET, классом TcpClient. Класс TcpClient обеспечивает TCP-сервисы для соединений на стороне клиента. В отличие от класса Socket, в котором для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели.
В этих классах все взаимодействие между клиентом и сервером базируется на потоке с использованием класса NetworkStream.
Для обработки на уровне потока, используется класс NetworkStream. Прежде чем отправлять и получать любые данные, нужно определить базовый поток. Класс TcpClient предоставляет метод GetStream() исключительно для этих целей. С помощью базового сокета он создает экземпляр класса NetworkStream и возвращает его вызывающей программе.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте три компонента на форму:
- Button1 – Кнопка отправки команд на принтер;
- textBox1 – Текстовое поле для ввода Ip адреса принтера;
- textBox2 – Текстовое поле для ввода значений.
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\r\n" + "@PJL SET SERVICEMODE=HPBOISEID\r\n" + "@PJL SET PAGES={0}\r\n" + "@PJL SET SERVICEMODE=EXIT\r\n" + "\x1B%-12345X\r\n", textBox2.Text));Что бы отправить данные воспользуемся методом Write(), который принимает три параметра: массив байтов, содержащий данные, которые надо отправить хосту, позицию в потоке, с которой хотим начать запись, и длину данных:
stream.Write(data, 0, data.Length);По окончании работы с принтером необходимо закрыть подключение:
client.Close();Запустите ваш проект, нажав на клавишу «F5», введите IP адрес принтера и ваше значение, нажмите на единственную вашу кнопку. Если все прошло успешно, то результат вы можете посмотреть как на веб страничке принтера.
Ниже приведены примеры других команд:
Пробуждение принтера из спящего (энергосберегающего) режима:
try { TcpClient client = new TcpClient(textBox1.Text, 9100); System.IO.StreamWriter writer = new System.IO.StreamWriter(client.GetStream()); writer.Write("\x1B%-12345X@PJL JOB\r\n"); writer.Write("@PJL RESET\r\n"); writer.Write("\x1B%-12345X\r\n"); writer.Flush(); writer.Close(); client.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); }Печать конфигурации принтера:
try { TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n"+ "@PJL DMINFO ASCIIHEX = \"04000401010502040103\"\r\n"+ "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); client.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); }Печать карты меню:
try { TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n" + "@PJL DMINFO ASCIIHEX = \"04000401010502040109\"\r\n" + "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); client.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
Дополнительная информация:
[ESC]%-12345X@PJL
@PJL COMMENT Configuration Page
@PJL DMINFO ASCIIHEX = "04000401010502040103"
@PJL COMMENT Event Log
@PJL DMINFO ASCIIHEX = "04000401010502040107"
@PJL COMMENT File System Directory
@PJL DMINFO ASCIIHEX = "04000401010502040108"
@PJL COMMENT Menu Map
@PJL DMINFO ASCIIHEX = "04000401010502040109"
@PJL COMMENT Pcl Font Listing
@PJL DMINFO ASCIIHEX = "040004010105020402015E"
@PJL COMMENT PS Font Listing
@PJL DMINFO ASCIIHEX = "04000401010502040201C2"
[ESC]%-12345X
Установка английского языка принтера:[ESC]%-12345X@PJL
@PJL COMMENT Configuration Page
@PJL DMINFO ASCIIHEX = "04000401010502040103"
@PJL COMMENT Event Log
@PJL DMINFO ASCIIHEX = "04000401010502040107"
@PJL COMMENT File System Directory
@PJL DMINFO ASCIIHEX = "04000401010502040108"
@PJL COMMENT Menu Map
@PJL DMINFO ASCIIHEX = "04000401010502040109"
@PJL COMMENT Pcl Font Listing
@PJL DMINFO ASCIIHEX = "040004010105020402015E"
@PJL COMMENT PS Font Listing
@PJL DMINFO ASCIIHEX = "04000401010502040201C2"
[ESC]%-12345X
try { TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n" + "@PJL SET LANG = ENGLISH\r\n" + "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); client.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); }
Дополнительная информация:
Для установки русского языка замените «ENGLISH» на «RUSSIAN».
Сброс счетчика печати принтера на ноль:Для установки русского языка замените «ENGLISH» на «RUSSIAN».
try { TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n" + "@PJL SET SERVICEMODE=HPBOISEID\r\n" + "@PJL SET PAGES=0\r\n" + "@PJL SET SERVICEMODE=EXIT\r\n" + "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); client.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); }Язык PJL также позволяет получать информацию от принтера. Например, модель:
TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n" + "@PJL INFO ID\r\n" + "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); data = new Byte[256]; String responseData = String.Empty; Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); MessageBox.Show(string.Format("Информация с принтера: {0}", responseData)); stream.Close();Результат выполнения:
Счетчик печати:
TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n" + "@PJL INFO PAGECOUNT\r\n" + "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); data = new Byte[256]; String responseData = String.Empty; Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); MessageBox.Show(string.Format("Информация с принтера: {0}", responseData)); stream.Close();Результат выполнения:
Состояние памяти принтера:
TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n" + "@PJL INFO MEMORY\r\n" + "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); data = new Byte[256]; String responseData = String.Empty; Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); MessageBox.Show(string.Format("Информация с принтера: {0}", responseData)); stream.Close();Результат выполнения:
Статус принтера:
TcpClient client = new TcpClient(textBox1.Text, 9100); Byte[] data = System.Text.Encoding.ASCII.GetBytes( "\x1B_%-12345X@PJL\r\n" + "@PJL INFO STATUS\r\n" + "\x1B%-12345X\r\n"); NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); data = new Byte[256]; String responseData = String.Empty; Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); MessageBox.Show(string.Format("Информация с принтера: {0}", responseData)); stream.Close();Результат работы:
В случае если принтер не понимает вашу команду, которую вы ему отправили, то он ответит знаком вопроса «?»:
Протестировано на следующих моделях:
- 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
- Xerox WorkCentre 5225
- Xerox WorkCentre 7428
Ссылка для скачивания примера: Яндекс.Диск
Комментариев нет:
Отправить комментарий
Большая просьба, не писать в комментариях всякую ерунду не по теме!