2009-03-10 4 views
2

Je me connecte à un périphérique matériel via telnet. Cet appareil est assez simple en termes d'E/S. Je lui envoie donc une commande, et après cela, l'appareil pompe les données une ligne à la fois, une fois par seconde. Chaque ligne contient juste un nombre. Donc, ma question est la suivante: si je me connecte à cet appareil en utilisant telnetlib de python, comment puis-je récupérer des données pour une période de temps fixe (ou un nombre fixe de lignes de données)? J'ai essayé d'utiliser toutes les différentes commandes read_, mais elles semblent toutes bloquer indéfiniment, à l'exception de read_until, que je ne peux pas utiliser car la sortie ne peut pas être utilisée pour déterminer quand arrêter. (Je cours python 2.5 sous Cygwin, BTW). Edit: La vraie question est peut-être, devrais-je utiliser telnetlib à tout cela pour cela, ou devrais-je simplement utiliser le module de socket?Comment puis-je utiliser telnetlib de python pour extraire des données d'un appareil pendant une période donnée?

Répondre

5

D'après votre description, je ne suis pas clair si vous utilisez telnetlib parce que l'appareil que vous vous connectez à nécessite une configuration de terminal fourni par telnet ou parce qu'il semblait être la bonne chose à faire.

Si le périphérique est aussi simple que vous l'avez décrit, par exemple. ne pas négocier les options de terminal sur la connexion - avez-vous considéré le module asynchat? Cela serait approprié pour le type d'E/S "envoyer une commande, lire des lignes" que vous décrivez.

Alternativement, pour quelque chose de plus bas niveau, vous pouvez utiliser le module socket pour ouvrir la connexion au périphérique, puis s'asseoir dans une boucle temporisée et read() les données entrantes. Si les lignes sont terminées par un saut de ligne, il devrait être simple pour vous d'identifier chaque numéro individuel. Si vous êtes concerné par le blocage, collez cette boucle dans son propre fil.

+1

Spot sur. Mon erreur a été de penser que je devais utiliser Telnet en premier lieu! – Ben

1

Lire les lignes dans une boucle jusqu'à ce que vous ayez lu le nombre de lignes requis ou que la limite de temps soit atteinte. Cependant, il ne semble pas que vous ayez réellement besoin d'une bibliothèque Telnet. Pourquoi ne pas simplement utiliser un simple TCP socket pour la connexion?

2

Dans mon expérience, la plupart de ces appareils utilisent une invite, dans ce cas Telnet.read_until() est approprié:

Telnet.read_until(expected[, timeout])

Lire jusqu'à une chaîne donnée, attendue, est rencontrée ou jusqu'à ce que timeout secondes se sont écoulées. Si aucune correspondance n'est trouvée, renvoyer tout ce qui est disponible à la place, éventuellement la chaîne vide. Augmentez EOFError si la connexion est fermée et qu'aucune donnée n'est disponible.

Si aucun utilisable (répétitif) rapide est présenté par le dispositif, essayez Telnet.read_very_eager() ou Telnet.read_very_lazy():

Telnet.read_very_eager()

Lire tout ce qui peut être sans bloquer dans I/O (impatient) .

Relancez EOFError si la connexion est fermée et qu'aucune donnée n'est disponible. Renvoie '' si aucune donnée cuite n'est disponible autrement. Ne bloquez pas sauf si vous êtes au milieu d'une séquence IAC.

2

Il semble que le blocage n'est pas vraiment votre problème, puisque vous savez que vous ne serez le blocage pour 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") 
Questions connexes