我有一个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脚本的精美迷你网络服务器?任何想法和代码示例都非常感谢,提前感谢!
答案 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)
...使用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;
<?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
的顶部(对于此示例)。