【问题标题】:What is the easiest way to receive an HTTP GET request and trigger an action?接收 HTTP GET 请求并触发操作的最简单方法是什么?
【发布时间】:2014-12-06 13:21:54
【问题描述】:

我有一个 Raspberry Pi,用作 DLNA、CIFS、VPN 等的多用途 24/7 设备。现在我买了一个 TellStick,这是一个可以向无线电源开关发送 433MHz 无线电命令的 USB 设备,调光器等。制造商提供 linux 的资源和工具,这真的很棒,顺便说一句。

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

tdtool --on 1

这会打开设备 1。它运行良好且稳定,因此我想摆脱 shell 命令以使处理更容易。我的想法是设置一个非常简单的 Web 服务器,它只需要能够接收 GET 或 POST 请求并触发一些操作,例如运行命令“tdtool --off 3”。所以网络服务器甚至不需要服务页面,它只需要监听请求。

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

由于 Raspberry 不是最强大的硬件,我想让事情尽可能简单。基本上,我需要这个:

一个HTTP get请求进来,例如:

/switch?device=1&action=on

根据这个请求,服务器应该将不知何故翻译成这样:

tdtool --on 1

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

【问题讨论】:

    标签: linux shell http webserver raspberry-pi


    【解决方案1】:

    虽然您的问题太“像意见”,但有一个几乎立竿见影的解决方案:

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

    但既然你说的是 R-Pi,也许你会发现 Python builtin CGIHTTPServer (Python 2) 或 http.server (Python 3) 模块更适合执行 shell 命令的任务

    【讨论】:

      【解决方案2】:

      这里有一个完整且有效的 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 server 绑定,并且脚本 switch.php 位于 DocumentRoot 的顶部(对于本示例)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 2020-07-11
        • 2017-10-04
        相关资源
        最近更新 更多