2014-10-08 137 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))指定套接字可以通過機器碰巧有的任何地址到達。

相關問題