2014-01-19 2 views
-1

У меня есть HP Laserjet 2550n со встроенным сервером печати, подключенным к локальной сети 192.168.1.100. К сожалению, программное обеспечение «инструментария» клиента, которое сообщило вам о статусе тонера и т. Д., Работает только под Windows XP. Я использовал Wireshark для прослушивания сообщения, используя старую машину XP, и хотел бы написать свою небольшую программу (prob под python), чтобы получить xml со всей информацией о принтере. Мне удалось использовать Putty с подключением «RAW» к 192.168.1.100:9220, чтобы повторить связь ниже и получить XML (я не привязал весь XML, только начало).Связь со штекером Python с сервером печати HP

Я боюсь, хотя с чего начать это с помощью python. Я использовал простой сокет-клиент для создания канала, а socket.recv отправляет мне первую строку (220 JetDirect GGW ...). Когда я сокет.send (байты («TIME 600», «UTF-8»)), а затем снова и снова пытаюсь получить, интерактивная оболочка «зависает».

Я был бы очень признателен за любые указания о том, как заставить python иметь беседу, как показано ниже, с сервером печати. Большое спасибо!

220 JetDirect GGW server (version 2.0) ready 
SERV HP-DC-WEB 
250 96 HP-DC-WEB 
TIME 600 
200 OK 
DEVI 
255 MFG:Hewlett-Packard;CMD:PJL,PML,BIDI-ECP,MLC,PCL,POSTSCRIPT,PCLXL;MDL:hp color LaserJet 2550 series;CLS:PRINTER;DES:Hewlett-Packard color LaserJet 2550 series;MEM:MEM=57MB;1284.4DL:4d,4e,1;COMMENT:RES=600x2; 
OPEN 96 
200 OK 
DATA 
200 OK 
GET /hp/device/info_device_status.xml HTTP/1.1 
HOST:localhost:5225 
USER-AGENT:hp Proxy/2.5 
CONTENT-LENGTH:0 

HTTP/1.1 200 OK 
Server: Virata-EmWeb/R6_0_1 
Transfer-Encoding: chunked 
Content-Type: text/xml 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Cache-Control: no-cache 
Pragma: no-cache 

0000013f 
<?xml version="1.0" encoding="UTF-8" ?>...</xml> 
+1

Где мой код на Python? Вы дали нам 2 фрагмента? –

ответ

1

Это очень трудно отлаживать код, не видя более двух крошечных фрагментов, но у меня есть предположение:

socket.send(bytes("TIME 600","UTF-8")) 

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

Следует упомянуть, что для протокола может потребоваться \r\n, а не только \n, особенно если устройство как и для Windows-ориентировано.


Между тем, sockets are byte streams, not message streams; send не может отправлять ваше сообщение; recv не гарантирует получение всего сообщения с другой стороны.

Для вашего простого приложения, вы можете исправить это довольно легко: использовать sendall вместо send и либо петлю над recv до тех пор, пока есть полная линия, или, еще проще, просто использовать makefile.

+1

Большое спасибо abarnert !! Это было именно то, что я искал, и мне жаль, если я не включил больше кода. Добавление «\ n» в строки помогло, и теперь я получаю возвращаемую строку, которую я ждал. Также использовали makefile и sendall, которые имеют смысл в линейном протоколе. Задача решена! – Pinocchio

Смежные вопросы