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

时间:2014-12-05 17:31:17

标签: linux shell http webserver raspberry-pi

我有一个Raspberry Pi,我用它作为DLNA,CIFS,VPN等多功能24/7设备。现在我买了一个TellStick,这是一个可以向无线电源开关发送433MHz无线电命令的USB设备, dimmers等。制造商为linux提供了源代码和工具,这非常棒,顺便说一句。

使用特殊命令(名为tdtool)我可以向电源开关发送命令,例如

tdtool --on 1

这会打开设备1.这非常有效且稳定,所以我想摆脱shell命令以便更轻松地处理。我的想法是建立一个非常简单的Web服务器,只需要能够接收GET或POST请求,并触发一些操作,如运行命令“tdtool --off 3”。因此,Web服务器甚至不需要提供页面,它只需要监听请求。

我想创建一个基于HTTP的解决方案,因为这样我就可以将智能手机用作遥控器。有一个名为“Tasker”的Android应用程序本身很棒,但它也允许根据特定条件发送自定义的HTTP请求,以便我回家时可以使我的灯光变亮(并且Tasker识别出与我的连接) WIFI网络或类似网站。

由于Raspberry不是最强大的硬件,我希望尽可能保持简单。基本上,我需要这个:

HTTP get请求进来,例如:

/switch?device=1&action=on

根据此请求,服务器应将以某种方式转换为:

tdtool --on 1

我确信我会找到一种方法来使用Apache和PHP构建类似的东西,但我认为在我的情况下会有点过分。你会推荐什么?是否有一些很酷的蟒蛇魔法能够实现这一目标?或者一些带有CGI脚本的精美迷你网络服务器?任何想法和代码示例都非常感谢,提前感谢!

2 个答案:

答案 0 :(得分:1)

虽然你的问题太过像#34;意见如何",但这是一个近乎即时的解决方案:

nginx - How to run a shell script on every request?

但是既然你在谈论R-Pi,也许你会发现Python内置CGIHTTPServer(Python 2)或http.server(Python 3)模块更适合执行任务一个shell命令

答案 1 :(得分:1)

这里有一个完整的&使用RealLife™perl的例子

...使用Dancer

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

现在您可以调用网址

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 server,并且脚本switch.php位于DocumentRoot的顶部(对于此示例)。