[JAVA] Communiquons sans bloquer avec Bluetooth du leJOS ev3

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);
	}

}

Recommended Posts

Communiquons sans bloquer avec Bluetooth du leJOS ev3
[LeJOS] Contrôlons le moteur EV3 avec Java
[LeJOS] Obtenez la valeur du capteur EV3 à distance avec Java
[LeJOS] Contrôlons à distance le moteur EV3 avec Java