2008年12月24日水曜日

SunSPOTでユニキャスト

なんか,SunSPOT-Basestation間でユニキャストができないという報告があったので,試してみた.
(SunSPOTいじるの久しぶりなので,不備があったら突っ込みお願いします)

まずは,ソース(ソースが長くならないようにシンプルなものを載せています).

サンスポット側


package net.java.dev.netbeansspot;

import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.Utils;
import javax.microedition.io.*;
import javax.microedition.midlet.*;

public class Application extends MIDlet {
private final String PROTOCOL = "radiogram://0014.4F01.XXXX.XXXX:67";// べた書きだっせ~
protected void startApp() throws MIDletStateChangeException {
RadiogramConnection rCon = null;// 通信用クラス
Datagram dg;// データグラム
try {
rCon = (RadiogramConnection) Connector.open(PROTOCOL); // 回線開いて
dg = rCon.newDatagram(rCon.getMaximumLength());// データグラム作って
while (true) {// 無限ループ!!
dg.reset();
dg.writeUTF("Hello SunSPOT!!");
rCon.send(dg);
System.out.println("hoge");
Utils.sleep(2000);
}
} catch (Exception e) {
System.err.println("Caught " + e + " in connection initialization.");
System.exit(1);
}
}
protected void pauseApp() {
// This is not currently called by the Squawk VM
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
// TODO
}


ホスト側


package net.java.dev.netbeansspot;

import com.sun.spot.io.j2me.radiogram.*;
import javax.microedition.io.*;

public class SunSpotHostApplication {
private static final int HOST_PORT = 67; // port指定
// 通信部
private void run() throws Exception {
// 前準備
RadiogramConnection rCon; // コネクション
Datagram dg;// データグラム
try {
rCon = (RadiogramConnection) Connector.open("radiogram://:" + HOST_PORT);
dg = rCon.newDatagram(rCon.getMaximumLength());
} catch (Exception e) {
System.err.println("setUp caught " + e.getMessage());
throw e;
}
// データ受信&&表示を行うループ
while (true) {
try {
rCon.receive(dg);// 受信
String addr = dg.getAddress(); // 送信元を取り出して
String msg = dg.readUTF(); // メッセージを取り出して
System.out.println(addr + ":" + msg);// 表示
} catch (Exception e) {
System.err.println("Caught " + e);
throw e;
}
}
}
// main
public static void main(String[] args) throws Exception {
SunSpotHostApplication obj = new SunSpotHostApplication();
obj.run();
}
}


実行結果


きれいに載せるの面倒なので,デスクトップのキャプチャで.





普通に動いた...

少し考察


今回は,BaseStationもSunSPOTも両方ケーブルにつないだ状態で行った.
これは,BaseStationを使ってリモートでSunSPOTにアプリケーションを配置・実行してしまうと,最初のオープンで失敗するからです.というのは,(適当に書いたソースなモンで)SunSPOT側のアプリは起動後すぐにBaseStationに対して接続を試みますが,BaseStationはリッスンになっていないので余裕でこけるのです.
即ち,アプリを実行する順番は(エラー処理をちゃんと書かないのであれば)
BaseStation→SunSPOTであるべきです.

要するに,回線を開くタイミングや,回線が落ちた時の処理,エラー処理などもうちょっと複雑な処理を入れてあげないとねってコトです.

(ちなみに,今回のソースで,通信が成功している状態で突然ホストアプリを止めるとSunSPOTはどんな挙動を示すでしょう??)

3 件のコメント:

うおーん さんのコメント...

初コメントです。現在学校でSunSPOTを扱っています。課題として、sunspotのセンサの精度を調べなさいと言われました。
質問なのですが、何か良い方法はありませんか?
よろしかったら、検討ください。

taka さんのコメント...

>うおーんさん

コメントありがとう御座います.
センサの精度という言葉をどういった意味で使われているのかちょっとわかりませんが,SunSPOTで取得可能な温度などがどの程度信頼できるかという意味でしょうか?
例えば,正確な温度計を買ってきてSunSPOTで取れる値と比較するとか?
あとは,公式のドキュメントを読み込むとかでしょうか??

大した答えになってなくてすいません.

うおーん さんのコメント...

そんな感じですよね。
距離とかをsunspotを用いて計り、それがどの程度の精度があるか
みたいなものです。

あとひとつ質問ですが、
例えば、加速度を測定する際、
ある程度短い間隔で測定することで、より正確に測れ、
測定の間隔が長かったりしたら精度(測定値の意味)がなくなりますよね。

このsunspotの測定する際の間隔は、
プログラム上で変更出来るのですか?
または、決まっているのでしょうか??