2012-08-28 227 views
1

我試圖通過使用Lantronix EDS2100模塊通過python中的套接字通信在網絡上建立與ADAM-4017 + I/O模塊的連接。對我而言,我無法完成它的工作。python Socket發送ascii命令並接收響應

EDS有一個IP地址和adam單元連接到的端口(10001)。我想詢問亞當的通道1的值(ASCII命令#000)

任何幫助,不勝感激:

import socket 
edsIP = "192.168.1.135" 
edsPORT = 10001 
MESSAGE="#000\r" 


srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
srvsock.bind(('',23000)) 
srvsock.listen(1) 
newsock, (remhost, remport) = srvsock.accept() 
srvsock.send((MESSAGE),(edsIP, EdsPORT)) 



while 1: 


    data, addr = srvsock.recv(4096) 
    print ("received message:", data,addr) 
    srvsock.close() 
+0

應該是工作流程你聽從單位的連接,而不是連接到它?從我所看到的,你綁定一個端口並等待連接。 – jdi

+0

工作流程如下:發送ascii命令,然後收到迴應 – user1631534

回答

1

我對此設備沒有任何具體的瞭解,但是從您的描述中可以看出,它期望在端口10001上建立連接。但是,您在代碼中所做的是打開自己的套接字並偵聽端口23000上的連接,然後等待連接。如果你不期望有什麼東西可以與你聯繫,那麼你只是在等待沒有理由。

如果你的所有設備需要的是您可以連接和發送郵件,那麼我會認爲這會做到這一點:

import socket 

edsIP = "192.168.1.135" 
edsPORT = 10001 
MESSAGE="#000\r" 

srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
srvsock.settimeout(3) # 3 second timeout on commands 
srvsock.connect((edsIP, edsPORT))) 
srvsock.sendall(MESSAGE) 

data = srvsock.recv(4096) 
print "received message:", data 

srvsock.close() 

更新

您的意見建議,你可能會使用python3 。如果是這樣,你可能需要調整這樣的代碼:

MESSAGE=b'#000\r' 

當您收到bytes迴應,如果你想要把它變成一個字符串:

print data.decode("UTF-8") 
+0

我試着在打印附件中添加parantheses,並刪除連接線上的額外支架。它返回:srvsock.send(MESSAGE) TypeError:'str'不支持緩衝區接口 – user1631534

+0

fyi我是一個NOOB蟒蛇程序員 – user1631534

+0

你使用的是什麼版本的Python? – jdi

0

我可以直接看到的唯一問題是,你已經縮進,同時聲明只有一個空格,但那可能只是從剪切和粘貼在這裏。

經過一些測試很明顯,當你試圖接受服務器上的信息時,它會被阻塞,所以你永遠不會向你的設備發送任何東西。