我的问题的简短版本:
如何设计一个 Python 脚本来监听和响应通过 HTTP 或串行端口接收的输入,并通过这些通道自行启动通信?我的问题是我不明白如何设计一个脚本,既 (i) 使用 Web 框架在某些端口上侦听 HTTP 输入,并且 (ii) 还执行独立于传入 HTTP 请求的其他工作。
长版:我想使用 Python 来设计一个系统,它执行以下操作:
- 监听串行端口以获取偶尔的报告。具体来说,我有一个JeeNode传感器网络(无线 Arduino 兼容模块),它与中央JeeLink 通信,它通过 USB 连接到我的计算机并通过pySerial与我的 Python 脚本通信。
- 侦听网络 URL 以获取偶尔的输入。具体来说,用户通过 SMS 向系统发送命令到Twilio号码。Twilio 截获 SMS 消息并将它们发布到我指定的 URL,然后我使用Bottle 微型网络框架来侦听新的 HTTP 请求。
- 响应输入的两种类型(串行和 HTTP)。例如,如果用户发送命令“睡眠”,我想 (i) 通过串行端口 -> JeeLink 告诉传感器进入睡眠状态(然后将命令转发到遥控器);(ii) 回复发送者——也许还有其他用户——命令已被接收并正在执行。
- 偶尔启动自己与用户的通信(通过 HTTP -> Twilio -> SMS)或远程传感器(通过串行 -> JeeLink),而没有任何沉淀输入事件。两个例子:(1)我想每 N 分钟向用户或远程传感器报告一次,即使我没有收到任何新的输入。(2) 我想告诉用户遥控器实际上已经进入睡眠模式。因为遥控器是电池供电的,所以它们大部分时间都处于无法访问的低功耗模式。他们只能在每 5 分钟启动一次无线“签到”时从 JeeLink 接收新命令。因此,虽然从技术上讲,遥控器响应用户命令而进入睡眠(或唤醒等),但命令和响应实际上是独立的。
我的问题是,我所见过的所有 Web 框架的使用示例似乎都假设所有沉淀事件都是通过 HTTP 请求发生的。我可以创建一个 Bottle 对象,并使用装饰器将代码绑定到该对象,只要它看到与某个指定 URL 路径匹配的 HTTP 请求,就会执行该对象。但我不知道如何做到这一点,同时做其他独立于 HTTP 事件的工作,例如,监听串行端口。
在苦苦挣扎之后,我现在正在考虑的潜在解决方案是:
- 将功能拆分为单独的脚本。A.py 通过 HTTP 监听文本消息,并将相关信息写入某个数据库;B.py 不断读取数据库中的新记录并做出相应的反应,以及监听串行监视器并做其他工作。这似乎可以正常工作,但感觉不优雅,我怀疑有一个我不知道的更简单的解决方案。
- 也许答案与 Python 装饰器有关?我使用各种装饰器来指定 URL 路径,当匹配的 HTTP 请求进来时,执行绑定到装饰器的代码。所以我猜也许有一种方法可以指定其他类型的装饰器,而不是监听 HTTP 请求,而是在我的“主要”Python 代码告诉它时执行?但我对装饰器的了解还不够,无法知道这是否属实。