gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:48:26 27 4
gpt4 key购买 nike

我的问题的简短版本:

我如何设计一个 Python 脚本来监听和响应通过 HTTP 或串行端口接收的输入,并通过这些 channel 自行启动通信?我的问题是我不明白如何设计一个脚本,它既 (i) 使用 Web 框架来监听某些端口的 HTTP 输入,并且 (ii) 还进行其他独立于传入 HTTP 请求的工作。

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

  • 监听串行端口以获取偶尔的报告。具体来说,我有一个网络JeeNode与中央通信的传感器(无线 Arduino 兼容模块)JeeLink , 它通过 USB 连接到我的电脑并通过 pySerial 与我的 Python 脚本对话.
  • 监听 Web URL 以获取偶尔的输入。具体来说,用户通过短信向系统发送命令到Twilio。数字。 Twilio 拦截 SMS 消息并将它们发布到我指定的 URL,我使用 Bottle micro web-framework监听新的 HTTP 请求。
  • 响应两种类型的输入(串行和 HTTP)。例如,如果用户发送命令“ sleep ”,我想 (i) 通过串行端口告诉传感器进入休眠状态 -> JeeLink(然后将命令转发到 Remote ); (ii) 回复发送者——可能还有其他用户——命令已收到并正在执行。
  • 偶尔会启动自己与用户的通信(通过 HTTP -> Twilio -> SMS)或远程传感器(通过串行 -> JeeLink),而不会发生任何突发输入事件。两个例子:(1) 我想每 N 分钟向用户或远程传感器报告一次,即使我没有收到任何新的输入。 (2) 我想告诉用户 Remote 实际上已经进入休眠模式。因为 Remote 是电池供电的,所以它们大部分时间都处于无法访问的低功耗模式。他们只能在他们每 5 分钟发起一次无线“签到”时从 JeeLink 接收新命令。因此,虽然从技术上讲 Remote 会根据用户命令进入休眠(或唤醒等)状态,但命令和响应实际上是独立的。

我的问题是,我看到的所有 Web 框架的使用示例似乎都假设所有 突发事件都是通过 HTTP 请求发生的。我可以创建一个 Bottle 对象,并使用装饰器将代码绑定(bind)到该对象,只要它看到与某个指定 URL 路径匹配的 HTTP 请求,就会执行该对象。但是我不知道如何做到这一点,同时做其他独立于 HTTP 事件的工作,例如,监听串口。

经过一番努力,我现在正在考虑的潜在解决方案是:

  • 将功能拆分为单独的脚本。 A.py通过HTTP监听短信,并将相关信息写入某个数据库; B.py 不断读取数据库中的新记录并做出相应的 react ,同时监听串行监视器并进行其他工作。这似乎可以正常工作,但感觉不够优雅,我怀疑有一个我不知道的更简单的解决方案。
  • 也许答案与 Python 装饰器有关?我使用各种装饰器来指定 URL 路径,当匹配的 HTTP 请求进来时,执行绑定(bind)到装饰器的代码。所以我猜也许有一种方法可以指定其他类型的装饰器,而不是监听 HTTP 请求,而是在我的“主要”Python 代码告诉它时执行?但我对装饰器的了解还不够多,无法判断这是不是真的。

最佳答案

您似乎正在尝试编写一个异步应用程序来通过 HTTP 管理您的节点网络。您希望在多个 channel 发生传入通信时对其做出响应,您希望按计划在多个 channel 上发起通信,并且您希望这两种通信形式进行交互。所有这些通信都是与一个缓慢的外部世界进行的,因此如果不需要,您最好不要阻止。

如果将代码组织到几个 Python 模块中,并根据它们关注的领域进行拆分——串行接口(interface)代码、HTTP 接口(interface)代码、公共(public)处理代码路径等,那么维护系统可能会最容易。将这些组件编织在一起一个中央控制模块,它导入你的库,并且知道如何干净地启动和停止。然后,您可以独立于 Web 界面测试串行界面,并有可能在其他项目中重用其中一些 Python 模块。

关于同时监听/响应 HTTP 请求、串行端口和基于时间的事件的 Python 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16905982/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com