Bluetooth / Synchronisation : Problem mit einer Bluetoothanwendung

florian1x

Aktives Mitglied
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:

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.
 

Murray

Top Contributor
Momentan merkt man nicht, wenn bei startInquiry ein Fehler auftritt; in dem Fall würde das Programm sofort weiterlaufen. Ein Minimum an Fehlerbehandlung wäre:
Java:
        //Suche nach Geräten starten
        try{
            agent.startInquiry(DiscoveryAgent.GIAC, this);
        }catch(BluetoothStateException bse){
            //Fehler bei der Gerätesuche
            bse.printStackTrace( System.out);
        }
 

florian1x

Aktives Mitglied
Ein Fehler tritt ja nicht auf. Ich werde es zwar mal einbauen aber das Problem is ja nur dass mein Programm nicht wartet bis das Query abgeschlossen ist. Wobei ich habe gerade eine simple Lösung ich mach den methoden aufruf einfach in inquiryCompleted rein
 

Murray

Top Contributor
Ein Fehler tritt ja nicht auf.
Woher willst du das wissen? Durch den leeren Catch-Block wird doch alles verschluckt. Ich behaupte ja nicht, dass ein Fehler auftritt; wenn es aber so ist, dann würde es das Verhalten erklären.
Die Frage ist allerdings, ob startInquiry überhaupt eine blockierende Funktion ist (sollte aus der Doku hervorgehen); wenn nicht, dann muss man das anders machen. Und wenn es schon ein inquiryCompleted gibt, dann ist das wohl in der Tat eine gute Stelle für Aktionen, die nach dem Ende der Suche laufen sollen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Strings über Bluetooth zwischen PC,µc oder Samrtphone senden und empfangen Allgemeine Java-Themen 0
Bluedaishi Input/Output Bluetooth Bondrucker MZ220 keine Verbindung Allgemeine Java-Themen 0
Bluedaishi Java bluetooth Drucker ansteuern Allgemeine Java-Themen 0
H Communication API Bluetooth Allgemeine Java-Themen 2
J Klassen Bluetooth Devices Allgemeine Java-Themen 3
Lazybone Bluetooth Allgemeine Java-Themen 2
G Sensoren für USB oder Bluetooth? Allgemeine Java-Themen 3
W Java und Bluetooth Allgemeine Java-Themen 4
T Seriell über Bluetooth Allgemeine Java-Themen 8
F Bluetooth! Jede Antwort hilft! Allgemeine Java-Themen 3
T Synchronisation einer Textdatei im Groupshare Allgemeine Java-Themen 1
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
K Threads - Swing - Synchronisation nötig? Allgemeine Java-Themen 8
K Thread Synchronisation Allgemeine Java-Themen 8
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
T Project Synchronisation Allgemeine Java-Themen 4
B Ausgabe auf der Konsole bei Nebenläufigkeit, Threads und Synchronisation Allgemeine Java-Themen 8
B Nebenläufigkeit, Threads und Synchronisation Allgemeine Java-Themen 10
R Konzept eines Software-Rollout/Synchronisation via WebService Allgemeine Java-Themen 5
H Thread Synchronisation. mutex.lock(); und mutex.unlock(); Allgemeine Java-Themen 4
S Synchronisation von Threads Allgemeine Java-Themen 7
T problem mit synchronisation Allgemeine Java-Themen 4
G Links zum Thema Synchronisation Allgemeine Java-Themen 7
H LRUMap und Synchronisation Allgemeine Java-Themen 5
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
S synchronisation einer Methode abhängig vom Parameter Allgemeine Java-Themen 10
S Threads und Synchronisation Allgemeine Java-Themen 3
A Synchronisation Datenquelle und Anwendung (Multi-User) Allgemeine Java-Themen 7
A Daten-Synchronisation Client <-> Datenquelle (DB) ? Allgemeine Java-Themen 6
C Synchronisation aber trotzdem parallel lesen Allgemeine Java-Themen 2
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben