同时侦听/响应HTTP请求,串行端口和基于时间的事件的Python脚本?

时间:2013-06-03 21:17:07

标签: python python-3.x serial-port arduino bottle

我的问题的简短版本:

如何设计一个可以侦听和响应通过HTTP或串行端口接收的输入的Python脚本,还可以通过这些通道自行启动通信?我的问题是我不明白如何设计单个脚本(i)使用Web框架在某些端口上侦听HTTP输入,以及(ii)还做其他与传入HTTP请求无关的工作。

长版: 我想使用Python来设计一个执行以下操作的系统:

  • 收听串行端口以获取不定时间的报告。具体来说,我有一个JeeNode传感器网络(无线Arduino兼容模块)与中央JeeLink通信,它通过USB连接到我的计算机并通过pySerial与我的Python脚本对话
  • 收听偶尔输入的网址。具体而言,用户通过SMS向系统发送命令到Twilio号码。 Twilio拦截SMS消息并将其发布到我指定的URL,并使用Bottle micro web-framework来侦听新的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代码告诉它时执行?但我不知道装饰者是否知道这是否属实。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试编写异步应用程序来通过HTTP管理节点网络。您希望在多个频道发生时响应传入通信,您希望按计划,多个频道启动通信,并且您希望这两种形式的通信进行交互。所有这些通信都是外部世界很慢的,所以如果你不需要,你也不应该阻止它。

如果将代码组织成几个Python模块,按照它们关注的区域 - 串行接口代码,HTTP接口代码,通用处理代码路径等进行组合,那么维护系统可能是最容易的。将这些组件组合在一起一个中央控制模块,可以导入您的库,并知道如何干净地启动和停止。然后,您可以独立于Web界面测试串行接口,并可能在其他项目中重用其中一些Python模块。