Eccoci qua alla seconda parte di "Java e Bluetooth"", oggi vediamo come cercare dispositivi con il bluetooth acceso e che siano visibili. Prima di inziare tutto ciò, dobbiamo parlare dello "stack bluetooh".

I moderni sistemi operativi, come Windows Vista e Linux Ubuntu, contengono dei software già pronto che consente di utilizzare il bluetooth (previa la possessione di una chiavetta bluetooth) in maniera minimale.

Quando acquistate delle chiavette bluetooh, vi viene anche fornito un software dedicato, solitamente demo: esempi sono BluSoleil e Broadcom. L'utilizzo dello stack ovvero del software utilizzato al momento non è fondamentale.

Solo una piccola annotazione: chi utilizza Windows XP può riscontrare problemi (vedi in Internet), quindi vi consiglio di scaricare un software dedicato (esempi sono, per l'appunto, BluSoleil o Broadcom).

A questo punto vediamo un codice minimale per poter eseguire una ricerca e mostrare a video il nome friendly e l'indirizzo di un determinato dispositivo (nome friendly: un nome associtato al dispositivo, non tutti i dispositvi lo hanno vedi per esempio gli auricolari bluetooth).

Questo codice non è mio, sia chiaro, l'ho copiato dal sito originale del progetto: www.bluecove.org

Una sola cosa: per provarlo velocemente create una cartella in cui mettete dentro il file jar (se siete in ambito Windows scaricate bluecove-2.1.0.jar e mettetelo nella cartella appena creata con i file java).

Per chi vuole provare in ambito Linux, ricerchi (o attenda): ci sarà un articolo a lui dedicato.

Ecco qui il codice: Remote Device Discovery

The LocalDevice class provides method 'getDiscoveryAgent' that returns an instance of the DiscoveryAgent. This DiscoveryAgent can then be used to discover remote bluetooth devices (start HCI inquiry).


import java.io.IOException;
import java.util.Vector;
import javax.bluetooth.*;

/**
 * Minimal Device Discovery example.
 */
public class RemoteDeviceDiscovery {

    public static final Vector/**/ devicesDiscovered = new Vector();
    /**
     * Potete anche mettere: public static final Vector devicesDiscovered = new Vector();    
     * E' utile per accedere in modo più efficace alle proprietà di tali 
     */

    public static void main(String[] args) throws IOException, InterruptedException {

        final Object inquiryCompletedEvent = new Object();

        devicesDiscovered.clear();

        DiscoveryListener listener = new DiscoveryListener() {

            public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
                System.out.println("Device " + btDevice.getBluetoothAddress() + " found");
                devicesDiscovered.addElement(btDevice);
                try {
                    System.out.println("     name " + btDevice.getFriendlyName(false));
                } catch (IOException cantGetDeviceName) {
                }
            }

            public void inquiryCompleted(int discType) {
                System.out.println("Device Inquiry completed!");
                synchronized(inquiryCompletedEvent){
                    inquiryCompletedEvent.notifyAll();
                }
            }

            public void serviceSearchCompleted(int transID, int respCode) {
              // Al momento non ci interessa
            }

            public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
              // Al momento non ci interessa 
           }
        };

        synchronized(inquiryCompletedEvent) {
            boolean started = LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, listener);
            if (started) {
                System.out.println("wait for device inquiry to complete...");
                inquiryCompletedEvent.wait();
                System.out.println(devicesDiscovered.size() +  " device(s) found");
            }
        }
    }

}

Vediamo alcune parti interessanti del codice:

# Vector<RemoteDevice> devicesDiscovered: insieme di dispositivi trovati nella ricerca; # btDevice.getBluetoothAddress(): consente di sapere l'indirizzo di ogni dispositivo, è molto interessante! # btDevice.getFriendlyName(false): nome del dispositivo (vedi il javadoc per maggiori informazioni) # catch (IOException cantGetDeviceName): eccezione molto utile: non sempre si riesce a catture il nome del dispositivo # devicesDiscovered.size(): numero dispositivi trovati Altri link utili: http://www.bluecove.org/bluecove/apidocs/overview-summary.html#DeviceDiscovery: qui ho riperito il codice http://code.google.com/p/bluecove/wiki/stacks: limitazioni di ogni software di stack bluetooth (utile per sviluppatori) http://code.google.com/p/bluecove/wiki/Documentation: installazione con la guida del progetto http://www.bluecove.org/project-info.html: informazioni generali del progetto Nel prossimo articolo vedremo come reperire informazioni sui servizi disponibili di un dispositivo e poi, successivamente, vedremo come inviare (e gestire) l'invio di un file (e magari anche di un'immagine con un comando dedicato). Alla prossima! PS: Spero che vi piaccia come argomento... A me tantissimo! =) Mi piacerebbe vedere alcuni vostri pareri, quindi commentate pure!