Bluetooth Projekt - Problem beim mehrmaligen Senden

fLooojava

Bekanntes Mitglied
Hallo Java-Forum Community,

ich bin derzeit an einem kleinen Projekt für private Zwecke beschäftigt. Es geht um eine RGB LED Stripe welche mittels einer App gesteuert wird. Der Hardware Aufbau ist relativ simple. Ich benutze dazu ein Arduino welcher mir mittels PWM die einzelnen Kanäle ansteuert. Mein Problem liegt definitiv am App, jedoch ist nicht ausgeschlossen dass mein Bluetooth Modul ein ???:L hat.... Ich kann es mir momentan nicht erklären, weshalb folgender Fehler auftritt:

Sobald ich mein Bluetooth Modul aus & wieder einstecke und mit meinem App über den Bluetooth Socket was schicke funktioniert es. Ich erhalte den gewünschten Wert und die gewünschte Farbe wird angezeigt. Beim weiteren Senden einer neuen Farbe klappt es nicht mehr. Es scheint, als ob das BT Modul immer noch beschäftigt ist.


Code zum senden:

Java:
public void sendValue(String value) {
    	
    	if(value=="red"){			setOutput("r");
    	Thread connection = new Thread() {
			public void run() {
				
    			String address ="meine mac";
				BluetoothDevice device = BA.getRemoteDevice(address);
				String outputstring = "r";

				try {
					//Create a Socket connection: need the server's UUID number of registered
					
					socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"));
					socket.connect();			
					OutputStream outputStream = socket.getOutputStream();
				
					 outputStream.write(outputstring.getBytes());
						outputStream.flush();
						socket.close();

				
					
				} catch (IOException e) {
				} 
			};
		};
	connection.start();
	
    	} }

Ich habe die setOutput bzw. getOutput Methode nicht berücksichtigt, da ich hier noch ein Fehler im Code habe. Den String, der gesendet werden soll habe ich innerhalb vom Thread deklariert, dies funktioniert auch wunderbar. Ich baue also den Socket auf, gebe meine MAC an ( in diesem Fall entfernt ) und wähle die default UUID laut Internet-recherche. Die Verbindung funktioniert, das senden klappt, aber jedoch nur einmalig. Für sämtliche anderen Farbvariationen sieht der Code identisch aus, außer dass eben für green "g", für blue "b" ecetera gesendet wird. Schlussendlich lösche ich den Buffer des outputStreams und schließe den Socket. Beim nächsten Senden starte ich den Socket wieder und die gleiche Prozedur erfolgt.

Ich sehe keinen Fehler im Code, habe bisher auch nichts recherchieren können, nur dass ich anscheinend nicht der einzige bin.

06-11 18:37:47.232: D/BluetoothUtils(4885): isSocketAllowedBySecurityPolicy start : device null
06-11 18:37:47.232: W/BluetoothAdapter(4885): getBluetoothService() called with no BluetoothManagerCallback
06-11 18:37:53.947: D/BluetoothUtils(4885): isSocketAllowedBySecurityPolicy start : device null
06-11 18:37:53.947: W/BluetoothAdapter(4885): getBluetoothService() called with no BluetoothManagerCallback
06-11 18:37:54.097: E/(4885): java.io.IOException: read failed, socket might closed or timeout, read ret: -1
06-11 18:37:54.097: E/(4885): at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:1016)
06-11 18:37:54.097: E/(4885): at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:1036)
06-11 18:37:54.097: E/(4885): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:654)
06-11 18:37:54.097: E/(4885): at com.example.rgbled.MainActivity$7.run(MainActivity.java:175)

Kennt jemand dieses Problem, kann mir jemand unter die Arme greifen? Wo liegt das Problem, was mache ich falsch? :bahnhof:

Wär cool wenn wer ne Lösung hat! 🙂

flo
 
Zuletzt bearbeitet:
Du sendest 1 Byte und machst dann die Connection wieder zu? Das erste was ich probieren würde ist, ob man nicht einfach das Socket offen lassen kann.

Was ich mir als Ursache vorstellen kann, ist, dass die Verbindung auf Arduino-Seite nicht richtig getrennt wurde/die Trennung nicht mitbekommen hat und deshalbe keine neue Verbindung aufbauen kann/ erwartet.
 
Morgen Kevin,

ja ich mach die Socket Verbindung nach dem Senden gleich wieder zu. Ich habe aber auch schon versucht den Socket ohne schließen zu betreiben, hat aber leider nicht geklappt wobei ich hier dann einen Fehler gemacht habe. Ich vermute mal wenn ich verbunden bin und dann mich nochmal verbinden möchte dieselbe Fehlermeldung auftritt wie ich bereits gepostet habe? Hier könnte der Fehler sein beziehungsweise das wird's wohl sein. Ich werd das heute Abend testen.

Auf dem Arduino lausche isch dauernd auf das BT Modul. Jenachdem was empfangen wird wird diese und jene Schleife durchlaufen. Somit erwarte ich eigentlich immer Daten.

Wo kann hier auf der Seite des Empfängers ein Problem auftreten?

flo
 
Zuletzt bearbeitet:
Ich hab keine Ahnung, wie das BT-Modul für den Arduino aufgebaut ist, aber ich kann mir gut vorstellen, dass es nur eine Verbindung gleichzeitig erlaubt und nicht seht fehlertolerant ist, sondern dass du diese Fehlererkennung (sprich, dass die Verbindung geschlossen wurde) selbst durchführen musst. Aber wie gesagt, das ist reine Spekulation.

Wenn du den Socket offen halten willst, er aber im IdleMode sehr schnell einen Timeout liefert, empfiehlt sich ein bisschen Ping/Pong, also einfach NoOps hin und zurück senden, um zu überprüfen ob auf beiden Seiten die Verbindung noch steht.
 
Ja das ist natürlich möglich. Ich werd mir das heute Abend wenn ich von der Arbeit zurück bun ansehen. .. und dann wieder berichten.

lg flo
 
So... Vielen Dank Kevin - du hast mir richtig weitergeholfen. Es funktioniert nun, krass das ich darauf nicht vorher gekommen bin 😉.

Natürlich soll der Socket aktiv bleiben, lediglich den Outputstream sollte ich leeren. Anschließend sollte ich nicht erneut connecten, denn genau hier passiert der Fehler.

Vielen Dank - es funktioniert! =)

flo
 

Neue Themen


Zurück
Oben