パソコンで電源スイッチを操作する方法その2
2002/10/3作成
④JAVAで動かす
インターネットブラウザで動かすことは簡単にできますが、それでは物足りません。「スイッチを押す」動作が「マウスのボタンを押す」に変わっただけです。プログラムを組み立てて、思いどうりに操作したいものです。 JAVA 楽天 でPICNICと通信してみましょう。
ステップ1 Url.java
まず、特定のURLと通信するclassを作りました。DOS窓から java url http://192.168.0.200/ と実行すると、PICNICからの返事が帰ってきます。
引数をhttp://192.168.0.200/modify.cgi?RB7=H にするとRB7端子がHighになり、LEDが点灯します。この端子にスイッチがついていればスイッチONになります。
http://192.168.0.200/modify.cgi?RB7=L とすると...消灯です。
ちなみにhttp://yahoo.co.jp/ なんてすると、ヤフーからの返事が返ってきます。(意味ないけど)。
package tomolib.net;
import java.net.*; import java.util.*; import java.io.*;
import tomolib.util.*; /** * 虎ス名:Url <BR> * 処理概要:w定したURLからDATAを受け取るく<BR> * 履歴: <BR> * 2002/10/1製作<BR> */ public class Url {
/**このクラスの動作詞ア*/ public static void main( String argv[] ) { String url = argv[0]; Url u = new Url(); String stmp = u.get( url); System.out.println( stmp ); TextFile t = new TextFile(); t.OutOpen( "url.txt" ); t.Write( stmp ); t.OutClose(); }
public Url(){ //System.out.println("初期化"); }
/** * 區・゙:public String get( String surl)<BR> * 引数:surl dataを受け取るURL http://***.com/ 等<BR> * 機能:urlからdataを受け取る<BR> * 返り値:ッ取ったdataの文字列<BR> */ public String get( String surl) { String line = null; String stmp = null; try { URL url = new URL( surl ); Object content = url.getContent(); if( content instanceof InputStream ) { BufferedReader reader= new BufferedReader(new InputStreamReader( (InputStream)content ) ); while( ( stmp = reader.readLine() ) != null ) { line = line + "\r\n"+ stmp; } reader.close(); }else{ System.out.println( "Content is " + content.toString() ); } } catch( ArrayIndexOutOfBoundsException e ){ System.err.println( "Usage: java URLContent urlname" ); } catch( IOException e ){ System.err.println( "IO Error" ); return "IO ERR"; } return line; }
}
|
ステップ2 Picnic.java
Url.javaは汎用性がありすぎるので、PICNIC専門に通信するにはちょっと使いづらいです。そこで、Url.Javaを土台にしてPICNIC通信用のClassを作ってみましょう。一部文字化けしているけど、気にしないでね。
このCLASS中のgetOndoメソッドを使うと、PICNICから気温情報を受け取ることができます。setOutPortメソッドを使えば任意の出力端子を操作できるようになります。
package tomolib.picnic;
import tomolib.net.*; /** * 虎ス名:Picnic <BR> * 処理概要:Picnicと通信するclass<BR> * 2002/10/1製作<BR> */ public class Picnic {
Url url = new Url();
/**このクラスの動作詞ア*/ public static void main( String argv[] ) { Picnic p = new Picnic(); System.out.println( "気温: " + p.getOndo("http://192.168.0.200/") + " 度" ); int I = p.setOutPort("http://192.168.0.200/", "RB6", "H"); if( I==0 ){System.out.println( "成功");}else{System.out.println( "ク敗");} I = p.setOutPort("http://192.168.0.200/", "RB6", "L"); if( I==0 ){System.out.println( "成功");}else{System.out.println( "ク敗");} }
/** * 區・゙:public int getOndo( String surl)<BR> * 引数:surl dataを受け取るURL http://***.com/ 等<BR> * 機能:Picnicから温度DATAを受け取る<BR> * 返り値:温度<BR> */ public int getOndo( String surl) { int ondo = 0; String stmp = url.get( surl ); if( stmp == null ){ return -100; } int itmp = stmp.indexOf( "Celsius" ); if( itmp < 3){return -100;} //System.out.println( stmp.substring( itmp-3 , itmp-1 ) + "'" ); ondo = Integer.parseInt( stmp.substring( itmp-3 , itmp-1 ) ); return ondo; }
/** * 區・゙:public int setOutPort( String surl, String port , String lh)<BR> * 引数:surl dataを受け取るURL http://***.com/ 等<BR> * 引数:RB4~RB7<BR> * 引数:lh LまたはH<BR> * 機能:PicnicのOUTPORTのLHを設定する<BR> * 返り値:0:設定成功 -1:設定失敗<BR> */ public int setOutPort( String surl, String port , String lh) { //http://192.168.0.200/modify.cgi?RB1=H String stmp = surl + "modify.cgi?" + port + "=" + lh ; String stmp2 = url.get( stmp ); String stmp3 = null; if( lh.equals("H") ){ stmp3 = "<INPUT TYPE=\"submit\" NAME=\"" + port + "\" VALUE=\"H\"> High"; }else{ stmp3 = "<INPUT TYPE=\"submit\" NAME=\"" + port + "\" VALUE=\"H\"> Low"; } if( stmp2.indexOf( stmp3 ) < 0){ return -1; } return 0; }
public Picnic(){ //System.out.println("初期化"); }
}
|
ステップ3 PicnicFrame.java
ここまでのプログラムは窓が開かないので、人間が操作するには大変です。そこで作ったのがPicnicFrame.java。これを実行すると下のような窓が開きます。ボタン楽天 を押すことで先に作ったPicnicのメソッドを実行することができるようになります。
/* * PicnicFrame.java * * Created on 2002/10/01, 20:35 */
package tomolib.picnic;
/** * * @author Administrator */ public class PicnicFrame extends javax.swing.Jframe { tomolib.picnic.Picnic picnic = new tomolib.picnic.Picnic();
/** Creates new form PicnicFrame */ public PicnicFrame() { initComponents(); setSize(200,200); }
/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents jTextField1 = new javax.swing.JTextField(); jPanel1 = new javax.swing.Jpanel(); jLabel1 = new javax.swing.Jlabel(); jButton1 = new javax.swing.Jbutton(); jLabel2 = new javax.swing.Jlabel(); jButton2 = new javax.swing.Jbutton(); jLabel3 = new javax.swing.Jlabel(); jButton3 = new javax.swing.Jbutton(); jLabel4 = new javax.swing.Jlabel(); jButton4 = new javax.swing.Jbutton();
addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } });
jTextField1.setText("http://192.168.0.200/"); getContentPane().add(jTextField1, java.awt.BorderLayout.NORTH);
jPanel1.setLayout(new java.awt.GridLayout(4, 2));
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setText("RB4"); jPanel1.add(jLabel1);
jButton1.setText("L"); jButton1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { jButton1MouseReleased(evt); } });
jPanel1.add(jButton1);
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setText("RB5"); jPanel1.add(jLabel2);
jButton2.setText("L"); jButton2.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { jButton2MouseReleased(evt); } });
jPanel1.add(jButton2);
jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel3.setText("RB6"); jPanel1.add(jLabel3);
jButton3.setText("L"); jButton3.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { jButton3MouseReleased(evt); } });
jPanel1.add(jButton3);
jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel4.setText("RB7"); jPanel1.add(jLabel4);
jButton4.setText("L"); jButton4.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseReleased(java.awt.event.MouseEvent evt) { jButton4MouseReleased(evt); } });
jPanel1.add(jButton4);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
pack(); }//GEN-END:initComponents
private void jButton4MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton4MouseReleased // 処理コードをここに追加します: if( jButton4.getLabel().equals("L")){ picnic.setOutPort(jTextField1.getText(), "RB7", "H"); jButton4.setLabel("H"); }else{ picnic.setOutPort(jTextField1.getText(), "RB7", "L"); jButton4.setLabel("L"); } }//GEN-LAST:event_jButton4MouseReleased
private void jButton3MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton3MouseReleased // 処理コードをここに追加します: if( jButton3.getLabel().equals("L")){ picnic.setOutPort(jTextField1.getText(), "RB6", "H"); jButton3.setLabel("H"); }else{ picnic.setOutPort(jTextField1.getText(), "RB6", "L"); jButton3.setLabel("L"); } }//GEN-LAST:event_jButton3MouseReleased
private void jButton2MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton2MouseReleased // 処理コードをここに追加します: if( jButton2.getLabel().equals("L")){ picnic.setOutPort(jTextField1.getText(), "RB5", "H"); jButton2.setLabel("H"); }else{ picnic.setOutPort(jTextField1.getText(), "RB5", "L"); jButton2.setLabel("L"); } }//GEN-LAST:event_jButton2MouseReleased
private void jButton1MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton1MouseReleased // 処理コードをここに追加します: if( jButton1.getLabel().equals("L")){ picnic.setOutPort(jTextField1.getText(), "RB4", "H"); jButton1.setLabel("H"); }else{ picnic.setOutPort(jTextField1.getText(), "RB4", "L"); jButton1.setLabel("L"); } }//GEN-LAST:event_jButton1MouseReleased
/** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm System.exit(0); }//GEN-LAST:event_exitForm
/** * @param args the command line arguments */ public static void main(String args[]) { new PicnicFrame().show(); }
// 変数宣言 - 編集不可//GEN-BEGIN:variables private javax.swing.Jlabel jLabel4; private javax.swing.Jbutton jButton2; private javax.swing.Jlabel jLabel1; private javax.swing.Jlabel jLabel3; private javax.swing.Jlabel jLabel2; private javax.swing.Jbutton jButton1; private javax.swing.Jbutton jButton3; private javax.swing.Jpanel jPanel1; private javax.swing.Jbutton jButton4; private javax.swing.JTextField jTextField1; // 変数宣言の終わり//GEN-END:variables
}
|
ステップ4 PicnicTimer.java
先に作ったPicnicFrame、結局ブラウザを使うのとかわりがありませんね。今度は設定時刻になったらON/OFFするClassを作りましょう。これはウィンドウが開かないので、DOS窓から実行します。実行は↓
c:\j2sdk1.4.0_02\bin\java.exe tomolib.picnic.PicnicTimer http://192.168.0.200/ 20:22:00 RB7 H 20:22:05 RB7 L
というようにDOS窓にインプットします。
package tomolib.picnic;
import tomolib.picnic.*; import tomolib.util.*; /** * 虎ス名:PicnicTimer <BR> * 処理概要:設定時刻にPicnicのポートへの出力を変える<BR> * 2002/10/1製作<BR> */ public class PicnicTimer implements Runnable { Thread timer; Picnic picnic = new Picnic(); Util util = new Util(); //21:12:56 String url; String jikoku[] ; String port[] ; String conf[] ; boolean flug[] ; int nos=0;
/**このクラスの動作詞ア*/ public static void main( String argv[] ) { PicnicTimer p = new PicnicTimer(); int itmp = 0; int itmp2 = 1; //System.out.println( "" + argv.length + " " + (int)(argv.length/3)); p.url = argv[0]; p.jikoku = new String[ (int)(argv.length/3) ]; p.conf = new String[ (int)(argv.length/3) ]; p.port = new String[ (int)(argv.length/3) ]; p.flug = new boolean[ (int)(argv.length/3) ]; while( itmp2 < argv.length ) { p.jikoku[itmp] = argv[ itmp2 ]; itmp2++; p.port[itmp] = argv[ itmp2 ]; itmp2++; p.conf[itmp] = argv[ itmp2 ]; itmp2++; p.flug[itmp] = false; p.nos ++ ; itmp++; } p.timer.start(); }
public void doSet(int I) { System.out.print( util.stringNow3() +" "+ jikoku[I] +" "+ url +" "+ port[I] +" "+ conf[I] ); int ii = picnic.setOutPort(url, port[I], conf[I]); if( ii==0 ){System.out.println( " : 成功");}else{System.out.println( " : ク敗");} }
//一定時間ごとの処理 public void run() { while(true){try{ timer.sleep(300);}catch(InterruptedException e){} String now = util.stringNow3(); //System.out.println( now +" "+ nos ); for( int I=0; I<nos; I++) { //System.out.print( jikoku[I]); if( now.indexOf( jikoku[I] ) > 0 ){ if( flug[I] == false ){ doSet( I ); flug[I] = true; } }else{ flug[I] = false; } } //if( I==0 ){System.out.println( "成功");}else{System.out.println( "ク敗");} } }
public PicnicTimer() { timer = new Thread(this); //timer.start(); }
} |
おわりに...
このシステムは自作の天体カメラの電源を自動でON/OFFするために作りました。平日は家にいないの場合が多いので、こういうのがあると助かります。家には別に自動水やり器があるのですが、将来は水やりもこのシステムに載せかえようと思っています。プログラムを作ればインターネットやメールを使って家の機器を操作することもできるようになります。これを使って、いろいろ遊べそうです。
*ご注意
このページに載せたプログラムは私のパソコンの設定になっているので、部分的に修正しないと動かないと思います。ご注意ください。また、ここに記載していない自作Classが必要な個所があります。
おわり
最終更新日: 2002-10-03 00:00:00