Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

JavaでPICNIC

同僚の先生からPICNICについて教えてもらいました。Visual Basicのプログラムも見せてもらったのですが,PICNIC搭載の温度センサーの値も簡単に取ってこれるんですね。便利だなぁと感心してしまいました。

しかし,Visual Basicは勉強したことがないので,Javaで温度を計測するプログラムを作ってみようと思い以下のようなプログラムを作成しました。サーバ室の温度を計測するものです。以下のサイトを参考にさせていただきました。

/**
 *  Picnic.java:
 */
import java.io.*;
import java.net.*;
import java.util.*;

public class Picnic {
    InetAddress sAddr;
    DatagramSocket soc;
    DatagramPacket sendPacket,recvPacket;
    int port;
    byte[] buf = new byte[8];
    Map raMap = new HashMap();

    public Picnic(String ipaddr,int port){
	this.port = port;
	try {
	    sAddr = InetAddress.getByName(ipaddr);	    
	    soc = new DatagramSocket();

	    // RA0->0x81, RA1->0x89, RA2->0x91, RA3->0x99, RA4->0xa1
	    raMap.put("RA0",(byte)0x81);
	    raMap.put("RA1",(byte)0x89);
	    raMap.put("RA2",(byte)0x91);
	    raMap.put("RA3",(byte)0x99);
	    raMap.put("RA4",(byte)0xa1);
	} catch (UnknownHostException e){
	    e.printStackTrace();
	} catch (SocketException e){
	    e.printStackTrace();
	}
    }

    public int getADC(String ra,byte wait){
	byte[] cmd = new byte[3];
	cmd[0] = (byte)0x04;
	cmd[1] = ((Byte)raMap.get(ra)).byteValue();
	cmd[2] = wait;
	try {
	    sendPacket = new DatagramPacket(cmd,cmd.length,sAddr,port);
	    recvPacket = new DatagramPacket(buf,buf.length);
	    soc.send(sendPacket);
	    soc.receive(recvPacket);
	} catch (SocketException e){
	    e.printStackTrace();
	} catch (IOException e){
	    e.printStackTrace();
	} 
	return ((buf[4] << 8) | buf[5]);
    }

    public int getTemp(){
   	return (int)Math.ceil(getADC("RA4",(byte)0x00) * 500.0 / 1024.0 + 0.5);
    }

    public void close(){
	soc.close();
    }

    public static void main(String argv[]){
	Picnic pic = new Picnic("10.10.20.126",10001);
	System.out.println("Server Room Temp: " + pic.getTemp());
	pic.close();		
    }
}