¿Cómo puedo usar el telnetlib de python para obtener datos de un dispositivo durante un período de tiempo fijo?

StackOverflow https://stackoverflow.com/questions/630217

  •  08-07-2019
  •  | 
  •  

Pregunta

Me estoy conectando a un dispositivo de hardware a través de telnet. Ese dispositivo es bastante simple en términos de E / S. Entonces le envío un comando, y después de eso, el dispositivo bombea datos una línea a la vez, una vez por segundo. Cada línea solo contiene un número.

Entonces, mi pregunta es la siguiente: si me conecto a este dispositivo usando el telnetlib de python, ¿cómo puedo obtener datos durante un período de tiempo fijo (o un número fijo de líneas de datos)?

He intentado usar todos los comandos read_, pero todos parecen bloquearse indefinidamente, aparte de read_until, que no puedo usar ya que la salida no se puede usar para determinar cuándo parar.

(estoy ejecutando python 2.5 bajo Cygwin, por cierto).

Editar: Quizás la verdadera pregunta es, ¿debería usar telnetlib para esto, o debería usar el módulo de socket?

¿Fue útil?

Solución

De su descripción no estoy claro si está usando telnetlib porque el dispositivo al que se está conectando requiere la configuración del terminal proporcionada por telnet o porque parecía lo correcto.

Si el dispositivo es tan simple como usted describe, es decir. no negocia las opciones de terminal en la conexión: ¿ha considerado el módulo asynchat ? Sería apropiado para el comando "enviar", leer líneas " tipo de patrón IO que está describiendo.

Alternativamente, para algo de nivel inferior, puede usar el módulo socket para abrir la conexión al dispositivo y luego sentarse en un bucle temporizado y read () los datos entrantes. Si las líneas están terminadas en nueva línea, debería ser sencillo para usted identificar cada número individual. Si le preocupa el bloqueo, pegue este bucle en su propio hilo.

Otros consejos

Parece que bloquear no es realmente tu problema, ya que sabes que solo estarás bloqueando por un segundo. ¿Por qué no hacer algo como:

lines_to_read = 10
for i in range(lines_to_read):
    line = tel.read_until("\n")

En mi experiencia, la mayoría de estos dispositivos utilizan algún indicador, en cuyo caso Telnet.read_until () es apropiado:

  

Telnet.read_until (esperado [, tiempo de espera])

     

Leer hasta que se encuentre una cadena determinada, esperada, o hasta que hayan transcurrido los segundos de tiempo de espera.   Cuando no se encuentre ninguna coincidencia, devuelva lo que esté disponible en su lugar, posiblemente la cadena vacía. Aumente EOFError si la conexión está cerrada y no hay datos cocinados disponibles.

Si el dispositivo no presenta una solicitud utilizable (repetitiva), intente Telnet.read_very_eager () , o Telnet.read_very_lazy () :

  

Telnet.read_very_eager()

     

Lea todo lo que puede ser sin bloquear en E / S (ansioso).

     

Eleve EOFError si la conexión está cerrada y no hay datos cocinados disponibles. Volver '' si no hay datos cocinados disponibles de lo contrario. No bloquee a menos que esté en medio de una secuencia IAC.

Lea las líneas en un bucle hasta que haya leído el número requerido de líneas o se haya alcanzado el límite de tiempo. Sin embargo, no parece que realmente necesite una biblioteca telnet. ¿Por qué no usar un simple TCP socket para la conexión?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top