Bluetooth-connection entre Android et Lego Mindstorm NXT
-
12-11-2019 - |
Question
Quelqu'un sait-il, comment créer une connexion Bluetooth entre Android et Lego-Mindstorm-NXT? La connexion entre deux nxts fonctionne bien. Mais l'autre type de connexion n'aime pas si facile. Je travaille avec le firmware de Lejos 0.85 et les outils Android SDK (2.2 FROYO).
La solution
Je l'ai donc résolu et montrerai comment cela fonctionne, car j'ai vu que beaucoup de gens ont des problèmes avec cela.
La classe comprend 4 fonctions:
- Bluetooth enable s'il n'est pas activé avant -> enablebt ()
- Connectez-vous à 2 nxts -> connectTonxts ()
- Écrivez un message à l'un des nxts -> writeMessage (octet msg, chaîne nxt)
- Lire le message de l'un des nxts -> ReadMessage (String nxt)
Voici le code du périphérique Android (bt_comm.java):
package de.joen.android.CubeScan;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
public class BT_Comm {
//Target NXTs for communication
final String nxt2 = "00:16:53:04:52:3A";
final String nxt1 = "00:16:53:07:AA:F6";
BluetoothAdapter localAdapter;
BluetoothSocket socket_nxt1, socket_nxt2;
boolean success = false;
// Enables Bluetooth if not enabled
public void enableBT(){
localAdapter = BluetoothAdapter.getDefaultAdapter();
// If Bluetooth not enable then do it
if (!localAdapter.isEnabled()) {
localAdapter.enable();
while(!(localAdapter.isEnabled()));
}
}
// Connect to both NXTs
public boolean connectToNXTs() {
// Get the BluetoothDevice of the NXT
BluetoothDevice nxt_2 = localAdapter.getRemoteDevice(nxt2);
BluetoothDevice nxt_1 = localAdapter.getRemoteDevice(nxt1);
// Try to connect to the nxt
try {
socket_nxt2 = nxt_2.createRfcommSocketToServiceRecord(UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket_nxt1 = nxt_1.createRfcommSocketToServiceRecord(UUID
.fromString("00001101-0000-1000-8000-00805F9B34FB"));
socket_nxt2.connect();
socket_nxt1.connect();
success = true;
} catch (IOException e) {
Log.d("Bluetooth","Err: Device not found or cannot connect");
success=false;
}
return success;
}
public void writeMessage(byte msg, String nxt) throws InterruptedException {
BluetoothSocket connSock;
// Swith nxt socket
if (nxt.equals("nxt2")) {
connSock=socket_nxt2;
} else if(nxt.equals("nxt1")) {
connSock = socket_nxt1;
} else {
connSock=null;
}
if (connSock!=null) {
try {
OutputStreamWriter out = new OutputStreamWriter(connSock.getOutputStream());
out.write(msg);
out.flush();
Thread.sleep(1000);
} catch (IOException e) {
// TODO: Auto-generated catch block
e.printStackTrace();
}
} else {
// Error
}
}
public int readMessage(String nxt) {
BluetoothSocket connSock;
int n;
// Swith nxt socket
if (nxt.equals("nxt2")) {
connSock=socket_nxt2;
} else if (nxt.equals("nxt1")) {
connSock=socket_nxt1;
} else {
connSock=null;
}
if (connSock!=null) {
try {
InputStreamReader in = new InputStreamReader(connSock.getInputStream());
n = in.read();
return n;
} catch (IOException e) {
// TODO: Auto-generated catch block
e.printStackTrace();
return -1;
}
} else {
// Error
return -1;
}
}
}
Pour obtenir des messages du smartphone Android, vous devez avoir un appel de lecture sur le côté NXT. Voici le code du côté NXT qui acceptera la connexion à partir du smartphone et lira les messages de celui-ci:
Boolean isrunning = true;
// Main loop
while (true)
{
LCD.drawString(waiting,0,0);
LCD.refresh();
// Listen for incoming connection
NXTConnection btc = Bluetooth.waitForConnection();
btc.setIOMode(NXTConnection.RAW);
LCD.clear();
LCD.drawString(connected,0,0);
LCD.refresh();
// The InputStream for read data
DataInputStream dis = btc.openDataInputStream();
// Loop for read data
while (isrunning) {
Byte n = dis.readByte();
LCD.clear();
LCD.drawInt(n, 4, 4);
}
dis.close();
// Wait for data to drain
Thread.sleep(100);
LCD.clear();
LCD.drawString(closing,0,0);
LCD.refresh();
btc.close();
LCD.clear();
}
J'espère que cela aidera les autres ...
Autres conseils
Il y a un document que j'ai trouvé très utilehttp://wiki.tinyclr.com/images/d/df/lego_mindstorms_nxt_direct_commands.pdf
Le package MindDroid sur GitHub est un bon point de départ.