Ausgangssituation:
Ich habe eine Hauptanwendung, wo ein Textfester drin ist, welches die Informationen ausgeben soll und die Suche starten soll. Und dann habe ich noch eine Nebenklasse, welche die Kommunikation via Bluetooth übernehmen soll.
Problem:
Ich starte die inqury anfrage, aber Gleichzeitig läuft der Thread auch schon weiter und will die Dienste suchen, da aber noch kein Device gefunden wurde führt er die Suche ja garnicht aus.
Frage:
Wie kann ich nun dafür sorgen, dass mein BluetoothAgent wartet bis alle Geräte gefunden wurden, bzw die Suche beendet wurde. Und er erst dann die Service suche macht?
also hinzufügend sei gesagt, dass die Klasse noch nicht fertig ist.
Quellcodes:
Hauptklasse:
BluetoothAgent:
oder liegt es vlt daran, dass ich versuche nachrichten auf dem Feld auszugeben indem ich die Methode der anderen Klasse über eine Referenz aufrufe. Hab schon versuch das mit synchronized hinzukriegen.
Aber will net.
ich hoffe einer von euch kann mir ne antwort geben.
Auch wenn ich mir net sicher bin ob das Thema zu bluetooth gehört.
Ich habe eine Hauptanwendung, wo ein Textfester drin ist, welches die Informationen ausgeben soll und die Suche starten soll. Und dann habe ich noch eine Nebenklasse, welche die Kommunikation via Bluetooth übernehmen soll.
Problem:
Ich starte die inqury anfrage, aber Gleichzeitig läuft der Thread auch schon weiter und will die Dienste suchen, da aber noch kein Device gefunden wurde führt er die Suche ja garnicht aus.
Frage:
Wie kann ich nun dafür sorgen, dass mein BluetoothAgent wartet bis alle Geräte gefunden wurden, bzw die Suche beendet wurde. Und er erst dann die Service suche macht?
also hinzufügend sei gesagt, dass die Klasse noch nicht fertig ist.
Quellcodes:
Hauptklasse:
Java:
package gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.bluetooth.UUID;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import net.BluetoothAgent;
/**
*
* @author Florian
*/
public class Main extends JFrame implements ActionListener{
private String xml; //XML String enthält die zu stellende Frage
private int fensterBreite, fensterHöhe; //Dimmension des Frames
private boolean fehlerAusgabe = true; //ture = gibt Fehlermeldungen mit aus
JButton startButton, endButton;
JTextArea ausgabefeld;
JPanel buttonPanel;
Thread verbindungsThread;
BluetoothAgent btAgent;
//Konstruktor
public Main(){
//Allgemeine Einstellungen für den JFrame
super("HARS Aplication");
UUID[] uuids = {new UUID("abababababababababababababababab",false)};
btAgent = new BluetoothAgent(this, uuids);
fensterBreite = 800;
fensterHöhe = 500;
setSize(fensterBreite, fensterHöhe);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
//GUI
startButton = new JButton("start");
startButton.addActionListener(this);
endButton = new JButton("stop");
endButton.addActionListener(this);
endButton.setEnabled(false);
ausgabefeld = new JTextArea();
buttonPanel = new JPanel();
buttonPanel.add(startButton);
buttonPanel.add(endButton);
add(buttonPanel,BorderLayout.NORTH);
add(ausgabefeld,BorderLayout.CENTER);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
//Umfrage starten
if(e.getSource()==startButton){
starteUmfrage();
}
//Umfrage beenden
if(e.getSource()==endButton){
beendeUmfrage();
}
}
/**
* Geht alle Nötigen Schritte durch um eine Umfrage zu starten.
* Wird aufgerufen nachdem auf den Start Button gedrückt wurde.
*/
private void starteUmfrage(){
endButton.setEnabled(true);
startButton.setEnabled(false);
verbindungsThread = new Thread(btAgent);
verbindungsThread.start();
}
/**
* Baut eine Verbindung als Server auf.
* @return StreamConnection Objekt bei erfolgreichem Verbindungs aufbei<br />
* sonst null
*/
/*
private StreamConnection getConnection(){
try{
if(!(local.getDiscoverable()==DiscoveryAgent.GIAC)){
local.setDiscoverable(DiscoveryAgent.GIAC);
ausgabefeld.append("Gerät ist nun Auffindbar.\n");
}else
ausgabefeld.append("Gerät ist Auffindbar.\n");
//Verbindung eröffnen
//IO Exception tritt auf wenn Verbindung nicht aufgebaut werden kann
String uuid = "abababababababababababababababab";
String sicherheit = "authenticate=false;";
String conString = "btspp://localhost:"+uuid+";"+sicherheit;
StreamConnectionNotifier notifier = (StreamConnectionNotifier)Connector.open(conString);
return notifier.acceptAndOpen();
}catch(BluetoothStateException bse){
//Sichtbarmachen fehlgeschlagen
ausgabefeld.append("Gerät kann nicht sichtbar gemacht werden.\n");
if(fehlerAusgabe){
ausgabefeld.append(bse.getMessage()+"\n");
}
}catch(IOException ioe){
//Verbindung fehlgeschlagen
ausgabefeld.append("Verbindung fehlgeschlagen\n");
if(fehlerAusgabe){
ausgabefeld.append(ioe.getMessage()+"\n");
ioe.printStackTrace();
}
}
return null; //Sollte irgendein Fehler aufgetreten sein.
}*/
/**
* Geht alle Nötigen Schritte durch um eine Umfrage zu beenden.
* Wird aufgerufen nachdem auf den Start Button gedrückt wurde.
*/
private void beendeUmfrage(){
//finishConnection();
verbindungsThread = null;
ausgabefeld.append("Suche gestoppt.\n");
startButton.setEnabled(true);
endButton.setEnabled(false);
}
/**
* Schreibt eine Zeite in das Textfeld
*
* @param args
*/
public synchronized void print(String text){
ausgabefeld.append(text);
}
public synchronized void println(String text){
ausgabefeld.append(text+"\n");
}
//Main Methode
public static void main(String[] args){
new Main();
}
}
BluetoothAgent:
Java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package net;
import gui.Main;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Vector;
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.StreamConnection;
/**
*
* @author Florian
*/
public class BluetoothAgent implements DiscoveryListener, Runnable{
//BoolscherWert, der festlegt ob eine Nachricht gesendet werden darf
private boolean sendeErlaubnis;
//BoolscherWert, der festlegt ob eine Nachricht empfangen werden darf
private boolean empfangsErlaubnis;
//Datenstrom vom Partner
private DataInputStream inStream = null;
//Datenstrom zum Partner
private DataOutputStream outStream = null;
//Verbindung zum Partner
private StreamConnection connection;
//Lokales Bluetoothgerät
private LocalDevice local;
//Discovery Agent
private DiscoveryAgent agent;
//Liste für gefundene Geräte
private Vector<RemoteDevice> devList = new Vector<RemoteDevice>();
//Liste mit den Gefundenen Services
private Vector<ServiceRecord> serList = new Vector<ServiceRecord>();
//UUIDs der Services nach denen gesucht werden soll
UUID[] uuids;
//Refrenz zum aufrufenden Programm
Main main;
public BluetoothAgent(Main main, UUID[] uuids) {
try{
local = LocalDevice.getLocalDevice();
agent = local.getDiscoveryAgent();
}catch(BluetoothStateException bse){
//Fehler beim Ermitteln des lokalen Gerätes
}
this.main = main;
this.uuids = uuids;
}
public Vector<RemoteDevice> getDevList() {
return devList;
}
public Vector<ServiceRecord> getSerList() {
return serList;
}
/**
* Wird aufgerufen nachdem ein Gerät entdeckt wurde.
* Sofern dieses Gerät noch nicht in der Liste ist wird es ihr
* hinzugefügt.
* @param remoteDev das gefundene Gerät
* @param dc
*/
public void deviceDiscovered(RemoteDevice remoteDev, DeviceClass dc) {
//Meldung, welches gerät gefunden wurde
try{
print("Gerät \""+remoteDev.getFriendlyName(true)+"\" gefunden. ");
}catch(IOException ioe){
print("Unknown Gerät gefunden. ");
}
//Überprüfen ob Gerät in der Liste
if(!devList.contains(remoteDev)){
//Gerät der Liste hinzufügen
devList.add(remoteDev);
print("Gerät der Liste hinzugefügt. \n");
}else{
print("Gerät schon in der Liste. \n");
}
}
public void inquiryCompleted(int i) {
switch(i){
case DiscoveryListener.INQUIRY_COMPLETED:
//Suche erfolgreich abgeschlossen
print("Suche abgeschlossen.\n");
print("Es wurden "+devList.size()+" Geräte gefunden.\n");
break;
case DiscoveryListener.INQUIRY_TERMINATED:
//Suche wurde abgebrichen
print("Suche vorzeitig beendet.\n");
break;
case DiscoveryListener.INQUIRY_ERROR:
//Bei der Suche ist ein fehler aufgetreten
break;
}
}
public void servicesDiscovered(int i, ServiceRecord[] srs) {
for(ServiceRecord rec : srs){
serList.add(rec);
}
}
public void serviceSearchCompleted(int i, int i1) {
switch(i){
case DiscoveryListener.SERVICE_SEARCH_COMPLETED:
//Suche erfolgreich abgeschlossen
println("Suche nach Diensten erfolgreich beendet");
println("Es wurden "+devList.size()+" Geräte gefunden.\n");
break;
case DiscoveryListener.SERVICE_SEARCH_ERROR:
//Suche wurde abgebrichen
print("Suche vorzeitig beendet.\n");
break;
case DiscoveryListener.INQUIRY_ERROR:
//Bei der Suche ist ein fehler aufgetreten
break;
}
}
public void run() {
try{
if(!(local.getDiscoverable()==DiscoveryAgent.GIAC)){
local.setDiscoverable(DiscoveryAgent.GIAC);
println("BT-Gerät wurde sichtbar gemacht.");
}else
println("BT-Gerät ist sichtbar.");
println("Suche nach anderen BT-Geräten wird gestartet.");
}catch(BluetoothStateException bse){
//Sichtbarmachen fehlgeschlagen
println("Eigenes BT-Gerät kann nicht sichtbar gemacht werden.\n");
}
//Suche nach Geräten starten
try{
agent.startInquiry(DiscoveryAgent.GIAC, this);
}catch(BluetoothStateException bse){
//Fehler bei der Gerätesuche
}
//Suche nach Diensten starten
int[] attrSet = null;//Null weil nur standart Attribute gefragt sind
//Suche aufrufen
System.out.println(devList.size());
try{
System.out.println(devList.get(1).getFriendlyName(true));
}catch(IOException ioe){
System.out.println("fehler");
}
for(int i = 0 ; i < devList.size() ; i++){
try{
try{
print("Servicesuche für Gerät "+devList.get(i).getFriendlyName(true)+" gestartet." );
}catch(IOException ioe){
println("Suche nach Service für unknown Gerät gestartet.");
}
agent.searchServices(attrSet, uuids, devList.get(i), this);
}catch(BluetoothStateException bse){
//Suche für Gerät i fehlgeschlagen.
try{
println("Servicesuche für Gerät "+devList.get(i).getFriendlyName(true)+" nicht möglich." );
}catch(IOException ioe){
println("Suche nach service für unknown Gerät nicht möglich.");
}
}
}
while(true){
if(sendeErlaubnis){
;
}
if(empfangsErlaubnis){
;
}
}
}
private void finishConnection(){
try{
if(inStream != null) inStream.close();
if(outStream != null) outStream.close();
if(connection != null) connection.close();
}catch(IOException ioe){
print(ioe.getMessage());
}
}
/*
* Schreibt eine Nachricht im Aufrufenden Programm, diese muss
* jedoch die Methode <code>print(String)</code> implementiert haben
*/
private synchronized void print(String message){
main.print(message);
}
/*
* Schreibt eine Nachricht im Aufrufenden Programm, diese muss
* jedoch die Methode println(String) implementiert haben
*/
private synchronized void println(String message){
main.print(message+"\n");
}
}
oder liegt es vlt daran, dass ich versuche nachrichten auf dem Feld auszugeben indem ich die Methode der anderen Klasse über eine Referenz aufrufe. Hab schon versuch das mit synchronized hinzukriegen.
Aber will net.
ich hoffe einer von euch kann mir ne antwort geben.
Auch wenn ich mir net sicher bin ob das Thema zu bluetooth gehört.