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をくっつけても通信不可能)

0 件のコメント: