从python

时间:2016-08-02 21:17:32

标签: python c++ arduino telnet telnetlib

我将Arduino设置为服务器。在终端(我使用Mac),可以连接到它,查看输出,并按如下方式关闭连接:

> 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中实现?
  3. 谢谢。

    编辑: 我已经包含了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);
      }
    }
    

1 个答案:

答案 0 :(得分: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服务器(需要登录等),而是一个等待连接的套接字,然后返回数据。

由于服务器只是一个套接字,你可以使用一个简单的套接字连接它,这就是上面所做的。我用两种方式测试了这个。首先使用星球大战的telnet服务器towel.blinkenlights.nl,然后是一个等待连接的简单python服务器,然后每秒返回一行文本(模拟你的服务器)。