Java ME ClassCastException bei NXTComm.open();

J

Jannis.H

Gast
Hallo liebe Java-Gurus :),

ich versuche seit ein paar Tagen fieberhaft eine Bluetooth-Verbindung zwischen einem Laptop und einem Mindstorms-NXT-Stein herzustellen.
Nahc mehreren durchgelesenen PDF's bin ich dann über eine Seite gestolpert, die ein Beispielprogramm angeführt hat.
Java:
//Programm für den Computer (Master)
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import lejos.pc.comm.NXTCommBluecove;
import lejos.pc.comm.NXTCommException;
import lejos.pc.comm.NXTInfo;

public class CompGetsFromNXT {
       
	public static void main(String[] args){
		
		// Verbindung zu einem NXT aufbauen.
		NXTInfo nxt = new NXTInfo();
		nxt.deviceAddress = "001653129999";
		nxt.name = "Windmaker";
		
		NXTCommBluecove com = new NXTCommBluecove();

		try{
			com.open(nxt);
		} 
		catch (NXTCommException e) {/*e.printStackTrace();*/System.out.println("\n\tNXTCommException!");}
		catch(ClassCastException cce){/*cce.printStackTrace();*/System.out.println("\n\tClassCastException!");} 
		
		InputStream is = com.getInputStream();
		OutputStream os = com.getOutputStream(); 
		  
		// Falls ein DataOutputStream benötigt wird.
		DataOutputStream dos = new DataOutputStream(os);
	}
}

Leider schmeißt er mir bei dem Befehl [c]NXTCommBluecove.open(NXTInfo);[/c] [im try-Block] eine ClassCastException. Kann mir bitte jemand weiterhelfen und sagen, was da schief läuft?
 
N

nillehammer

Gast
Java:
final NXTInfo nxtInfo = new NXTInfo(NXTCommFactory.BLUETOOTH, "Windmaker", "001653129999");
final NXTComm nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
nxtComm.open(nxtInfo);
Die Idee bei der lejos-API ist, dass Du nur eine Referenz auf das Interface NXTComm für die Methodenaufrufe (z.B. open()) benutzt. Die konkrete Implementierung wird dadurch versteckt und wird von der NXTCommFactory geliefert.

Den Code habe ich aus den javadocs extrahiert. Ich habe leJOS nicht, deswegen ist es nicht getestet.
 

turtle

Top Contributor
Wie nillehammer schon geschrieben, versuch mal:
Java:
NXTComm nxtComm;
try {
   nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
 } catch (NXTCommException e) {
    System.out.println("Failed to load Bluetooth driver");
    System.exit(1);
}
 
J

Jannis.H

Gast
Habs eben versucht auch mit verschiedenen Änderungen, klappt leider immer noch nicht. Er schmeißt wieder die gleiche ClassCast Exception:

Exception in thread "main" java.lang.ClassCastException: javax.microedition.io.Connector$1 cannot be cast to javax.microedition.io.StreamConnection
at lejos.pc.comm.NXTCommBluecove.open(NXTCommBluecove.java:120)
at lejos.pc.comm.NXTCommBluecove.open(NXTCommBluecove.java:133)
at CompGetsFromNXT.main(CompGetsFromNXT.java:19)
 
J

Jannis.H

Gast
Turtle's Code läuft. Danke dafür!
Ich versuch jetzt noch, den NXT da reinzubasteln, sollte ich nochmal hängenbleiben melde ich mich einfach nochmal.

Nochmals vielen Dank an euch zwei für die schnelle Hilfe :)
 
J

Jannis.H

Gast
Sobald ich nun versuche, nxtComm zu öffnen, wirft er wieder die ClassCastException.


Java:
NXTComm nxtComm;
		
	NXTInfo nxt = new NXTInfo();
        nxt.deviceAddress = "001653129999";
        nxt.name = "Windmaker";
		
		try {
		   nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
		   nxtComm.open(nxt);
		} catch (NXTCommException e) {
			System.out.println("Failes to load NXT-Data");
			System.exit(1);
		}
 

turtle

Top Contributor
Versuch mal statt
nxtComm.open(nxt);
ein
Java:
NXTInfo[] nxtInfo = nxtComm.search("NXT",NXTCommFactory.BLUETOOTH)
und schau mal ins Array rein, was da so drin steht.
 
N

nillehammer

Gast
Hm,
vielleicht stimmt noch was mit dem NXTInfo nicht.

Probier bitte mit dem erzeugten NXTComm
Java:
search(null, (NXTCommFactory.BLUETOOTH & NXTCommFactory.USB));
Das müsste ein Array aller verfügbaren NXTInfos (alle Namen und alle Protokoll) zurück geben.
 
J

Jannis.H

Gast
Jetzt habe ich eine neue Exception:

