我现在已经挣扎了好几个小时了,真的只是不知道从哪里开始。我有一个连接到网络的无线网罩的arduino uno,以及连接到同一网络的Ubuntu笔记本电脑。我使用arduino Wifi Library连接到网络。
我可以从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期望的某些标准吗?提前谢谢。
答案 0 :(得分:4)
不,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))指定套接字可以通过机器碰巧拥有的任何地址访问。