串行推送到服务器发送的脚本


Serial Push to Server Sent Script

我有一个LAMP web服务器,它带有一个Python脚本,可以持续监控串行端口以获取传入数据。这是家庭自动化系统的一部分(Arduino Yun和一堆Pro Minis,每个都配有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作为传输层这两个目标的最佳方法是什么?

所以我最终做了什么:

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

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

不管怎样,我就是这么做的,不需要websocket!我还认为它比挂起的AJAX查询更优雅。

根据我对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 的限制