2016-08-02 592 views
1

我將Arduino設置爲服務器。在終端(I使用的是Mac),一個可連接到它,看到輸出,並關閉連接如下:從python中讀取telnet連接的實時輸出

> telnet HOST 
Trying 192.168.0.101... 
Connected to HOST. 
Escape character is '^]'. 
0 , 25486 , 0.00 : 
1 , 25754 , 0.00 : 
2 , 26054 , 0.00 : 
3 , 26320 , 0.00 : 
4 , 26642 , 0.00 : 
5 , 26912 , 0.00 : 
6 , 27187 , 0.00 : 
7 , 27452 , 0.00 : 
8 , 27774 , 0.00 : 
0 , 28068 , 2.72 : 
1 , 28389 , 2.72 : 
2 , 28695 , 2.72 : 
3 , 29002 , 2.72 : 
4 , 29272 , 2.72 : 
5 , 29537 , 2.72 : 
6 , 29806 , 2.72 : 
7 , 30112 , 2.72 : 
8 , 30389 , 2.72 : 
^] 
telnet> quit 
Connection closed. 

數據流目前以每秒約5行,沒有延遲。然後我嘗試使用telnetlib在Python腳本中重新創建此連接。

import telnetlib 
import time 

tn = telnetlib.Telnet(HOST) 
tn.set_debuglevel(1) 

while True: 
    tn_read = tn.read_very_eager() 
    time.sleep(1) 
    print repr(tn_read) 

此腳本只返回空字符串。我讀到了有關時間問題,所以我包括手動延遲。我也試過tn.read_until(':')無濟於事。

我產生疑問:

  1. 有什麼辦法來拉一次在一個行,假設輸入流是連續的,有效永無止境?
  2. 這是如何在Python中實現的?

謝謝。

編輯: 我已經包含了Arduino代碼的void循環。

void loop(void){ 
    // Handle any multicast DNS requests 
    mdns.update(); 

    // Handle a connected client. 
    Adafruit_CC3000_ClientRef client = senseServer.available(); 
    if (client) { 
     Serial.println("Connected"); 
    for(int i = 0; i < 9; i ++){ //sets number of channels 
     client.print(i); 
     client.print(" , "); 
     stamp = millis(); 
     client.print(stamp); 
     client.print(" , "); 
     client.print(R2); 
     client.println(" :"); 
     delay(10); 
    } 
    e = e + 1; 
    R2 = pow(2.718,e); 
    } 
} 
+0

arduino上的服務器代碼是什麼樣的? –

+0

我編輯了問題以包含代碼。 –

+0

Telnet通常在端口23上服務,你可以確認你的服務器正在使用端口23尋找一條線,如'Adafruit_CC3000_Server senseServer(PORT);' –

回答

0

您可以使用socket module在更低的水平工作嗎?

import socket 
s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM) 
s.connect(("192.168.0.101", 23)) 

while True: 
    data = str(s.recv(1024),encoding='utf-8') 
    print(data) 

爲什麼這應該工作:看來你的服務器是不是一個完整的telnet服務器(需要登錄等),但等待連接的插座,然後返回數據。

由於服務器只是一個套接字,您可以用一個簡單的套接字連接到它,這就是上面所做的。我用兩種方式測試了這一點。首先在Star戰爭telnet服務器上登錄towel.blinkenlights.nl,然後用一個簡單的python服務器等待連接,然後每秒返回一行文本(模擬你的服務器)。

+0

我試過這段代碼,它只是掛起;它不打印空字符串或任何東西。 –