使用twistd
插件系统,我启动了Twisted应用程序。在SO answer的帮助下,我实现了一个PID文件(将进程ID写入其中)以确定守护程序是否已成功启动。
对扭曲守护程序(已启动或尚未启动)的监视由本机(OS)应用程序完成,该应用程序仅检查PID文件是否存在并读取内容以查看是否存在具有该PID的活动进程。
到目前为止一切顺利。我编写的扭曲插件创建了一个服务对象,该对象接受驱动程序对象作为参数。所有特定于硬件的操作都包含在驱动程序类中。
我认为服务的内部细节超出了问题的范围。但只是为了澄清会有很多服务,就像这些通过网络互相交流。
现在,请考虑驱动程序使用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
启动插件(因此服务,因此是驱动程序)时出现硬件错误。