2008年5月27日火曜日

SunSPOTプロジェクトにもjavadocを...

お気づきの方もいるかと思いますが,現在のNetBeans用SunSPOTプラグインはバグがあります(+使い勝手が悪い・・).一番大きな問題として,プラグインが生成するMANIFEST.MFが間違っているということが挙げられます.

もう一つ自分が気になることとしては,何故かNetBeans上でSunSPOTプロジェクトにjavadoc生成が見当たらないことです.
どーいうことかって言うと,NetBeansで作成したプロジェクトには下図のように"javadocを生成"コマンドが用意されているのに,な・ぜ・か,SunSPOTプロジェクトだとjavadocの生成ができないのです。




そんなわけで,原因を調べてみたところ,プラグインの吐き出すbuild.xml(プロジェクトフォルダ内にあるヤツ)は{$sunspot.home}/build.xmlをimportしていて,そのbuild.xmlにtargetとしてjavadocが書かれていないことが判明!!.

そんなわけで,適当に書き足しましょう.
SunSPOT sdkをインストールしたフォルダにあるbuild.xmlの最後に以下の要素を書き足します.この時,</project>よりも後ろに書かないように!!
<target name="javadoc">
<delete dir="./javadoc" />
<mkdir dir="./javadoc" />
<javadoc sourcepath="src" destdir="./javadoc" />
</target>

最低限の設定な上に,ソースフォルダ名とかべた書きでカッコ悪いですが,これで一応動きます.
最後に,NetBeansにjavadocタスクの存在を教えてあげましょう.
プロジェクトのプロパティ画面を開いて,構築と実行の"javadocを生成"のトコロにjavadocと書き足しましょう(下図).なんかエラーが出るけど気にしない(笑)




以上でSunSPOTプロジェクトでもjavadocを吐けるようになりました.

****追記****
今回設定したjavadoc生成なんて,コマンドラインでやっても大した事ないので,メンドクサイだけかもしれません.
もうちょっと工夫したほうがいいかもしれない(クラスパスとかね)と思ったけど,今回はココまで.
ちなみに私はDoxygen派です!!

2008年5月26日月曜日

SunSPOTでRSSIをとる

指針

  • サーバ


    • サーバはデフォルト送信電力で送る(多分フルパワー)

    • クライアントの送信電力を指定


  • クライアント


    • サーバに指定された送信電力で返信

    • 受信時RSSI取得しその値をサーバに返す


  • サーバ


    • 返信のRSSIを取得

    • 繰り返し




