[英]Sending data over TCP from arduino to python
我已经为此奋斗了几个小时,实际上只是不知道从这里出发。 我有一个arduino uno,它的wifi屏蔽连接到网络,一台笔记本电脑,Ubuntu连接到同一网络。 我正在使用arduino Wifi库连接到网络。
我可以将数据从arduino发送到我的笔记本电脑,并使用以下sudo nc -l 25565
成功打印: 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期望的某些标准? 提前致谢。
不,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))指定套接字可以由机器碰巧拥有的任何地址访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.