2014-01-19 1 views
-1

192.168.1.100의 로컬 네트워크에 연결된 통합 프린트 서버가있는 HP Laserjet 2550n이 있습니다. 불행히도 토너 상태 등을 알려주는 클라이언트 "도구 상자"소프트웨어는 Windows XP에서만 실행됩니다. 필자는 Wireshark를 사용하여 오래된 XP 컴퓨터를 사용하여 통신을 청취했으며, 프린터에 대한 모든 정보가 포함 된 xml을 수신하기 위해 자신의 작은 프로그램 (python 아래 prob)을 작성하려고합니다. 필자는 퍼티를 192.168.1.100:9220에 대한 "RAW"연결과 함께 사용하여 아래의 통신을 반복하고 XML (전체 XML을 첨부하지 않았으며 시작 부분 만)을 수신했습니다.HP 프린트 서버와의 Python 소켓 통신

나는 파이썬으로 이것을 시작할 곳을 고심하고있다. 간단한 파이프 클라이언트를 사용하여 파이프를 설정하고 socket.recv가 첫 번째 라인 (220 JetDirect GGW ...)을 보냅니다. 내가 socket.send (바이트 ("TIME 600", "UTF-8"))를 입력하고 다시 시도하면 대화식 쉘이 "정지"됩니다.

파이썬이 프린트 서버와 대화 할 수있는 방법에 대한 모든 조언을 정말 고맙게 생각합니다. 많은 감사합니다!

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

당신의 파이썬 코드는 어디에 있습니까? 우리에게 2 단편을 줬어? –

답변

1

그것은 두 개 이상의 작은 조각을 보지 않고 코드를 디버깅하는 것은 매우 어렵습니다,하지만 난 추측이 있습니다

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

이 더 줄 바꿈이 없습니다입니다. 그리고 이것은 라인 기반 프로토콜 인 것 같습니다. 아마도 서버는 결코 나오지 않는 나머지 라인을 기다리고있을 것이기 때문에 응답으로 아무것도 보내지 않으므로 다음 recv은 영원히 차단됩니다.

특히 장치가 Windows 중심적 인 경우에는 \n이 아닌 프로토콜을 \r\n으로 지정해야합니다.


한편, sockets are byte streams, not message streams; send은 전체 메시지를 보낼 수 있다고 보장하지 않습니다. recv은 다른 쪽에서 전체 메시지를받을 수 있다고 보장 할 수 없습니다. 단지 makefile를 사용, 더 간단한 당신이 전체 라인을 때까지 사용 sendall 대신 sendrecv 이상 중 루프를, 또는 : 당신의 간단한 응용 프로그램에 대한

, 당신은 아주 쉽게이 문제를 해결할 수 있습니다.

+1

많은 감사 abarnert !! 이것은 정확히 내가 찾던 것이었고 더 많은 코드를 포함시키지 않으면 유감입니다. 문자열에 "\ n"을 추가하면 도움이되었습니다. 이제는 기다리는 문자열을 반환합니다. 또한 라인 기반 프로토콜에서 의미가있는 makefile과 sendall을 사용했다. 문제 해결됨! – Pinocchio