サーバ側

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.peripheral.NoRouteException;
import com.sun.spot.peripheral.radio.IRadioPolicyManager;
import com.sun.spot.util.*;

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class RSSIServer extends MIDlet {

private final String toAddress = "0014.4F01.xxxx.xxxx";
private final String port = "100";
private RadiogramConnection conn = null;
private Radiogram dgs = null;
private Radiogram dgr = null;
private IRadioPolicyManager rpm = null;

protected void startApp() throws MIDletStateChangeException {
System.out.println("Starting Server");
new BootloaderListener().start(); // monitor the USB (if connected) and recognize commands from host

int rssi = 0;
int rssiReply = 0;
int outputPower = 0;
int outputPowerReply = -25; // クライアント出力電力の初期値 (理論上-32からいける)
int cntNoRoute = 0;

while(true){
try {
rpm = Spot.getInstance().getRadioPolicyManager();
conn = (RadiogramConnection) Connector.open("radiogram://" + toAddress + ":" + port);
dgs = (Radiogram)conn.newDatagram(conn.getMaximumLength());
dgr = (Radiogram)conn.newDatagram(conn.getMaximumLength());

outputPower = rpm.getOutputPower(); // 設定済みの出力電力取得

try {
dgs.reset();
dgs.writeInt(outputPowerReply); // 返信用の出力電力を送る
conn.send(dgs); // 送る to クライアント
conn.receive(dgr); // 受信
rssiReply = dgr.readInt(); // RSSI@クライアントの取得
rssi = dgr.getRssi(); // RSSI@サーバの取得
System.out.println("outpower@s="+outputPower+" rssi@c="+rssiReply+" outpower@c="+outputPowerReply+" rssi@s="+rssi);
} catch (NoRouteException e) {
System.out.println("No Route to "+toAddress);
cntNoRoute++;
if(cntNoRoute == 3){
notifyDestroyed();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
outputPowerReply++; // クライアントの送信電力を1ずつ上げてもらう
if(outputPowerReply >= 31){
outputPowerReply = -25;
}
Utils.sleep(1000);
}
// notifyDestroyed(); // cause the MIDlet to exit
}

protected void pauseApp() {
}

protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}

クライアント側

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.peripheral.radio.IRadioPolicyManager;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.peripheral.NoRouteException;
import com.sun.spot.util.*;

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class RSSIClient extends MIDlet {

private final String port = "100";
private IRadioPolicyManager rpm = null;
private RadiogramConnection conn = null;
private Radiogram rg = null;
private Radiogram rgReply = null;

protected void startApp() throws MIDletStateChangeException {
System.out.println("Starting Client");
new BootloaderListener().start(); // monitor the USB (if connected) and recognize commands from host

rpm = Spot.getInstance().getRadioPolicyManager();

int rssi = 0;
int outputPower = 0;
while (true) {
try {
conn = (RadiogramConnection)Connector.open("radiogram://:" + port);
rg = (Radiogram)conn.newDatagram(conn.getMaximumLength());
rgReply = (Radiogram)conn.newDatagram(conn.getMaximumLength());

try {
conn.receive(rg); // 受信
rssi = rg.getRssi(); // RSSI@クライアント取得
outputPower = rg.readInt(); // 返信用出力電力取得 from サーバ
rpm.setOutputPower(outputPower); // 返信用出力電力設定@クライアント
System.out.println("true output power = "+rpm.getOutputPower());
rgReply.reset();
rgReply.setAddress(rg); // 返信用アドレス設定
rgReply.writeInt(rssi); // 取得RSSI@クライアントを返信 to サーバ
conn.send(rgReply); // サーバへ返信
} catch (NoRouteException e) {
e.printStackTrace();
notifyDestroyed();
} finally {
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//notifyDestroyed(); // cause the MIDlet to exit
}

protected void pauseApp() {
}

protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}

サーバ動作例

クライアント動作例


ナゾ

  • 送信電力の指定が-32から-3までしかできない(-3以上大きくしても無視される,+31以上になると怒られる,-32だと小さすぎて2つのSPOTをくっつけても通信不可能)

2008年5月24日土曜日

boost 1.35.0がリリース

boost 1.35.0がリリース(2008/3/29)されてました.
http://www.boost.org/users/news/version_1_35_0
特殊関数(Besselとかerfcとか)が加えられたので利用価値あり.
サンプル

#include ≤boost/math/special_functions/bessel.hpp>
int
main(int argc,char** argv)
{
for(double i=-20;i<=20;i+=0.01)
printf("%f\t%f\n",i,boost::math::cyl_bessel_j(0,i));

return 0;
}

2008年5月21日水曜日

コマンドラインで実機を操作してみました!!

今日はコマンドラインで実機にアプリを乗せ,実行する方法を紹介します.
使用するコマンドは[ant deploy][ant run]のみです.それでは順を追って説明します.
まず,アプリを乗せたい端末をPCに接続します.また,コマンドライン上で乗せたいアプリのプロジェクトフォルダに移動して下さい.
ex.  cd C:\Sun\SunSPOT\Demos\AirText
ここで,コマンド[ant deploy]を実行.その後コマンド[ant run]を実行.以上です!

これだけでは記事として寂しいので,Basestationを用いてリモートでターゲット端末にアプリを乗せる方法も紹介したいと思います.
まず,BasestationをPCに接続します(厳密にはbasestationで無くても可能).また,コマンドライン上で乗せたいアプリのプロジェクトフォルダに移動して下さい.
ここで,[ant info]を実行して下さい.現在PCに接続されている端末の情報が表示されます.

上図の赤線のようにBasestationモードに設定されていることを確認して下さい.もし,
Configured to run the built-in dummy application
をという設定になっている場合は,コマンド[ant startbasestation]を実行して下さい.Basestationモードに切り替わるはずです(一度Basestationモードにした端末は[ant upgrade]をしないとモードを元に戻せないかもしれないのでお気を付け下さい).
それでは,ターゲット端末にアプリを流し込みたいと思います.
コマンド[ant -DremoteID=0014.4F01.????.???? deploy](????.????はターゲット端末の裏側に記載されているアドレス)を実行します.その後コマンド[ant -DremoteID=0014.4F01.????.???? run]を実行して下さい.上手く動作しましたか?

もし,動作が上手くいかない場合は「端末をリブートしてコマンドを実行」という作業を何度か行ってみて下さい.これで動く場合もあります.それでも失敗するようなら,OTAやOwner Keyの設定を変更する必要があるかもしれません.よく分からない場合はとりあえず端末をupgradeすることをお勧めします.大抵のエラーはこれでどうにかなるので・・・.

2008年5月20日火曜日

Sensorを使ってみた

5月10日の記事【通信サンプル】と5月16日の記事【Sensorを使おう】を参考にして,
加速度センサーのデータを他のSunSPOTにブロードキャストで送信するプログラムを作成.
5月10日の送信本体classを以下のように書き換える.

package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.*;
import com.sun.spot.sensorboard.peripheral.*;
import java.io.*;
import java.lang.Thread;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

/**
* SunSPOT通信テスト用アプリケーション(送信側)
* ひたすら"Hello World"の文字列をブロードキャストし続ける
*/
public class StartApplication extends MIDlet {
private DatagramSender sender; //!< 通信を行う
private final String PROTOCOL ="radiogram://broadcast:230"; //!< 通信プロトコル
private IAccelerometer3D Accele = EDemoBoard.getInstance().getAccelerometer();//加速度センサーのインスタンス作成
private double acc;//加速度用の変数
/**
* アプリ開始時に呼ばれる.
* @throws javax.microedition.midlet.MIDletStateChangeException
*/
protected void startApp() throws MIDletStateChangeException{
try {
sender = new DatagramSender(PROTOCOL, 31, 3);
int i = 0;

while(true){
        //2秒待つ(これをやらないと大量に出力されるため)
try{
Thread.sleep(2000);
} catch (InterruptedException e){
e.printStackTrace();
}
        //x軸の加速度をaccに代入する
acc = Accele.getAccelX();
        //加速度(acc;double)を文字列に変換して,sender.sendに渡す
sender.send("Hello:" + Integer.toString(i)+" " + Double.toString(acc));
i++;
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
protected void pauseApp() {
// This is not currently called by the Squawk VM
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {

}
}

こんな感じです.
demoのソースを見ればセンサーの使い方は大体わかると思います.

2008年5月16日金曜日

Sensorを使おう!!

相変わらず,ノラリクラリとSunSPOTで遊んでいます.

今回はセンサーの使い方メモ.
SunSPOTのeDemoボードには,
- 照度センサー
- 3軸加速度センサー
- 温度センサー
が付いています.
当然ながら開発者はこれらのセンサーから,値を取得したり,値の変化イベントを拾ったり出来ます.

そんなわけで,やり方メモ.今回は照度センサーを例にしますが,別のセンサーでも大差ありません.また,スイッチなんかも全て同じような使い方です(これがオブジェクト指向の良いトコロ).


1.照度センサーのインスタンス作成.
これは,EDemoBoard.getInstance().get~でいけます.~の部分はセンサーによって異なります.例えばこんな感じ.
ILightSensor Light = EDemoBoard.getInstance().getLightSensor();


2.センサーから現在の値を取得.
センサーが現在観察している値を取得するメソッドです.
但し,こいつはセンサーごとにメソッド名・引数共に異なりますので注意!!
Light.getAverageValue()
// 又は
Light.getAverageValue(int n)


3.イベントを拾う
Javaプログラマはおなじみのイベントハンドラの登録です.
手順としては,
-1- イベントハンドラの作成と登録
-2- 閾値(Threshold)の設定
-3- 閾値イベントの有効化
です.
注意事項としては,-3-で有効化した閾値イベントの有効期限は1度だけです.どーいうことかというと,閾値イベントを有効にしておけば,値が閾値を越えたときに登録したイベントハンドラのメソッドが呼ばれます.しかし,そこで閾値イベントは無効になり,次回からは閾値を超えてもイベントハンドラは呼ばれません.これを避けるためには,イベントハンドラ内で再び閾値イベントを有効にする必要があります.

ま,これは実際にソースを見たほうが早いでしょう.
// イベントハンドラ登録
Light.addILightSensorThresholdListener(new ILightSensorThresholdListener() {
// 閾値を越える変化があった時に呼び出される.
public void thresholdExceeded(ILightSensor light, int val) {
System.out.println("thresholdExceeded!!");
System.out.println("val:" + val);
light.enableThresholdEvents(true); // イベント登録は毎回有効にする.
}
// 閾値が変更されたとき呼び出される
public void thresholdChanged(ILightSensor light, int low, int high) {
System.out.println("thresholdChanged!!");
System.out.println("Low:" + low + "\tHigh:" + high);
}
});
Light.setThresholds(20, 60); // 閾値の設定(直後にthresholdChangedが呼ばれる
Light.enableThresholdEvents(true);// イベント登録を有効化

ソースから分かるように,ThresholdListenerは2つのメソッドを持ちます.1つは,閾値を越えたときに呼ばれるメソッド.もう1つは,閾値が変更されたときに呼ばれるメソッドです.これは,他のセンサーにも共通なようです.

追記
さっき気づいたのだけれども,SPOT ManagerのConsoleに
SDK Color: "purple". Demos color: "orange". Release mismatch. Demos not installable.

のエラーが.
確かにNetBeans上でDemo眺めてるとクラスが見つからなかったり不思議なエラーが出てたなぁと,しみじみ納得.

2008年5月13日火曜日

SunSPOT用語のまとめ

SunSPOT関連で少し,用語のメモ.暇なときに書き足します・・・・多分.

・SunSPOT


"Sun Small Programmable Object Technology"の略.
コイツについては今更でしょう.

・J2ME


"Java2 Platform Micro Edition"の略.要するに組込み用のJava規格(cf:J2SE,J2EE).
J2MEの環境では,アプリケーションは特定のプロファイル向けに作成されおり,プロファイルは特定のコンフィギュレーションを基本としているらしい.
代表的なコンフィギュレーションとして,
-CLDC
-CDC
があるそうな.

・Squawk VM


小型デバイス向けに設計されたJavaVM.J2ME CLDC 1.1に準拠.SunSPOTの上ではコイツが動いているそうな.
このVMの特徴としては,
-小型デバイス向け
-OSを必要としない
-Javaで書かれている
-一つのVM上で複数のJavaアプリが動く
って感じ(?).
最近オープンソースになったそうな.Windows上でビルドに成功した人も居るってどっかで聞きました.

・MIDlet


携帯電話など小型の情報端末で実行できるJavaアプリケーションの形式の一つ(っつうかクラス).SunSPOT上で動かすアプリはMIDletクラスを継承する.
最低限
- startApp()
- pauseApp()
- destroyApp()
は実装しましょう.

2008年5月10日土曜日

SunSpot通信サンプル

この辺見ながら適当に作ったサンプル.
送信側はひたすら"Hello:送信回数"をブロードキャストし続ける.受信側は受信したメッセージをコンソロールに出力し続けるだけという超シンプルなプログラムです.参考までに....

まずは,送信側本体
package org.sunspotworld;

import com.sun.spot.peripheral.Spot;
import com.sun.spot.sensorboard.EDemoBoard;
import com.sun.spot.sensorboard.peripheral.ITriColorLED;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.*;
import com.sun.spot.sensorboard.peripheral.*;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

/**
* SunSPOT通信テスト用アプリケーション(送信側)
* ひたすら"Hello World"の文字列をブロードキャストし続ける
*/
public class StartApplication extends MIDlet {
private DatagramSender sender; //!< 通信を行う
private final String PROTOCOL ="radiogram://broadcast:230"; //!< 通信プロトコル
/**
* アプリ開始時に呼ばれる.
* @throws javax.microedition.midlet.MIDletStateChangeException
*/
protected void startApp() throws MIDletStateChangeException{
try {
sender = new DatagramSender(PROTOCOL, 31, 3);
int i = 0;
while(true){
sender.send("Hello:" + Integer.toString(i));
i++;
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
protected void pauseApp() {
// This is not currently called by the Squawk VM
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}


次はデータ送信を行うクラスの例
package org.sunspotworld;

import com.sun.spot.io.j2me.radiogram.RadiogramConnection;
import com.sun.spot.peripheral.Spot;
import java.io.IOException;
import javax.microedition.io.*;

/**
* データグラム送信用クラス
*/
public class DatagramSender {
private DatagramConnection conn;//!< コネクション
private Datagram datagram;//!< データグラム
/**
* コンストラクタ
*/
public DatagramSender(String protocol,int power,int maxHops)throws IOException{
Spot.getInstance().getRadioPolicyManager().setOutputPower(power);
conn = (DatagramConnection)Connector.open(protocol);
((RadiogramConnection)conn).setMaxBroadcastHops(maxHops);
datagram = conn.newDatagram(conn.getMaximumLength());
}
/**
* メッセージ送信メソッド
*/
public synchronized void send(String message) throws IOException{
datagram.reset();
datagram.writeUTF(message);
conn.send(datagram);
}

}


最後に受け手側本体
package org.sunspotworld;

import com.sun.spot.sensorboard.*;
import com.sun.spot.io.j2me.radiostream.*;
import com.sun.spot.io.j2me.radiogram.*;
import com.sun.spot.util.*;
import com.sun.spot.peripheral.*;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import java.util.*;

/**
* SunSPOT通信テスト用アプリケーション(受信側)
* ひたすら受け取ったパケットをコンソロールに表示し続ける
*/
public class StartApplication extends MIDlet {
private final String PROTOCOL = "radiogram://:230"; ///< 通信プロトコル文字列
private DatagramConnection conn; //!< コネクション
private Datagram datagram;//< データグラム
/**
* アプリ開始時に呼ばれる
* @throws javax.microedition.midlet.MIDletStateChangeException
*/
protected void startApp() throws MIDletStateChangeException {
try {
Spot.getInstance().getRadioPolicyManager().setOutputPower(31);
conn = (DatagramConnection) Connector.open(PROTOCOL);
datagram = conn.newDatagram(conn.getMaximumLength());
while (true) {
datagram.reset();
conn.receive(datagram);
String message = datagram.readUTF();
System.out.println(message);
}
} catch (IOException ex) {
ex.printStackTrace();
}
}

protected void pauseApp() {
}
protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
}
}

2008年5月9日金曜日

「google-code-prettify」を導入しました

Blogger でソースコードに色付けをする - google-code-prettifyを導入しました.
使い方は、<pre class="prettyprint"> #表示したいソースコード# </pre>
で色がつきます.
注意! < と> はそのまま打ち込むと表示エラーになるので、
"&lt;" "&gt;"としてください.(但,&は半角で)

使用例
#include< iostream >
int main(){
cout<< "hello!"<< endl;
}

こんな感じです.

NetBeans6でSunSPOT開発

NetBeans6にSunSpot開発用プラグインをインストールする方法のメモ.


1.ここからプラグインをダウンロード(ファイル名は変更されてなければ"com-sun-sunspot-updatecenter.nbm").また,ダウンロードの際にIEを使うと拡張子がzipに書き換えられるので,そんな時は慌てずnbmに変更する.



2.NetBeans6を起動して,[ツール]メニューのプラグインをクリック.



3.プラグインウィンドウが起動するので,ダウンロード済みタブを選択して,プラグインの追加から,さっき落としたファイルを選択.



4.次に同ウィンドウの使用可能なプラグインタブを開いてカタログを再読み込みボタンを押してしばらく待てば,SunSPOT関係のプラグインが3つか4つくらい新たに増えるので,そいつにチェックを入れる.最後にインストールボタンを押せば勝手にインストールが始まる.


以上!!

2008年5月8日木曜日

今日起こったエラー②

追記
Solarium が立ち上がらない
->.spotworld.propertiesと.sunsopt.propertiesを消し,さらにant,SunSPOTSDKを入れなおした

今日起こったエラー

SPOTManagerをクリックした後,大きい実機の写真が出たのにもかかわらず開かない.
->C:\Documents and Settings\%自分のアカウント%にある.sunspot.properties内のバックスラッシュ(/)を¥に書き換えたため起動しなくなったと考えられる

Solariumで,New virtual SPOTを起動するとConsole Output中にエラーが出る
(C:\Sun\SunSPOT\sdk/lib/squawk.suiteがない!)
->ないので, (C:\Sun\SunSPOT\sdk\bin\squawk.suite)からコピーする。

エミュレータでDemoが動かない
->.sunsupot.propertiesを確認する
デフォルトは(sunspot.home=C:/Program Files/Sun/SunSPOT/sdk)
なので,/Program Filesを消す

2008年5月7日水曜日

SunSpot実機にプログラムを落とす

***SunSpot実機にプログラムを落とす

それぞれを接続してドライバをインストールする.
(ソフトウェアを自動的に選択でいけるはず)
いけない場合はCD-ROMから入れる.

SunSPOTManagerを開き,おのおのをUpgradeする.
親機
1.Upgradeを選択
2.OTAcommand->EnableOTA comand serverを選択
3.BaseStation->Start Basestationを選択

子機
Upgradeを選択

再起動する.

親機を接続し,SunSPOTManagerを開く
Solarium->Slariumを選択する
子機が表示されます
*表示されないとき
・子機の電源が入っているか確認
・Discovery->Discovery Sun Spotsを選択
・再起動してみる
・親機を接続し,
 OTAcommand->EnableOTA comand serverを選択
 BaseStation->Start Basestationを選択
・一からやり直す

子機にプログラムを入れる
子機上で右クリック->Deploy a MIDlet bundleを選択

Choose...を押し【再生ボタン】ぽい印がついている
ディレクトリを選択する
Startを選択->1:~を選択する

2008年5月6日火曜日

SunSpot インストール

詳しくは
Shuichi Machida's Weblog : Weblog

SunSPOTManagerのインストール
http://www.sunspotworld.com/SpotManager/
よりLAunch the Sun SPOT Manager applicationをダウンロードする
SPOTManager.jnlpを実行し,上部タブのSDK'sを選択
v3.0 Purpleを選択して下部インストールボタンを押す

※ ベースディレクトリに空白を含んでいると、ツールの一部動作に
不具合がでることがあるようです。なので、Windowsの場合は一旦イン
ストールした後 C:\Documents and Settings\<ユーザ名> ディレクトリ
以下にある .sunspot.properties ファイルを編集して、sunspot.home
の値を変更(c:\Sun\SunSPOT\sdk など)後にもう一度SDKをインストール
しなおすと良いかもしれません。

SunSPOTManagerを実行するためにはApache Antが必要
http://ant.apache.org/ のdownload -> apache-ant-*.*.*-bin.zipをダウンロード
-> 解凍
解凍したフォルダを適当な場所に移動ex:c\user\local\apache-ant...

パスを通す
システムのプロパティ(マイコンピュータ->右クリック->プロパティ)
詳細設定->環境変数
ANT_HOME さっき解凍したフォルダの場所を指定
PATH さっきのフォルダのbinの場所を指定

デモプログラムを入れる
SPOTManagerのPreferencesのUpdate Center のところでBeta Update Centerを選択する
SPOTManagerのSDKsでDemosをクリック
->デモプログラムがダウンロードされる

サンプルプログラムを動かしてみる
SPOTManagerのSPOTWorldの下部にあるSPOTWorldをクリック
->SPOTWorldが起動する
Emulatorを選択し、New virturl SPOTを選択する
->virtualSPOTが出てくる
virtualSPOTで右クリックしspecify Application jar...を選択し、
Sun/SunSPOT/Demos/EmulatorDemoにあるjarファイルを選択する
virtualSPOTで右クリックしRunMIDletから好きなものを選択する
->プログラムが開始される

NetBeans用プラグインを入れる
**NetBeans IDE 6.0 には対応していないので注意!(Modulesボタンがアクティブにならない)
NetBeans IDE 5.5をインストールする.
SunSPOT Manager のSDKsの下部にあるModulesをクリックする.
->インストール開始
終了するとNetBeansにプラグインが入る.

Javaの環境がない時:jdk1.5.0が推奨されている
jdk1.5.0をインストールする.
環境変数に"JAVA_HOME"を追加、場所にjdk1.5.0*** の場所を指定
環境変数Pathに jdk1.5.0*** のbinの場所を追加する

NetBeansでプログラムを書く
NetBeans 5.5.1を起動する
ファイル->新規プロジェクトを選択
プロジェクトを選択でカテゴリ"一般"、プロジェクト"Sun SPOT Application"を選択し次へ
適当な名前を決め完了する

※manifest.mfを書き換えないといけいない!
左端のウィンドウの"ファイル"タブを選択する.
resource->META-INF->MANIFEST.MFをダブルクリックする
*MANIFEST.MFの中身
MIDlet-Name: SunSpotApplication
MIDlet-Version: 1.0.0
MIDlet-Vendor: Sun Microsystems Inc
MIDlet-1: src/org/sunspotworld/StartApplication, , org.sunspotworld.src/org/sunspotworld/StartApplication
MicroEdition-Profile: IMP-1.0
MicroEdition-Configuration: CLDC-1.1
四行目を変更する
*変更後
MIDlet-1: src/org/sunspotworld/StartApplication, , org.sunspotworld.StartApplication

右端にある"プロジェクト"で右クリック->"プロジェクトを構築"をクリック
->jarファイルが作成される

virtual SOPTで作成したjarファイル("作成したフォルダ/suite"にある)を選択すると実行できる