0

我有一个带有 Python 脚本的 LAMP Web 服务器,它持续监视串行端口的传入数据。这是家庭自动化系统的一部分(Arduino Yun 和一堆 Pro Mini,每个都带有 nrf24L01+ RF 收发器)。

我的目标是:

  1. 将传入的数据保存到 MySQL 的适当位置,例如“door open”或“temp = 72F”。我相信 Python 脚本可以处理这个问题。
  2. 使用服务器发送事件 (SSE) 将新数据推送到客户端浏览器(当客户端连接时)。

我意识到我可以使用 AJAX,但推送数据似乎比轮询更好。问题是我必须以某种方式将 SSE 绑定数据从 python 脚本转移到 PHP,但前提是 SSE PHP 脚本正在运行。此外,我相信每个客户端都会创建一个 SSE PHP 脚本的新实例——因此 python 与 PHP 的比例甚至不会是 1:1。我曾想过让 SSE PHP 监控 MySQL 数据库,但这本质上又回到了轮询,尽管可能是非常高频率的轮询。

或者,我认为 SSE PHP 脚本可以监控串口,但我认为串口数据只能读取一次,因此多个脚本会竞争数据,这也不起作用。

实现将传入数据保存到我的数据集和使用 SSE 作为传输层这两个目标的最佳方法是什么?

4

2 回答 2

1

所以这就是我最终做的事情:

  • Python daemon 在 Arduino Yun 上运行,监控 ttyATH0 串口以获取新数据。当收到一个新字符串时(我选择用 ~ 字符终止字符串),它会解析它并将其存储到 MySQL 数据库中。MySQL 条目的更新会自动更新该行上的时间戳。这是表的配置。
  • 加载 html 页面启动浏览器订阅服务器从服务器上运行的 .php 脚本发送的事件
  • 该脚本在 MySQL 数据库中搜索比几秒钟新的条目,并将 JSON 传递给网页,该网页由 javascript 解析以动画页面。

我认为 Server Sent 脚本的 3 秒刷新时间足以满足我的需要。它理论上可以连续运行,但它可能会淹没网页并降低性能。该脚本也可以配置为每 1 秒运行一次——也许有一天我会进行更新。

...无论如何,我就是这样做的,不需要 websockets!我也认为它比悬挂的 AJAX 查询更优雅。

于 2015-05-27T03:10:03.257 回答
0

根据我对 SSE 的了解,这里的问题是让长期运行的 PHP 脚本获取 Python 脚本将进入数据库的更改。

假设您的 Python 脚本正确地将数据添加到 MySQL 数据库。

然后,您的 PHP 脚本将简单地获取数据并通过 SSE 发送。您需要一个长时间运行的脚本,但您还需要使用 php.net 上定义的 set_time_limit()查看 PHP 脚本的超时期限。

我会尝试这样的事情:

$link = mysqli_connect("myhost","myuser","mypassw","mybd");

$number_of_times = 1;
/*
 * Ideally figure out how many times you want to query per consistent
 * connection, knowing that your script will eventually time out and
 * that EventSource will reconnect within 3 seconds
 */

for ($i=0;$i<$number_of_times;$i++) {
    $query = "SELECT name FROM mytable" or die("Error in query: " . mysqli_error($link)); 
    $result = $link->query($query); 

    while($row = mysqli_fetch_array($result)) { 
      // echo your SSE data here
    } 
}

您担心的不是脚本的比率不是 1:1,因为使用 EventSource 的网页将连接到 PHP 脚本,而 Python 脚本正在监视传入数据的不同来源并将其写入共享数据库脚本将使用。

另外,请阅读EventSource的限制

于 2015-04-01T00:41:36.387 回答