- サーバ
- サーバはデフォルト送信電力で送る(多分フルパワー)
- クライアントの送信電力を指定
- クライアント
- サーバに指定された送信電力で返信
- 受信時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 件のコメント:
コメントを投稿