我正在尝试做模块编程。逻辑是网络中将有一个中央设备和两个子设备。子设备将每隔1分钟向中央设备发送一个信号。如果您在1分钟内从其中一个子设备接收到信号,则该设备的状态将被标记为活动。在1分钟后,中央设备必须再次搜索来自该设备的信号。如果在1分钟内未收到该信号,则该特定设备的状态应为停用。
我试着用python来实现这一点。但我不明白如何从不同的子设备中每隔1分钟分别检查信号警报。
当我研究的时候,它表明我必须使用多线程和睡眠计时器的概念。有没有人能给我提个建议,怎么做?
提前感谢!!
发布于 2017-02-28 23:23:51
这些设备位于网络上,这意味着您可以使用Socket在设备之间进行通信。有关在python中使用套接字的更多详细信息,请阅读here。使用Sockets,您可以连续监听从子设备接收到的信号,并仅每分钟更新设备状态。
发布于 2017-02-28 23:06:33
试试这样的东西
import threading
import thread
def recieve_message(ip):
threading.Timer(60.0, recieve_message).start()
recieve_message_content
if __name__ == "__main__":
# Create two threads as follows
try:
thread.start_new_thread( recieve_message, (127.0.0.1) )
thread.start_new_thread( recieve_message, (127.0.0.1) )
except:
print "Error: unable to start thread"
发布于 2017-02-28 23:53:08
您可能需要的是一个多客户端服务器,它可以处理来自一组同时连接的客户端的每条消息。一个简单的概念来自模块SocketServer
。您必须创建Request Handler的子类,以便告诉服务器如何处理传入的消息。
服务器
import SocketServer
PORT = xxxxx # Any port you desire
class RequestHandler(SocketServer.BaseRequestHandler) :
def handle(self) :
address = self.client_address()[0]
time_0 = time.time()
while True :
try :
buff = self.request.recv(1024)
time_1 = time.time()
self.request.send("Okay")
except SocketServer.socket.error :
print addr, ">> Connection Failure"
return
if time_1 - time_0 > 61 :
print addr, ">> Timeout"
return
# Now do something with the buffer
# ...
server = SocketServer.ThreadingTCPServer(('', PORT), RequestHandler)
server.server_forever()
您甚至可以将server.serve_forever()
放在一个可区分的线程中,以确保在读取缓冲区之后执行的命令不会花费太长时间,并且在请求处理中不会对缓冲区做任何事情。因此,您将有一个线程监听以太网端口并写入缓冲区,另一个线程从该缓冲区读取数据并处理数据。
您可以在将此缓冲区设置为类的属性或使用全局变量时读取它。
客户端
import socket
import time
IP = xxx.xxx.xxx.xxx # The IP of the server
PORT = xxxxx # Same port on which the server is listening
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((IP, PORT))
while True :
time.sleep(60.0)
try :
sock.send("Some crazy message")
buff = sock.recv(1024)
if buff != "Okay" :
print "Something went wrong"
return
except socket.error :
print "Connection Failure"
break
附言:我没有测试这段代码...所以不能保证!
https://stackoverflow.com/questions/42511713
复制相似问题