Come facciamo a comunicare tra APP.
Le App tra loro comunicano con le Intent, Intent implicite, sappiamo che possiamo comunicare in modo indiretto, con O.S. Android che fa da postino.
O.S. Android si occupa tra lo scambio di info, tra le App che si trovano sullo stesso Device.
Le API di O.S. Android, consentono ai dispositivi di connettersi mediante Bluetooth
Wi-Fi, NFC, P2P, USB, SIP*
CONNESSIONI WIRELESS
Ci sono diversi protocolli. Wireless, comunicazioni di reti.
CON QUESTI SERVIZI: si può connettere, scambiare file
BLUETOOTH
Il framework con le Librerie. Ci permettono di scansionare
E’ una delle tecnologie utilizzate attualmente
→ permette di scansionare i dispositivi BT
→ interrogare l’adapter BT locale. (ci sono dispositivi con cui ho già stabilito una connessione)
→ stabilire i canali di comunicazione RFCOMM
→ trasferire dati da dispositivi accoppiati
→ gestire connessioni multiple
BT (Bluetooth) Classico.
Scelta giusta per operazioni che richiedono molto consumo della batteria
BT Low Energy per il basso consumo
LE FASI PER UTILIZZARE IL BLUETOOTH:
→ setup
→ ricerca dei dispositivi accoppiati e non, nell’area locale
→ connessione
→ trasferimento dati tra dispostivi
Stabilire la connessione, tramite il nome della connessione e il DEVICE.
API
android.bluetooth
(sono già all’interno di Android, non dobbiamo importare nulla)
BluetoothHealth è l’API principale
STABILIRE CONNESSIONI? E’ bene chiedere dei permessi.
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
Per abilitare il BLUETOOTH, abilitare il permesso. La nostra APP vuole stabilire una connessione Bluetooth, e deve essere abilitata dall’utente.
Per un Servizio: DISCOVERY → BLUETOOTH_ADMIN
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
Alcune APP chiedono questo permesso, per conoscere i dispositivi presenti, Localmente.
Chi c’è intorno, implementando questo Servizio di Discovery
SETUP
*****
Ci chiede di verificare se il dispositivo è abilitato per il Bluetooth
Bisogna richiedere all’Utente di Abilitare il BLUETOOTH.
Si utilizza il BluetoothAdapater. C’è un SOLO: BLUETOOTH per tutto il SISTEMA.
→ restituisce Null, se il BLUETOOTH non è supportato.
BluetoothAdapter bluE = BluetoothAdapter.getDefaultAdapter();
if (bluE == null)
{
}
Vediamo se il BLUETOOTH è disponibile e se non è Utilizzato da un’altra APP.
Ci si assicura che il BLUETOOTH sia Abilitato chiamano isEnabled()
if (!bluE.isEnabled())
{
}
if (!bluE.isEnabled())
{
Intent enabl = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
}
Se l’utente Risponde, positivamente. E’ sempre l’UTENTE che RISPONDE POSITIVAMENTE.
L’INTENT apre il Gestore delle CONNESSIONI.
E’ un INTENT IMPLICITO.
O.S. Android, ci mette in comunicazione con il GESTORE.
Se l’UTENTE risponde POSITIVAMENTE AI PERMESSI. Il Risultato sarà RESULT_OK
Dall’ onActivityResult(), avremo → RESULT_OK. RESULT_OK è un RESULT CODE
Ricevuto questo RESULT_OK, è possibile iniziare a scansionare i DISPOSITIVI.
Tutto questo è IL: SETUP con ABILITAZIONE DATA
Se invece come OUTPUT: ci ARRIVA dall’INTENT: RESULT_CANCELED, vuol dire che non abbiamo l’autorizzazione.
E’ bene prevedere una Fase, in cui vengono disabilitate le funzionalità che Noi volevano Lanciare.
Perchè l’UTENTE ha chiesto una cosa e poi non mi deve dare, l’AUTORIZZAZIONE?
E’ bene dare una spiegazione, sul perché Stiamo facendo un’operazione.
E’ bene farlo con un Pannello, accennando: per fare la connessione, ho bisogno che venga collegato il BLUETOOTH
E’ bene fare TIPO: un IF con il PANNELLO.
COME SI MONITORA IL BLUETOOTH?
Abbiamo un LISTENER, si mette in ascolto. Si crea un INTENT, un INTENT BROADCAST
INTENT BROADCAST: servono per gestire le comunicazioni, le connessioni.
Quindi per monitorare BLUETOOTH durante il Running dell’APP si crea un Listener di tipo INTENT BROADCAST “ACTION_STATE_CHANGED”.
Questo BROADCAST, contiene dei CAMPI, dei CAMPI di STATI che possono essere MONITORATI.
MONITORARE QUESTI CAMPI DI STATI: porta a capire a che stato si trova la Comunicazione in quel momento.
RICERCA DISPOSITIVI VICINI
→ Dopo aver fatto il SETUP, chiesto i Permessi e attendendo che l’UTENTE ci abbia dato il codice di ABILITAZIONE.
→ abbiamo aperto il PROTOCOLLO Bluetooth che inizia a far la scansione, cioè a inviare delle onde vicine
CON BLUETOOTH ADAPTER, abbiamo la SCAN dell’AREA LOCALE. Ci sono intorno Dispositivi, con cui è possibile (SE LORO VOGLIONO), stabilire una connessione.
AL PROTOCOLLO del BLUETOOTH, interessa il MAC ADDRESS.
MAC ADDRESS: codice univoco associato all’HARDWARE della scheda di Rete.
IL PROTOCOLLO si basa sul MAC ADDRESS.
Dopo aver connesso il dispositivo la prima volta, all’utente è presentata una richiesta di ABBINAMENTO.
Dopo l’Abbinamento, i dati dei dispositivi sono memorizzati e possono essere usati dalle API BT.
C’è differenza tra essere ABBINATI ed ESSERE CONNESSIONI
Ho il MAC ADDRESS del DISPOSITIVO (BLUETOOTH) e quindi possono aprire una comunicazione RADIO-FREQUENZA (RF COMM). E’ un protocollo.
Lanciare segnali attraverso sensori di Radio Frequenza.
Aperto il CANALE? SI. C’è lo scambio dei dati.
RICERCA DISPOSIVITI
Il metodo: startDiscovery() fa partire la ricerca.
E’ un processo Asincrono (Lancia un THREAD), che restituisce TRUE non appena il servizio è partito.
Lo Scan prevede una richiesta di 12 secondi. Si mette in ascolto per 12 secondi.
Per ricevere le info dei DISPOSITIVI l’APP deve registrare un BROADCASTRECEIVER per l’INTENT: ACTION FOUND
L’INTENT contiene questi 2 attributi: EXTRA_DEVICE e EXTRA_CLASS, contenenti un BluetoothDevice e una BluetoothClass
ABILITARE LA VISIBILITA’
per rendere visibile il dispositivo:
startActivityForResult(Intent, ACTION_REQUEST_DISCOVERABLE);
Visibilità: è di 2 minuti di DEFAULT.
Inoltre:
Intent connB = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
connB.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(connB);
Se mettessimo:
Intent connB = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
connB.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivity(connB);
con Lo zero è sempre visibile.
*****
Per creare una connessione tra 2 dispositivi bisogna implementare il meccanismo Server-Side e Client-Side
I dispositivi sono connessi se hanno un BLUETOOTHSOCKET, sullo stesso canale RFCOMM.
Il SOCKET: una presa, una connessione in cui si infila lo spinotto nella presa e c’è lo scambio di dati (per farla breve).
Client e Server ottengono la BluetoothSocket in diversi modi:
il server lo riceve quando è accettata una connessione entrante
il client lo riceve quando apre un canale RFCOMM verso il Server-S
BLUETOOTH SOCKET
Una tecnica per ottenerlo è preparare ciascun DISPOSITIVO per FUNGERE da Server.
Entrambi si abilitano tutti e due come Server.
Appena uno dei due inizia la comunicazione, diventerà Client.
La connessione come CLIENT:
Se i dispositivi non erano abbinati il FRAMEWORK mostrerà un messaggio all’utente per la connessione
→ fa parte di uno dei DISPOSITIVI cercati con il BROADCAST INTENT