我使用twistd
插件系统启动 Twisted 应用程序。在这个SO answer的帮助下,我实现了一个 PID 文件(其中写入了进程 ID)来确定守护程序是否已成功启动。
对 twisted 守护程序(已启动或尚未启动)的监视由本机 (OS) 应用程序完成,该应用程序仅检查 PID 文件是否存在并读取其内容以查看是否存在具有该 PID 的活动进程。
到目前为止,一切都很好。我编写的扭曲插件创建了一个Service对象,它接受一个Driver对象作为参数。所有硬件特定的操作都包含在这个Driver类中。
我认为服务的内部细节超出了问题的范围。但只是为了澄清会有很多这样的Service通过网络相互交互。
现在,考虑驱动程序使用 UART/串行通信与硬件交互。目标硬件始终使用固定名称枚举自身,该名称在驱动程序中用于识别硬件的(物理)可用性。
在某些情况下,硬件可能没有(物理上)连接到系统。因此,我希望实现一种方法来识别硬件是否实际连接。
这是一个最小的扭曲插件代码
class Options(usage.Options):
optFlags = [
['emulate', 'e', 'Emulate the laser'],
]
class HardwareServiceMaker(object):
implements(service.IServiceMaker, IPlugin)
tapname = "test.hw"
options = Options
def makeService(self, options):
from hardwaredrivers import *
driver = HardwareDriver()
service = HarwareService(driver)
service.setPIDFile('test.hw.txt')
return service
这是服务和司机
class HardwareService(twisted.application.service.Service):
def __init__(self,driver)
self._driver = driver
def do_something(self):
self._driver.control_something()
class HardwareDriver():
def __init__(self):
# Lets say getAllSerials() returns a list of all available serial connections
allSerials = getAllSerials()
for serial in allSerials:
if 'TARGET_HARDWARE' in serial:
self.ser = serial.Serial()
self.ser.open()
def control_something():
self.ser.write('ON\n')
从上面的代码可以看出,如果没有枚举为TARGET_HARDWARE的硬件设备,那么self.ser
就是None
。调用时会导致错误操作control_something()
。
我想防止这种情况发生,或者更准确地提示用户在使用twistd
.