【问题标题】:arudino web server too slow - possibly use queue?arduino Web 服务器太慢 - 可能使用队列?
【发布时间】:2016-10-14 11:16:50
【问题描述】:

我已经使用运行 Web 服务器的 ESP8266 和我为使用 RF433 发射器的 livolo 开关找到的库实现了 Livolo 灯开关的基本灯控制器。

我对这样的代码没有任何问题..(如果需要,我可以发布它)Web 服务器侦听请求,然后调用函数发送 rf433 信号(大约需要 2 秒 - 因为livolo 协议基本上是把同一件事炸了 100 次)。

问题是 Web 服务器/整个 arduino/esp8266 在发送 RF 信号时“阻塞” - 最多 2 秒。

如果我只是让网络服务器监听,并说只是向串行调试器写入一个字符串,它的闪电般的速度.. 可以在一秒钟内多次击中它。

通常这没问题,但是发送我正在使用的网络请求的家庭自动化系统不会等待......所以如果它连续发送 10 个请求(关闭所有灯),我的小网络服务器基本上跟不上,因为 esp8266 正忙于进行 RF 广播,它落后了,然后发送请求的系统收到套接字错误。我无法更改发送的系统。

我尝试将其实现为基本的 FIFO 队列,但基本上发生了同样的问题。我想知道在两者之间使用像 i2c 这样的总线来实现两个 arudino (esp8266) 是否更好?一台网络服务器可以接受请求并将它们放入队列,另一台可以懒惰地读取队列并进行射频发送......

我想知道是否有人对 a) 提出建议,这是正确的方法吗? b) 我应该在硬件之间使用什么总线.. c) 远程队列读取实现的任何示例?

任何想法都非常感谢..如果需要,我可以在 web 服务器等上共享代码,但它非常基本的 arudino esp8266 web 服务器实现,这并不是我真正陷入困境的地方.. 我想我对代码示例更感兴趣这表明一个硬件读取在另一个上实现的队列是否有意义?

【问题讨论】:

  • 您也许可以使用 gpio 分线板以不占用 esp 的方式处理 rf 发送,但是第二个 esp(尤其是 01)会更便宜,而且效果会很好好吧:“双核”设计。
  • 感谢您的建议.. 是的,已经开始在 i2c 上下降 2 个芯片。

标签: arduino i2c esp8266


【解决方案1】:

ESPAsyncWebServer 正是为此目的而构建的 - 它异步处理所有 Web 请求,而且速度非常快。我可以每秒 10-20 次查询我的本地单位(以及无数的生产单位),连续几天都没有问题。例如,我在主循环中查询交流电源数据,并通过 Web 服务器公开存储的数据。通过 UART 查询数据的时间可以随心所欲(通常约为 500 毫秒),但是,Web 请求将始终在它们进入后立即提供服务

让主循环运行 RF 逻辑,并将数据存储为全局(或等效),让 Web 服务器简单地将存储的值发送给客户端

【讨论】:

  • 这听起来正是我所追求的......我会检查一下,谢谢!
【解决方案2】:

我能想到两种解决方案

1) 中断

Interupts 允许 Arduino 在不停止程序的情况下运行阻塞代码。建议检查一下。但是我担心 arduino 可能没有足够的处理能力和内存来处理管理服务器和执行命令

2) 两个设备(有中断!)

通过 i2c 总线连接两个 Arduino。第一个将侦听传入的 Web 请求,然后与第二个通信以执行给定的命令(通过 i2c 总线)。 第二个将使用中断来监听传入的命令。中断会将每个命令添加到队列中,程序的主循环将执行最近的命令。

【讨论】:

  • 谢谢,我开始使用 i2c、一个主设备和其他从设备向下 2 esp8266,然后得知 esp8266 不能成为从设备.. 所以使用 Arduino nano 作为从设备,然后挣扎通过两个之间的数据.. 我想我会尝试下面建议的 ESPAsyncWebServer,如果可行,问题在一个芯片上解决.. 如果不是,看起来像两个带有 i2c 的芯片或等待将解决所有这些问题的 Esp32 :)
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多