我试图检查我的树莓是否在我家外面上网,但出于安全考虑,我无法在我的路线上打开任何端口。
当我在同一个网络上时,我只是用PHP脚本ping它们,但我怎么能远程执行呢?
我希望能够用PHP做到这一点。
答案 0 :(得分:3)
如果您无法在路由器上打开端口,唯一的方法就是以另一种方式发送流量:让Pis定期轮询您家外的内容并检查上次轮询的时间。
你应该能够找到一种免费的方式。例如,您可能会将其与Google云端硬盘帐户相关联,然后使用grive
或GoogleCL
或类似的Google云端硬盘命令行界面来更新位于其中的文件的时间戳。或者,如果您的家中有一个可以控制的网站,您可以让他们点击预定义的网址,然后让网络服务器记录此类请求。
但是,实际上,只要您知道自己正在做什么,并且您的Pis被小心锁定,在路由器上打开端口并不安全。
答案 1 :(得分:1)
创建对Web服务发出请求的预定脚本(使用cron进行计划)。脚本只是通知Web服务“我还活着,不要担心”,然后您可以从Web服务请求覆盆子列表及其最后的联系时间。
如果您无法打开任何端口,我想这是唯一的选择。当然,您需要创建该Web服务或查找现有Web服务。为此,您需要具有公共IP地址(最好是静态)的Web服务器(虚拟化或非虚拟化)。
以下是有关如何使用PHP监听请求的示例。我假设您可以为每个覆盆子设备提供唯一的名称。
<?php // myWebService.php
$nameOfDevice = $_GET['name'];
$timestamp = time();
// Here you can save timestamp to database or file or any place you want
saveThings($nameOfDevice, $timestamp);
// Let's just print something out that the scheduled script knows
// that everything went ok
echo 'OK';
?>
在raspberry中,您也可以使用PHP来向Web服务发出请求:(确保安装了php_curl模块)。
#!/usr/bin/php5
// informWebService.php
$deviceName = "device-name-1";
$webServiceUrl = "http://xxx.yyy.zzz.qqq/myWebService.php?name=" . $deviceName;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_USERAGENT, "My Inform Script / 1.0");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
// Let's set timeout to 10 seconds
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_exec($ch);
curl_close($ch);
您的php可能不在/ usr / bin / php5中,因此请确保通过输入php informWebService.php来更改或运行该脚本。这些脚本只是示例,您应该编辑它们以更好地适应您的解决方案。
答案 2 :(得分:0)
如果您因为某种原因无法让Raspberry Pis轮询服务,那么实际打开Pis端口的另一种方法是在路由器(或后面的某个地方)实施状态服务它可以打开一个端口来执行ping操作并通过外部PHP回答查询。
这样的服务可能就像ping所有Pis然后输出JSON的网页一样简单,或者是更复杂的代理,它回答有关特定Pi的查询(基本上通过路由器代理ping)。
当然,安全性也很重要。您应该设置 HTTPS (对于此类服务,自签名证书是完全正常的,因为它的唯一客户端在您的控制之下)。在HTTPS中,您可以使用基本身份验证或创建两个密钥对,并在两个PHP服务之间使用已签名的请求。