2015-05-24 12 views
5

Sto utilizzando due dispositivi Android 5.0 per comunicare tramite Bluetooth Low Energy e ho wan't:BLE con Android 5.0: come ottenere un dispositivo che funga da server AND centrale?

  • dispositivo 1 di agire come centrale e Server.

  • Dispositivo 2 di agire come periferico e Client.


questo è il comportamento che vorrei realizzare:

1) Dispositivo 2 inizia pubblicità (ruolo periferico).

2) Il dispositivo 1 avvia la scansione (ruolo centrale) e ottiene il dispositivo pubblicitario (oggetto BluetoothDevice) tramite il metodo onScanResult di ScanCallback.

3) Ora voglio il dispositivo di pubblicità (Device 2) venga informato che è stato digitalizzato ed essere in grado di ottenere il BluetoothDevice associato con il dispositivo 1.

4) Il dispositivo 1 presenta un'istanza di BluetoothGattServer. Il dispositivo 2 chiamerebbe connectGatt (contesto contestuale, auto-connessione booleana, callback BluetoothGattCallback) sul dispositivo 1 per ottenere un'istanza di BluetoothGatt.

5) Alla fine, il dispositivo 1 è server e il dispositivo 2 è client.


Finora ho trovato che nella fase 2, una volta dispositivo 1 detiene il BluetoothDevice per il dispositivo 2, può collegarsi solo come cliente come al punto 4 utilizzando connectGatt.

potrei essere in grado di utilizzare il BluetoothGattServer definita dispositivo 1, e chiamare: (dispositivo BluetoothDevice, boolean connessione automatica) gattServer.connect con dispositivo essendo dispositivo 2.

Ma come sarà Al dispositivo 2 viene notificato che è stato collegato a?

E come faccio a ottenere un'istanza di BluetoothGatt in Device 2 se non riesco a chiamare connectGatt (Context, booleano, BluetoothGattCallback) su un BluetoothDevice?

Grazie in anticipo per il vostro aiuto!

Alcuni documentazione:

BluetoothGattServer

BluetoothDevice

+0

Ciao Thomas, hai trovato alcuna soluzione al vostro problema? – Hollerweger

+0

Ciao Hollerweger, purtroppo non ho mai trovato la soluzione. Era per un progetto all'università, ho finito per dimostrare il mio lavoro con due telefoni e ho spiegato perché non poteva funzionare con quel microcontrollore specifico. Mi sono laureato da allora e non gli ho dato più tempo. Tuttavia potrebbe valere la pena controllare se qualcosa è cambiato con Android 6. Per favore fatemi sapere se capite qualcosa! ;) –

risposta

0

Devi girare intorno un po '. Lo scanner è quello che si collega all'inserzionista. Dev1 scansiona dev2 adv e scansiona la risposta.allora dev1 dovrebbe connettersi. Dev2 riceverà la funzione di callback al momento della connessione. Non c'è una funzione di richiamata quando qualcuno ascolta la tua risposta all'avviso o la richiesta di scansione su Android. Controllare invece 0x14 «Elenco di UUID di sollecitazione servizi a 16 bit» da btsig se si desidera pubblicizzare la richiesta di server con un determinato servizio per connettersi all'utente. È un po 'strano vedere questo usato.

+0

Ciao Henrik, grazie per la tua risposta. –

+0

Vuoi dire dev1 dovrebbe aprire un BluetoothGattServer e quindi chiamare gattServer.connect (device2, boolean)? La connessione funziona durante il debug di dev1 quando lo faccio. Il problema è: l'unico modo per ottenere e istanza di BluetoothGatt in dev2 e l'implementazione della richiamata è tramite BluetoothDevice.connectGatt (contect, boolean, callback). E non posso farlo in dev2 senza sapere chi è dev1. –

1

1) Il dispositivo 2 inizia la pubblicità (ruolo periferico).

ruolo periferico farà pubblicità, assicuratevi di aggiungere COLLEGABILE

 AdvertiseSettings.Builder settingBuilder = new AdvertiseSettings.Builder(); 
    settingBuilder.setConnectable(true); 

E iniziare pubblicità di conseguenza.

2) Il dispositivo 1 avvia la scansione (ruolo centrale) e ottiene il dispositivo pubblicitario (oggetto BluetoothDevice) tramite il metodo onScanResult di ScanCallback.

Perfetto, ora chiama connectGatt su questo dispositivo (periferica), assicurati di interrompere l'annuncio dopo aver ottenuto il dispositivo richiesto, altrimenti finirai per inviare più comandi di connessione.

3) Ora voglio il dispositivo di pubblicità (Device 2) venga informato che è stato digitalizzato ed essere in grado di ottenere il BluetoothDevice associato con dispositivo 1.

Quando si chiama connectGatt da Central/cliente ruolo, la tua periferica riceverà una notifica in il suo BluetoothGattServerCallback'onConnectionStateChange.

lì saprai che la connessione è stata effettuata. anche se devi registrare gatt Service con caratteristiche sul lato periferico.

4) Il dispositivo 1 ha un'istanza di BluetoothGattServer. Il dispositivo 2 chiamerebbe connectGatt (contesto contestuale, auto-connessione booleana, callback BluetoothGattCallback) sul dispositivo 1 per ottenere un'istanza di BluetoothGatt.

In caso contrario, il dispositivo 1 avvierà la connessione come indicato al punto 3. verrà chiamato il dispositivo onConnectionStateChange per sapere che la connessione è stata effettuata.

5) Alla fine, Dispositivo 1 è Server e Dispositivo 2 è Client.

sbagliato, dispositivo 2 è periferico (Server), dispositivo 1 è Monitor (Client)

+0

Ho già implementato questa soluzione e la mia app funziona bene su entrambi i lati. Il problema è che non corrisponde al comportamento che sto cercando di ottenere.Quello che sto cercando di fare con Device 2 è quello di emulare uno specifico microcontrollore che NON può cercare dispositivi ma può solo fare pubblicità. (Pertanto, il dispositivo 2 deve essere periferico GAP e il dispositivo 1 deve essere centrale GAP). Tuttavia, il mio telefono (dispositivo 1) invia i dati al microcontrollore (dispositivo 2), che rende il dispositivo 1 un server Gatt e il dispositivo 2 un client Gatt. –

+0

Quanto sopra è secondo le definizioni trovate in ** Ruoli e responsabilità ** qui: [BLE Android] (https://developer.android.com/guide/topics/connectivity/bluetooth-le.html) Che uso pensi che il seguente metodo possa essere? BluetoothGattServer.connect (dispositivo BluetoothDevice, autoConnect booleano) –

+0

BluetoothGattServer.connect può essere utilizzato per la connessione, se autoConnection è true e il ruolo server/monitor vede un evento disconnesso. – AAnkit

Problemi correlati