BTConnetor.WaitForConnection(int timeout, int mode)
Il ne s'arrête pas
BTConnection.read(byte[] buffer, int length, boolean wait)
Attendra jusqu'à ce qu'il soit chargé. Pour résoudre ces problèmes, j'ai créé une classe wrapper.
BtNbConnector.java
import java.io.IOException;
import lejos.remote.nxt.BTConnector;
import lejos.remote.nxt.NXTCommConnector;
import lejos.remote.nxt.NXTConnection;
import lejos.utility.Stopwatch;
public class BtNbConnector extends NXTCommConnector implements Runnable {
BTConnector connector;
private NXTConnection con = null;
private boolean connected = false;
private int mode;
public BtNbConnector() {
connector = new BTConnector();
}
@Override
public NXTConnection waitForConnection(int timeout, int mode) {
this.mode = mode;
new Thread(this).start();
Stopwatch sw = new Stopwatch();
while (!connected && sw.elapsed() < timeout) {
}
if (!connected) {
return null;
}
return new BtNbConnection(con);
}
public void run() {
con = connector.waitForConnection(0, mode);
connected = true;
}
@Override
public NXTConnection connect(String target, int mode) {
return new BtNbConnection(connector.connect(target, mode);
}
@Override
public boolean cancel() {
return connector.cancel();
}
}
class BtNbConnection extends NXTConnection implements Runnable {
private NXTConnection con = null;
BtNbConnection(NXTConnection con) {
this.con = con;
}
@Override
public void close() throws IOException {
con.close();
}
@Override
public int read(byte[] buf, int length) {
return con.read(buf, length);
}
@Override
public int write(byte[] buf, int numBytes) {
return con.write(buf, numBytes);
}
private boolean received = false;
private int rtn = 0;
private byte[] buffer;
private int length;
private Thread reading = null;
@Override
public int read(byte[] buf, int length, boolean wait) {
if (wait) {
return con.read(buf, length);
}
received = false;
this.buffer = buf;
this.length = length;
//Recevoir
if (reading == null) {
System.out.println("Thread start");
reading = new Thread(this);
reading.start();
}
//Recevez des données ou attendez 20 millisecondes
Stopwatch sw = new Stopwatch();
while (!received && sw.elapsed() < 20) {
}
return rtn;
}
public void run() {
rtn = con.read(buffer, length);
received = true;
}
}
L'exemple d'utilisation est créé sur la base de la classe côté serveur de Communication Bluetooth entre EV3 par leJOS.
BluetoothServer.java
import lejos.hardware.Button;
import lejos.hardware.Sound;
import lejos.remote.nxt.NXTCommConnector;
import lejos.remote.nxt.NXTConnection;
import lejos.utility.Delay;
public class BluetoothServer {
public static void main(String[] args) {
int recvMessageNo = 2; //Numéro à recevoir
int sendMessageNo = 3; //Numéro à envoyer
System.out.println("Connect waiting...");
//Créer une instance de la classe wrapper BtConnector
NXTCommConnector connector = new BtNbConnector();
//Attendez une connexion depuis la destination, ★ Délai d'attente dans 10 secondes
NXTConnection connection = connector.waitForConnection(10 * 1000, NXTConnection.RAW);
if (connection == null) {
//Arrêtez le système si la connexion échoue
System.out.println("Connect fail");
Delay.msDelay(3 * 1000);
System.exit(1);
}
System.out.println("Connected");
//Sonne si le numéro de réception est correct
if(isReceived(connection, recvMessageNo)){
Sound.systemSound(false, 2);
} else {
Sound.buzz();
}
//Envoyer un message
send(connection, sendMessageNo);
//Déconnecter la communication
System.out.println("Closing...");
try {
if (null != connection) {
connection.close();
}
} catch (Exception ioe) {
}
System.out.println("Finished");
Button.waitForAnyPress();
}
static boolean isReceived(NXTConnection connection, int messageNo) {
byte[] recvBuff = new byte[16];
//Attendez de recevoir un message ou appuyez sur le bouton ÉCHAPPEMENT
while(recvBuff[0] == 0 && Button.ESCAPE.isUp()){
//★ Recevez sans attendre
connection.read(recvBuff, recvBuff.length, false);
}
//Vérifiez si le message est correct
for (int i = 0; i < recvBuff.length; i++) {
System.out.print(recvBuff[i]);
if (recvBuff[i] != messageNo) {
System.out.println();
return false;
}
}
System.out.println();
return true;
}
static void send(NXTConnection connection, int messageNo) {
byte[] sendBuff = new byte[16];
for (int i = 0; i < sendBuff.length; i++) {
sendBuff[i] = (byte)messageNo;
}
connection.write(sendBuff, sendBuff.length);
}
}