【问题标题】:Connection Monitoring between Arduino and WebserverArduino 和 Webserver 之间的连接监控
【发布时间】:2013-07-02 03:38:19
【问题描述】:

我想做的事:

监控 Arduino 和 Apache 网络服务器之间的连接,并在网络浏览器上显示“在线”或“离线”以及最后一次在线时间。

我是如何做到的:

我的 Arduino 正在使用 HTTP POST 向 heartbeat.php 发送心跳。在 heartbeat.php 的开头,我设置了一个会话变量并将当前时间戳存储到 MySQL 数据库,然后重定向到 index.php

heartbeat.php

<?php
    session_start();
    $_SESSION['hb'] = 1;
    include("connect.php");
    $link=connection();
    $sql="UPDATE heartbeat SET time=NOW() WHERE 1";
    mysql_query($sql,$link);
    header("Location: index.php");
?>

index.php 中的 javascript 将执行自动刷新并将 healthcheck.php 加载到 HTML 正文内容中。

<script>
    $(document).ready(function() {
        var refreshId = setInterval(function() {
            $("#content").load("healthcheck.php");
        }, 1000);
        $.ajaxSetup({ cache: false });
    });
</script>

healthcheck.php中,脚本会检查session变量来判断系统是否在线。如果系统离线则查询上次在线时间并显示在浏览器上。

healthcheck.php

<?php
session_start();
include("connect.php");

if(isset($_SESSION['hb']))
{
    echo '<h1>System Online!!!</h1>';
    unset($_SESSION['hb']);
}
else
{
    echo '<h1>System Offline!!!</h1>';
    $link=connection();
    $result=mysql_query("SELECT * FROM heartbeat", $link);

    while($row=mysql_fetch_array($result))
    {
        printf("Last Online: %s", $row["time"]);
    }       
}
?>

问题:

当我使用我的电脑浏览器浏览 localhost/heartbeat.php 时,我可以看到“在线”在它变成“离线”之前显示最后一次在线时间,这就是我想要实现的使用 Arduino。

但是,当我使用 Arduino 测试脚本时,它总是显示“离线”,并且根据我的刷新间隔更新上次在线时间。

我认为这是因为会话变量是在 arduino 本身中设置的,所以我的电脑浏览器没有得到它,因此总是显示“离线”,如果我错了,请纠正我。

我正在寻找以有效方式实现此在线监控功能的建议和建议,欢迎和赞赏任何建议。

【问题讨论】:

  • 如果我错了,请纠正我,但我认为会话变量是基于每个客户端存储数据的,因此您在从 arduino 到服务器的会话中设置的会话变量与从 pc 网络浏览器到服务器的会话中的会话变量。
  • 好吧,你为什么不做一个程序,将 ICMP/Ping 发送到 arduino 主机,当它没有应答时,将其识别为“离线”?这会少一些麻烦,并且避免你在你的 Arduino 中添加另一个责任。
  • @til_b 是的,你是对的。我之前弄错了会话变量的概念,因此我陷入了困境。

标签: php mysql http post arduino


【解决方案1】:

我不确定您认为什么是您的“会话 ID”,但我认为您使用它更像是一个 API 密钥来识别您的设备以访问网络服务。会话 ID 通常是放入 HTTP 请求中的 cookie 中的令牌,管理和跟踪很麻烦,您的用例不需要它们。只需POST 令牌,并通过$_POST 变量获取它!

正如我在评论中建议的那样,您为什么不直接编写一个程序,将ICMP/Ping 发送到 Arduino,当它没有应答时,将其标识为“离线”?

这样会少一些麻烦,并且避免你在你的 Arduino 中添加另一个责任。

【讨论】:

  • Ping arduino 将是一个解决方案,但我担心的是我的服务器正在监听另一个可能随时发生的信号,因此它必须一直处于待机状态。当我的服务器正在 ping arduino 时信号进入时,流量/连接是否会受到影响,此外,我不仅要监控 1 个 arduino
  • 我真的没看懂你的评论,对不起……你谷歌翻译了两次?!
  • 不,我没有使用谷歌翻译。简而言之,我的服务器将连接到多个 arduino 客户端。他们每个人都可能随时发送触发信号,所以我怀疑如果我要求服务器 ping 每个 arduino 客户端,网络流量会受到影响。你明白我吗??
  • 我是在讽刺,但我还是没明白你在说什么……你说“我担心我的服务器正在监听另一个信号”,你到底在说什么?什么“必须一直待命”?你的意思是“当我的服务器正在 ping arduino 时信号进来时,流量/连接会受到影响”是什么意思?我错过了大线索,而你说的方式……很奇怪:-)
  • 好吧,你不需要每秒 ping 一次,你可以使用一个 PHP 包来发送/接收一个 ping 消息,并且每分钟左右执行一次,如果主机没有响应,发送 5 次 ping,如果全部失败,则将其标记为离线
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多