Exception in thread "Thread-0" java.lang.UnsatisfiedLinkError: lejos.nxt.NXT.getUserPages()I
at lejos.nxt.NXT.getUserPages(Native Method)
at lejos.nxt.Flash.<clinit>(Flash.java:18)
at lejos.nxt.SystemSettings.<clinit>(SystemSettings.java:30)
at lejos.nxt.comm.NXTCommDevice.loadSettings(NXTCommDevice.java:167)
at lejos.nxt.comm.NXTCommDevice.<clinit>(NXTCommDevice.java:20)
at javax.bluetooth.DiscoveryAgent$1.run(DiscoveryAgent.java:194)

Wird bei der Zuweisung des Feldes geworfen, nicht bei der Ausgabe.

Quellcode:

Java:
try {
		   nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
		   NXTInfo[] nxtInfo = nxtComm.search("NXT",NXTCommFactory.BLUETOOTH);
		   
		   //System.out.println("nxtInfo: " + nxtInfo);
		} catch (NXTCommException e) {
			System.out.println("Failes to load NXT-Data");
			System.exit(1);
		}
 
J

Jannis.H

Gast
nillehammer's Code:
Java:
try {
		   nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
		   NXTInfo[] nxtInfo = nxtComm.search(null, (NXTCommFactory.BLUETOOTH & NXTCommFactory.USB));
		   
		   System.out.println("Verbindung steht!\nnxtInfo: " + nxtInfo);
		} catch (NXTCommException e) {
			System.out.println("Failes to load NXT-Data");
			System.exit(1);
		}

Ausgabe Console:
Verbindung steht!
nxtInfo: [Llejos.pc.comm.NXTInfo;@10b30a7
 
N

nillehammer

Gast
Java:
NXTInfo[] nxtInfo = nxtComm.search(null, (NXTCommFactory.BLUETOOTH & NXTCommFactory.USB));
Der Variablenname ist etwas unglücklich. Du hast nämlich einen Array von NXTInfos. Nimm lieber "nxtInfos" oder "nxtInfoArr"

Java:
System.out.println("Verbindung steht!\nnxtInfo: " + nxtInfo);
Damit siehst Du nur, dass das Array nicht null ist. Ob da tatsächlich was drinnen ist, siehst Du so nicht. Dafür iteriere entweder über das Array und gib alle Elemente einzeln aus oder nutze Arrays.deepToString.
Beispielcode:
Java:
/* Entweder über das Array iterieren und alle elemente einzeln ausgeben. */
for (final NXTInfo current : nxtInfoArr) {
  System.out.println("Current: " + current);
}

/* ODER mit Arrays.deepToString */
Arrays.deepToString(nextInfoArr);

Gruß nillehammer
 
J

Jannis.H

Gast
Ich versuche grade wieder comm zu öffnen:
Java:
try {
		   nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
		   NXTInfo[] nxtInfo = nxtComm.search("Windmaker", (NXTCommFactory.BLUETOOTH & NXTCommFactory.USB));
		   
		   nxtComm.open(nxtInfo[0]);
		   System.out.println("Verbindung steht!\nnxtInfo: " + nxtInfo);
		} catch (NXTCommException e) {
			System.out.println("Failes to load NXT-Data");
			System.exit(1);
		}

Bekomme aber eine "java.lang.ArrayIndexOutOfBoundsException: 0".
Nehme mal an, das bedeutet Bereichüberschreitung bei dem Feld? Aber das Element 0 existiert doch, oder?
 
N

nillehammer

Gast
ehme mal an, das bedeutet Bereichüberschreitung bei dem Feld? Aber das Element 0 existiert doch, oder?
Siehe mein letzter Post. Aber es sieht so aus, als wäre das Array leer. Jetzt muss ich überlegen...
 
N

nillehammer

Gast
Ist es auch leer, wenn Du so nach NXTInfo[] suchst?
Java:
NXTInfo[] nxtInfo = nxtComm.search(null, (NXTCommFactory.BLUETOOTH & NXTCommFactory.USB));
 
J

Jannis.H

Gast
Ja, aber nun öffnet sich eine Exception, die schneller wieder weg ist, als man sie lesen kann.
 
J

Jannis.H

Gast
Gerade habe ich eine E-Mail vom Support der Website erhalten, auf der ich das Beispiel gefunden habe. Womöglich basiert der Code auf der alten LeJOS Version. Der Beitrag wurde überarbeitet, ich folge mal der Anleitung und der Fehlerbehebung und poste euch dann noch mal.
 
J

Jannis.H

Gast
Also, der Quellcode aus meinem ersten Post war lauffähig, sobald classes.jar und islLeJOSComm.jar aus dem Projekt entfernt waren. Nun wird die Verbindung hergestellt :)
Die Website wurde auch entsprechend aktuallisiert.

Hier der Link, falls noch jemand eine Bluetooth-Verbindung zwischen Rechner und NXT herstellen will: Kommunikation via Bluetooth [IT-Seminar Lörrach]

Danke euch zwei, für die Hilfe! :)
 

Ähnliche Java Themen

Neue Themen


Oben