什么是接收 HTTP GET 请求并触发动作的最简单方法?

3
我有一个树莓派,我用它作为24/7的多用途设备,用于DLNA、CIFS、VPN等。现在我买了一个TellStick,这是一个USB设备,可以发送433MHz无线电命令到无线电源开关、调光器等。制造商提供了Linux的源代码和工具,这真的很好,顺便说一句。
使用特殊命令(名为tdtool),我可以向我的电源开关发送命令,例如:
tdtool --on 1

这将开启设备1。这很有效和稳定,所以我想摆脱shell命令以使处理更加容易。我的想法是设置一个非常简单的Web服务器,只需要能够接收GET或POST请求并触发某些操作,例如运行命令“tdtool --off 3”。因此,Web服务器甚至不需要提供页面,它只需要监听请求。
我想创建一个基于HTTP的解决方案,因为这样可以让我使用智能手机作为遥控器。有一个名为“Tasker”的Android应用程序,它本身就很棒,但它还允许基于某些条件发送自定义的HTTP请求,因此当我回家时(并且Tasker识别到连接到我的WIFI网络或类似情况),我可以让我的灯光变亮。
由于树莓派不是最强大的硬件,我希望尽可能保持简单。基本上,我需要这个:
当HTTP GET请求进来时,例如:
/switch?device=1&action=on

根据此请求,服务器应该将“somehow”翻译成以下内容:
tdtool --on 1

我相信用Apache和PHP我可以找到一种构建类似东西的方式,但我认为这对我来说有点过于复杂了。你有什么推荐吗?有没有一些神奇的Python技巧可以实现这个功能?或者有一些带有CGI脚本的花哨迷你Web服务器吗?非常感谢任何想法和代码样例,提前致谢!

3个回答

2

1

这里是一个完整且可用的RealLife™ Perl示例

...使用Dancer

# cpan Dancer
$ dancer -a MyApp
$ cd MyApp
$ cat ./lib/MyApp.pm # need to be edited, see bellow
$ bin/app.pl

现在您可以调用URL。
http://127.0.0.1:3000/switch?device=1&action=on

$cmd 现在将被执行。

./lib/MyApp.pm :

package MyApp;
use Dancer ':syntax';

our $VERSION = '0.1';

get '/switch' => sub {
    my $var = params;
    my $device = $var->{device};
    my $action = "--" . $var->{action};
    # building custom system command
    my $cmd = "tdtool $action $device";
    # running the command
    `$cmd`;

    return "$cmd\nexecuted\n";
};

true;

这是另一个使用的完整且可用的RealLife™示例

<?php

header("HTTP/1.1 200 OK");
if (isset($_REQUEST['action'], $_REQUEST['device'])) {
    $device = $_REQUEST['device'];
    $action = '--' . $_REQUEST['action'];
    $cmd = "tdtool $action $device";
    system("$cmd");
    echo "Command<br>$cmd<br>executed...";
}
?>

网址是:

http://127.0.0.1/switch.php?device=1&action=on

这需要一个监听端口80的HTTP服务器,并且脚本switch.php必须位于您的DocumentRoot顶部(针对此示例)。

1
要打开一个HTTP API服务器,你必须安装和配置一些工具(如nginx、dancer或php),或者自己编写一个Python/Perl脚本。这两种方法都需要时间。
但是,如果你想付出更少的努力来获得一个可用的解决方案,你可以简单地使用netcat。
while true; do
  echo SFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LUxlbmd0aDogMw0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQpDb25uZWN0aW9uOiBDbG9zZWQNCg0KbmlsDQo= | nc -l 8881 | grep GET
  # The output looks like: GET /switch?device=1&action=on HTTP/1.1
  # parse the received string and run your tdtool
done

如果有人访问http://127.0.0.1:8881/switch?device=1&action=onnc将打印出来并运行你的脚本。
HTTP请求会失败,但谁在乎呢?你的tdtool命令已经启动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接