coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

PHPで、ソケット通信(UDP)をする。その2(複数のPCからAQUOSを制御する。)

2009-03-15 00:10:16 | php
前回、UDP通信のための用意ができたので、この間作った PHP プログラムを修正しました。remote-c.php を、remote-c-server.php と remote-c-client.php に分けます。

サーバ側 remote-c-server.php は以下のとおりです。ここで、
シリアルポートの名前は   COM2 、
サーバのIPアドレスは     192.168.1.216 、
ポート番号を             11223 、

としました。
<?php
 //
 // remote-c-server.php
 // Written by Espiya 2009-03-11
 // http://blog.goo.ne.jp/espiya
 //

 error_reporting(E_ALL | E_STRICT);

 $str = ser_version();
 echo "Version: $str";
 echo "\n";

 echo "Open port";
 ser_open('COM2', 9600, 8, 'None', 1, 'None');
 echo "\n";

 $str = ser_isopen();
 echo "Port: $str";
 sleep(1); 
 echo "\n";

 $str = ser_read(128);
 echo $str;
 sleep(1);
 echo "\n";

 echo "Ready\n";

 $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
 socket_bind($socket, '192.168.1.216', 11223);
 $from = "";
 $port = 0;

 $b_part = 0; 
 $comline = "null";
  while ( ($rec_len = socket_recvfrom($socket, $line, 8, 0, $from, $port )) == 8 ) {  
    if ($line != "null    ") {
       $comline = $line."\r";
    } else {
       break;
    }
    echo "$line\n";
    ser_write($comline);
    sleep(1); 
    echo "Answer\n";
    $str = ser_read(128);
    echo "$str";
    echo "\n";

    $a_part  = "null";
    $b_part  =  0;
    $comline = "null";
 }
 socket_close($socket); 
 echo "Close port";
 ser_close();
?>

このプログラムの終了は、クライアントから行うのが欠点です。また、セキュリティ的な考慮を全くしていませんので、このプログラムの動く PC にネットワーク的にUDPパケットが送れるコンピュータなら、我が家の AQUOS が制御できてしまいますね。

一応、ブロードバンドルータを使っているので、現状ではインターネットから制御はできません。

一方、クライアントの方 remote-c-client.php は、次のようになります。remote-c.phpを少し直しただけです。
<?php
 //
 // remote-c-client.php
 // Written by Espiya 2009-03-11
 // http://blog.goo.ne.jp/espiya
 //

 $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

 echo "\n";

 echo "Enter command\n";
 
 $b_part = 0; 
 $comline = "null";
  while ( ($line = trim(fgets(STDIN)) ) != "end" ) {  
    sscanf($line, "%s %d", $a_part, $b_part);
    // echo "A part: $a_part \n";
    // echo "B part: $b_part \n";
    if ( $b_part >= 0 && $b_part < 1000) {
      $data = sprintf("% -4d",$b_part);
      switch ($a_part) {
        case "off":
        case "power":
        case "p":
          if ( $b_part <=1 ) {
            $comline = "POWR0   ";
          }
          break;
        case "on":
          $comline = "POWR1   ";
          break;
        case "volume":
        case "vol":
        case "v":
          if ( $b_part > 0 && $b_part < 31 ) {
            $comline = "VOLM$data";
          } else {
            $comline = "VOLM????";
          }
          break;
        case "video":
          $comline = "IAVD5   ";
          break;
        case "tv";
          $comline = "ITVD0   ";
          break;
        case "ch":
          $comline = "CAIR$data";
          break;
        case "dch":
          switch ($b_part) {
            case 1 :
              $data = "11  ";
              break;
            case 3 :
              $data = "21  ";
              break;
            case 4 : 
              $data = "41  ";
              break;
            case 6 :
              $data = "61  ";
              break;
            case 8 :
              $data = "81  ";
              break;
            case 10 :
              $data = "51  ";
              break;
            case 12 :
              $data = "71  ";
              break;
          }
          $comline = "CTBD$data";
          break;
        case "digital":
          $comline = "IDEG0   ";
           break;
        case "mute":
          $comline = "MUTE0   ";
          break;
        case "stop":
          $comline = "null    ";
          break;
        case "help":
        case "h" :
        case "menu":
          echo "Command list(nn は数字)\n";
          echo "  on      : 電源を入れる。( power 1 も可 )\n";
          echo "  off     : 電源を切る。 ( power 0 も可 )\n";
          echo "  vol nn: ボリューム( 0から30まで、v も可 )\n";
          echo "  ch  nn:チャンネル( アナログにする )\n";
          echo "  dch nn:チャンネル( デジタルにする )\n";
          echo "  video  :ビデオにする。\n";
          echo "  tv   :テレビにする。\n";
          echo "  mute  :消音(トグルスィッチ)\n";
          echo "  help  :このヘルプ( menu も可 )\n";
          echo "  end   :プログラムを終了する。\n";
          echo "  stop  :サーバを停止して終了する。\n";
          break;
      }
    }

    if ($comline != "null") {
      socket_sendto($sock,$comline, 8, 0, '192.168.1.216', 11223);
      if ($a_part == "stop") {
        break;
      }
    }
    echo "\n";

    $a_part  = "null";
    $b_part  =  0;
    $comline = "null";
 }
 
 echo "\n";
 echo "Close socket";
 socket_close($sock);
?>

これでようやく PHP で、AQUOSテレビのリモコンができました。どの PC からも AQUOS が制御できてすごく便利です。(本人だけ)

PHPですから、coLinux の Apache を使って、適当にプログラムを組めば、Webページからテレビの制御ができますね。その場合は、ソケットを create したままにするか、毎回 create するかの考察が必要です。socket_close が処理が遅いような気がしますが、気のせいかもしれません。

また、PHP もスクリプト言語として、コマンドにも立派に利用できました。ちょっと使った感じですが、大体のことはプログラムできてしまうのではないでしょうか。しかもかなりお気楽に作れますね。Web用のプログラミング言語とか、httpサーバ上で動くとか決め付けるのは、正しくないことだけは良く分かりました。

長いこと PHP を見てきましたが、シリアルポートとUDP通信も扱えることができました。今回で一応終わりです。ちょっとマイナーな話題でしたね。

それにしても、goo のブログ編集画面ですが、投稿後修正しようとすると、< , > , & , " , \ などの文字が消えてしまうので今回の投稿のようなプログラムを書くと、修正が非常に困難になってしまいます。多少の間違いはご容赦ください。一番良さそうなのは、コメントにて指摘していただき、そのうち修正するということですが。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする