2008年08月11日

家電の電源をネットワーク越しに操作できるようにした(主なソース・コード)

Web拍手:


http://cancoffee2.at.webry.info/200808/article_64.html
↑「家電の電源をネットワーク越しに操作できるようにした」の主なソース・コード.
試しに書いた,ごみコード入り(^^;).


-------------
index.cgi

#!/usr/bin/perl

use CGI;
require 'knlib.pl';
require 'xport.pl';


#======
# Main
#======
my $form = new CGI;
$cmd = $form->param('cmd');
$on_off[0] = $form->param('on_off0');
$on_off[1] = $form->param('on_off1');
$on_off[2] = $form->param('on_off2');

@item_name= (
"明かり",
"クーラー",
"こたつ"
);

$htmldata = "";

$htmldata .= knlib::get_html("Header_np.html");

# 出力/入力設定を "出力" に設定
if (xport::get_direction(0) != 0x07) {
$htmldata .= "set dir: " . xport::set_direction(0, 0x07) . "
\n";
}

# "On" にしたときに,ロジック "H" になるように設定
if (xport::get_activeHL(0) != 0x07) {
$htmldata .= "set HL: " . xport::get_activeHL(0, 0x07) . "
\n";
}


# コマンド実行
if ($cmd eq "exec"){
for (my $i=0; $i < 3; $i++){
if ($on_off[$i] eq "on"){
if (xport::get_on_off_stat($i+1, 0) == 0x00) {
xport::set_on_off_stat($i+1, 1);
}
}else{
if (xport::get_on_off_stat($i+1, 0) != 0x00) {
xport::set_on_off_stat($i+1, 0);
}
}
}
}



# 現在状態を表示

# 現在時刻
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$nowtime = sprintf("%04d-%02d-%02d %02d:%02d:%02d",
$year+1900, $mon+1, $mday, $hour, $min, $sec);
$htmldata .= $nowtime . "
\n";


$htmldata .= "
";
$htmldata .= "\n";

for (my $i=0; $i < 3; $i++){
$htmldata .= "\n";
$htmldata .= " \n";
$htmldata .= " ";
$htmldata .= "\n";
}

$htmldata .= "
$item_name[$i]";
$on_off_stat[$i] = xport::get_on_off_stat($i+1, 0);
$ackey = $i*3+1;
if ($on_off_stat[$i] != 0){
$htmldata .= "[$ackey]On \n";
$ackey += 2;
$htmldata .= "[$ackey]Off\n";
}else{
$htmldata .= "[$ackey]On \n";
$ackey += 2;
$htmldata .= "[$ackey]Off \n";
}
$htmldata .= "
\n";


$htmldata .= "";
$htmldata .= "\n";


$htmldata .= "
";

$htmldata .= knlib::get_html("Footer.html");


# HTTP ヘッダを付加して HTML を出力する
print "Content-type: text/html; charset=utf-8\n";
# print "Content-type: text/html; charset=EUC-JP\n\n";
print "Content-length: ", length($htmldata), "\n";
# print "Content-length: ", 1504, "\n";
print "\n"; # 改行 2 個は,HTTP ヘッダの終わりで必須

print $htmldata;

1;



-------------
xport.pl

#!/usr/bin/perl

package xport;

use strict;
use warnings;
use IO::Socket;


# my @ds0 = (0x11, 0x07,0x00,0x00,0x00, 0x02,0x00,0x00,0x00);
# my $sRes = con(@ds0);
# my @ds0;


# print &get_direction(0) . "\n";
# print &set_direction(0, 0x07) . "\n";
# print &get_activeHL(0) . "\n";
# print &get_on_off_stat(0) . "\n";
# print &set_on_off_stat(1, 1) . "\n";
# print &get_on_off_stat(0) . "\n";
# print &set_on_off_stat(0, 0) . "\n";

# exit;


sub exec_cmd {
(my $cmd, my $port, my $stat) = @_ ;

my $cmd_port = $port;
my $cmd_stat = $stat;
if ($port == 0) {
$cmd_port = 0x07;
}elsif ($port == 1) {
$cmd_port = 0x01;
}elsif ($port == 2) {
$cmd_port = 0x02;
}elsif ($port == 3) {
$cmd_port = 0x04;
}else{
$cmd_port = 0x00;
}

if ($stat != 0) {
$cmd_stat = $cmd_port;
}

my $sRes = con(($cmd, $cmd_port,0x00,0x00,0x00, $cmd_stat,0x00,0x00,0x00));

# return unpack("H*", $sRes);
# return unpack("x1H2", $sRes);

$stat = unpack("x1H2", $sRes);


if ($port != 0){
if ($stat & $cmd_port) {
return 1;
}else{
return 0;
}
}else{
return $stat;
}

}


sub get_direction {
(my $port) = @_ ;

return xport::exec_cmd(0x11, $port, 0x00);
}


sub set_direction {
(my $port, my $stat) = @_ ;

return xport::exec_cmd(0x19, $port, $stat);
}



sub get_activeHL {
(my $port) = @_ ;

return xport::exec_cmd(0x12, $port, 0x00);
}

sub set_activeHL {
(my $port, my $stat) = @_ ;

return xport::exec_cmd(0x1a, $port, $stat);
}



sub get_on_off_stat {
(my $port) = @_ ;

return xport::exec_cmd(0x13, $port, 0x00);
}


sub set_on_off_stat {
(my $port, my $stat) = @_ ;

return xport::exec_cmd(0x1b, $port, $stat);
}


# 送受信
sub con
{
my $sock = IO::Socket::INET->new(
PeerAddr => '192.168.0.13',
PeerPort => '30704',
Proto => 'tcp');
$sock->send(pack('C*', @_));
$sock->flush();

my $res;
read($sock, $res, 5);
$sock->close();
return $res;
}

1;


--

あー,やっぱり <code> で囲むだけだと,インデントが悲惨なことになるなぁ.
タブが無効になって,空白文字は有効なのかな?
あと,コード中のいくつかの HTML タグが HTML タグとして働いちゃうので,それの影響もあるなぁ.
<pre> が使えれば,もうちょっとマシなんだけどなぁ.

google-code-prettify を,仕込めるものなら仕込みたいなぁ.

==

ColdFire で,これをやるとしたら
http://cancoffee2.at.webry.info/200808/article_65.html

家電の電源をネットワーク越しに操作できるようにした
http://cancoffee2.at.webry.info/200808/article_64.html

google-code-prettify
http://cancoffee2.at.webry.info/200808/article_61.html

--
【コンピュータの最新記事】
posted by NOIKE at 21:47 | Comment(0) | TrackBack(9) | コンピュータ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

継続しようか迷い中(^^;)
Excerpt: 万が一,火事にでもなったらやイヤだなぁ,などとちょっと心配になってきていて,継続しようかどうか迷い中です(^^;). 便利ではあるのだけどね. --
Weblog: とりあえずコーヒーを飲もう
Tracked: 2008-11-07 13:21

Interface 2008 年 10 月号
Excerpt: あ,新しい Interface が,もう出ている. 先月号の ColdFire 基板のさらなる使い方だな. GCC とか TOPPERS とか,そのへん. --
Weblog: とりあえずコーヒーを飲もう
Tracked: 2008-11-07 14:04

ネットワーク対応震度計
Excerpt: Yureプロジェクト http://weathernews.jp/yure/#/yure/p=map/ --
Weblog: とりあえずコーヒーを飲もう
Tracked: 2008-11-07 14:17

鋼の錬金術師のアニメの新シリーズが
Excerpt: 鋼の錬金術師のアニメの新シリーズが始まるらしい.ほほー. http://www.sonymusic.co.jp/Animation/hagaren/ --
Weblog: とりあえずコーヒーを飲もう
Tracked: 2008-11-07 14:21

蒼黒の餓狼 北斗の拳 レイ外伝 (3)
Excerpt: ついでに,「蒼黒の餓狼 北斗の拳 レイ外伝 (3)」も買ってしまおう. レイ外伝は,私が行く中古屋では見かけないんだよなぁ. トキ外伝は,またの機会に. --
Weblog: とりあえずコーヒーを飲もう
Tracked: 2008-11-07 14:23

Interface の 1月号は,買っておくか
Excerpt: ColdFire活用新連載! ColdFireマイコン基板搭載CインタプリタSilentC活用テクニック(第2回)  &gt;&gt;ネットワーク経由でWAVファイルを送信して音楽を再生しよう(PDF..
Weblog: とりあえずコーヒーを飲もう
Tracked: 2008-11-26 11:56

ご到着: Interface 2009 年 1 月号
Excerpt: 午前 9 時にご到着: Interface 2009 年 1 月号 箱買いした缶コーヒーも,同時にご到着. 空になった箱と入れ替える. 部屋の空き空間に変化なし. --
Weblog: とりあえずコーヒーを飲もう
Tracked: 2008-11-30 13:40

こたつをつけた.
Excerpt: こたつをつけた. --
Weblog: とりあえずコーヒーを飲もう
Tracked: 2009-11-04 00:52

ごもっともです.
Excerpt: http://appeltaart.mine.nu/wiki/index.php/XPort_GPIO_from_Perl --
Weblog: とりコー
Tracked: 2009-11-17 02:49