我用 Python 编写了一个家庭安全程序,它使用 Raspberry Pi 的 GPIO 来感知运动并启动警报器。用户使用 NFC 标签激活/停用系统,连接到也连接到树莓派的 nfc reder。
为此,我需要以非阻塞方式不断检查 nfc 标签,同时不断检查传感器是否移动也非阻塞。我需要做更多并行的事情,但我认为这两个足以说明我的观点。
现在我使用像这样启动/停止的线程 - 在一定时间后停止线程- 我不确定这是否是最佳方式,但到目前为止系统工作正常。
现在我想扩展它的功能以通过 websockets 提供通知。我发现这可以用 Twisted 完成,但我很困惑..
这是我尝试执行此操作的示例代码:
from twisted.internet import reactor
from autobahn.websocket import WebSocketServerFactory, \
WebSocketServerProtocol, \
listenWS
def thread1(stop_event):
while(not stop_event.is_set()):
stop_event.wait(4)
print "checking sensor"
# sensor_state = GPIO.input(11)
if sensor_state == 1:
# how can I call send_m("sensor detected movement") #<---
t1_stop_event.set()
t1_stop_event = Event()
t1 = Thread(target=thread1, args=(t1_stop_event,))
class EchoServerProtocol(WebSocketServerProtocol):
def onMessage(self, msg, binary):
print "received: "+msg
print "stopping thread1"
t1_stop_event.set()
def send_m(self, msg):
self.sendMessage(msg)
if __name__ == '__main__':
t1.start()
factory = WebSocketServerFactory("ws://localhost:9000")
factory.protocol = EchoServerProtocol
listenWS(factory)
reactor.run()
那么如何从像thread1这样的线程调用服务器协议的send方法呢?