PDA

View Full Version : Bluetooth in Java: problema discovery.


boysna
19-01-2007, 22:03
Ciao ragazzi, tutto bene? Io ho un piccolo problema col Bluetooth in Java. Mi sto avvicinando avvicinando alle librerie javax.bluetooth da poco e ho un problema semplice: devo fare il discovery dei dispositivi bluetooth ma mi rileva sempre lo stesso dispositivo, anche se si trova spento.

Vi posto la classe con il main:

import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;

public class MyTest {

public static void main(String[] args) {

DiscoveryAgent agent;

int i=0;
while(i!=1){
try {
MyDiscoveryListener myDiscovery = new MyDiscoveryListener();
agent = LocalDevice.getLocalDevice().getDiscoveryAgent();
boolean complete = agent.startInquiry(DiscoveryAgent.PREKNOWN, myDiscovery);
System.out.println("Stato inquiry: "+ complete);
i++;

}
catch (Exception e) {}
}
}
}



Mentre questo è la classe MyDiscoveryListener:

import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;


public class MyDiscoveryListener implements DiscoveryListener {

public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass arg1) {

System.out.println("remote device discovered:"+remoteDevice.getBluetoothAddress());
}

public void inquiryCompleted(int arg0) {
System.out.println("Inquiry completed");

}

public void serviceSearchCompleted(int arg0, int arg1) {
// TODO Auto-generated method stub

}

public void servicesDiscovered(int arg0, ServiceRecord[] arg1) {
// TODO Auto-generated method stub

}

}



Qualcuno sa dirmi cosa non va? Aiutatemi please...

boysna
20-01-2007, 16:51
Posto il codice dela classe myTest un po in maniera piu pulita.


package de.avetana.bluetooth;


import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.BluetoothStateException;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;

public class MyTest {

public static void main(String[] args) {

try{
LocalDevice localdevice = LocalDevice.getLocalDevice();
DiscoveryAgent discoveryagent = localdevice.getDiscoveryAgent();

MyDiscoveryListener myDisc = new MyDiscoveryListener();
discoveryagent.startInquiry(DiscoveryAgent.GIAC,myDisc);
}
catch(Exception e){
e.printStackTrace();
}
}
}

boysna
21-01-2007, 14:06
Ragazzi ho trovato un codice Java che implementa proprio quello che serve a me, ma con funzioni aggiuntive. Si chiama "Avetana Bluetooth"
Ho preso solo la parte che serve per fare il discovery e ho fatto il mio codice che ora vi posto:

e package de.avetana.bluetooth;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.UUID;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import de.avetana.bluetooth.util.IntDeviceFinder;
import de.avetana.bluetooth.util.ServiceFinderPane;


public class JSRTest extends JFrame implements ActionListener {

private ServiceFinderPane m_servicePanel;
private JPanel m_rightPanel;
private JSplitPane m_split;
private DiscoveryAgent m_agent;
private LocalDevice m_local;

public static void main(String[] args) throws Exception {
JSRTest JSRTest1 = new JSRTest();
}

public JSRTest() throws Exception {

super ("Avetana Bluetooth Utility");

try {
m_local=LocalDevice.getLocalDevice();
m_agent=m_local.getDiscoveryAgent();
jbInit();
pack();
setLocationRelativeTo(null);
setVisible (true);

}
catch(Exception ex) {JOptionPane.showMessageDialog(null, "An error occured while loading the application!", "Error",JOptionPane.ERROR_MESSAGE);
ex.printStackTrace();
System.exit(0);
}
}


private void jbInit() throws Exception {

Container con = this.getContentPane();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


JPanel sdp=new JPanel();
sdp.setLayout(new BorderLayout());

//Parte dove stanno i risultati del discovery
m_servicePanel=new ServiceFinderPane(this,"lastBTSearchRFComm", new UUID[]{new UUID("3", true)});
m_split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, m_servicePanel,m_rightPanel);
sdp.add(m_split, BorderLayout.CENTER);
con.add(sdp, BorderLayout.CENTER);
this.m_servicePanel.m_select.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
}


}


Funziona bene ma ho due domande da farvi:
1 - nel PAnel mi rileva solo i dispositivi realmente accesi me nella console escono sempre tutti quelli che ha trovato in precedenza
2 - se nelle vicinanze c'è un nuovo dispositivo che non ha mai trovato, anche se è acceso non lo trova. Solo dopo aver fatto il discovery con il software della chiavetta bluetooth che ho sul pc me lo trova e comincia a funzionare bene rilevando il nuovo dispotivo quando è On, e non rilevandolo quando è OFF.

Qualcuno sa spiegarmi come mai?

Grazie.