2012-08-28 184 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

我可以直接看到的唯一问题是,你已经缩进,同时声明只有一个空格,但那可能只是从剪切和粘贴在这里。

经过一些测试很明显,当你试图接受服务器上的信息时,它会被阻塞,所以你永远不会向你的设备发送任何东西。