Comment utiliser la bibliothèque telnetlib de python pour récupérer les données d'un périphérique pendant une période déterminée?

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

  •  08-07-2019
  •  | 
  •  

Question

Je me connecte à un périphérique matériel via Telnet. Ce périphérique est assez simple en termes d'E / S. Je lui soumets donc une commande, puis l'appareil extrait les données ligne par ligne, une fois par seconde. Chaque ligne ne contient qu'un numéro.

Ma question est donc la suivante: si je me connecte à ce périphérique à l’aide de la bibliothèque telnetlib de Python, comment puis-je récupérer les données pendant une période déterminée (ou un nombre déterminé de lignes de données)?

J'ai essayé d'utiliser toutes les différentes commandes read_, mais elles semblent toutes se bloquer indéfiniment, à l'exception de read_until, que je ne peux pas utiliser car le résultat ne peut pas être utilisé pour déterminer le moment de l'arrêt.

(J'utilise Python 2.5 sous Cygwin, au fait).

Edit: Peut-être que la vraie question est: devrais-je utiliser telnetlib du tout pour cela, ou devrais-je simplement utiliser le module socket?

Était-ce utile?

La solution

D'après votre description, je ne comprends pas bien si vous utilisez telnetlib car le périphérique auquel vous vous connectez nécessite la configuration du terminal fournie par telnet ou parce que cela semblait être la bonne chose à faire.

Si le périphérique est aussi simple que vous décrivez, c’est-à-dire. ne négociez pas les options de terminal lors de la connexion - avez-vous envisagé le module asynchat ? Cela conviendrait pour la commande " send, read lines " sorte de motif IO que vous décrivez.

Sinon, vous pouvez utiliser le module socket pour l'ouvrir. la connexion au périphérique, puis asseyez-vous dans une boucle chronométrée et read () les données entrantes. Si les lignes sont terminées par une nouvelle ligne, vous devez pouvoir identifier chaque numéro individuellement. Si vous êtes préoccupé par le blocage, collez cette boucle dans son propre thread.

Autres conseils

On dirait que le blocage n’est pas vraiment votre problème, car vous savez que vous ne bloquerez qu’une seconde. Pourquoi ne pas faire quelque chose comme:

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

D'après mon expérience, la plupart de ces périphériques utilisent une invite, auquel cas Telnet.read_until () convient:

  

Telnet.read_until (attendu [, délai d'attente])

     

Lit jusqu'à ce qu'une chaîne donnée, attendue, soit rencontrée ou jusqu'à ce que le délai d'attente expiré soit écoulé.   Si aucune correspondance n'est trouvée, retournez ce qui est disponible à la place, éventuellement la chaîne vide. Raise EOFError si la connexion est fermée et qu'aucune donnée cuite n'est disponible.

Si aucune invite utilisable (répétitive) n'est présentée par le périphérique, essayez Telnet.read_very_eager () ou Telnet.read_very_lazy () :

  

Telnet.read_very_eager ()

     

Lisez tout ce qui peut être sans bloquer dans les E / S (impatients).

     

Déclenchez EOFError si la connexion est fermée et qu'aucune donnée préparée n'est disponible. Retour '' si aucune donnée cuite n'est disponible autrement. Ne bloquez que si vous êtes au milieu d’une séquence IAC.

Lisez les lignes d'une boucle jusqu'à ce que vous ayez lu le nombre de lignes requis ou que le délai ait été atteint. Cependant, il ne semble pas que vous ayez réellement besoin d'une bibliothèque Telnet. Pourquoi ne pas simplement utiliser un socket TCP simple pour la connexion?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top