2014-10-08 38 views
0

我一直在为此奋斗了几个小时,真的只是不知道从哪里开始。我有一个arduino uno,连接到网络的wifi盾牌和连接到同一网络的Ubuntu的笔记本电脑。我正在使用arduino Wifi Library连接到网络。通过TCP从arduino发送数据到python

我可以从Arduino的数据发送到我的笔记本电脑,并使用成功地进行打印:sudo nc -l 25565

我也尝试使用下面的Python代码做我nc做了同样的事情,这也正在运行的sudo以防万一:

#!/usr/bin/env python 

import socket 

TCP_IP = '127.0.0.1' 
TCP_PORT = 25565 
BUFFER_SIZE = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((TCP_IP,TCP_PORT)) 
s.listen(1) 

(conn,addr) = s.accept() 
print 'Connection address: ',addr 
while True: 
    data = conn.recv(BUFFER_SIZE) 
    if not data: break 
    print 'received data: ',data 
    conn.send('ECHO') 
conn.close() 
s.close() 

,但它只是挂在(conn,addr) = s.accept()。在同一台笔记本电脑上使用客户端python脚本,我可以连接到上面的服务器,并且可以将数据发送到服务器然后打印。

我只是不知道为什么nc将从arduino打印,但python服务器脚本不会,即使它将从python客户端打印。 arduino库能否遵循python期望的一些标准?提前致谢。

回答

3

不,arduino库不是“未遵循某些标准”。

您的程序绑定到localhost接口,IP地址127.0.0.1。这意味着只有在同一台PC上运行的程序才能连接到你的Python服务器。

试试这个:

s.bind(('',TCP_PORT)) 

参考:

https://docs.python.org/2/library/socket.html

对于IPv4地址,两个特殊的形式被接受,而不是一个主机地址:空字符串代表INADDR_ANY,并字符串'<broadcast>'代表INADDR_BROADCAST。 IPv6的行为不适用于向后兼容性,因此,如果您打算在您的Python程序中支持IPv6,则可能需要避免这些行为。

https://docs.python.org/2/howto/sockets.html#creating-a-socket

几件事情要注意:我们使用socket.gethostname(),以便在插槽将是外界可见。如果我们使用s.bind(('localhost',80))或s.bind(('127.0.0.1',80)),我们仍然会有一个“服务器”套接字,但只有在同一个机。 s.bind(('',80))指定套接字可以通过机器碰巧有的任何地址到达。