Utilizarea Bluetooth în Android

Platforma Android oferă dezvoltatorilor o capabilități de comunicare bogate. Pentru a lucra cu Bluetooth din Android include un API puternic, care permite ușor de a scana zona înconjurătoare pentru prezența dispozitivelor gata de reconectare, transfer de date între dispozitive, și mai mult.

Lucrul cu Bluetooth este format din patru faze: instalarea de setări adaptor Bluetooth, căuta dispozitive disponibile pentru conectarea, configurarea conexiunii, transfer de date.

Prezentare generală API-ul Android Bluetooth

API-ul Bluetooth este situat în paketeandroid.bluetooth. Se compune din mai multe clase:

În acest articol nu vom îngropa în esența de a lucra cu dispozitive Bluetooth medicale și să se concentreze pe primele patru clase.

Instalarea adaptorului Bluetooth din setările Android

Dacă decideți să se angajeze în capacitățile de modulul Bluetooth program, trebuie să în primul rând, conectați pachetul API corespunzător.

În plus, necesitatea de a obține permisiunea de aplicare a utiliza modulul Bluetooth. Pentru a face acest lucru, adăugați o linie la manifestul programului

Dacă doriți să utilizați critic în ceea ce privește caracteristicile de siguranță, cum ar fi schimbarea numelui dispozitivului, este necesar să se dea o rezolutie BLUETOOTH_ADMIN mai puternic:

La rezoluția BLUETOOTH_ADMIN, trebuie să specificați și Bluetooth.

Chiar dacă dispozitivul este echipat cu Bluetooth, este posibil să nu fie disponibile, deoarece utilizatorul doar oprit. Pentru a verifica disponibilitatea Bluetooth este isEnabled metoda (). Dacă aparatul este oprit, puteți solicita utilizatorului să-l activați.

În cazul în care utilizatorul a consimțit la includerea adaptorului în valoarea variabilă va fi înregistrată enableBtIntent RESULT_OK. În caz contrar - RESULT_CANCELED.

În cazul în care cererea are permisiunea BLUETOOTH_ADMIN, puteți schimba numele dispozitivului Bluetooth folosind metoda

BluetoothAdapter.getState () metoda este utilizată pentru a afișa starea adaptorului. Această metodă poate returna una dintre următoarele valori:

STATE_TURNING_ON
STATE_ON
STATE_TURNING_OFF
STATE_OFF

De multe ori, în scopul de a conserva energia bateriei Bluetooth este dezactivată în mod implicit. Următorul cod creează un mesaj care informează utilizatorul despre starea adaptorului:

Organizare de căutare dispozitive Bluetooth disponibile

Cu clasa BluetoothAdapter, puteți găsi dispozitivul Bluetooth de la distanță, executați o scanare sau a solicita o listă de dispozitive asociate.

Este necesar să se facă distincția între noțiunea de dispozitive asociate și conectate. Aparatele asociate știu doar despre unul pe altul, au o cheie de legătură care pot fi folosite pentru autentificare, și sunt capabili de a crea o conexiune criptată unul cu celălalt. Dispozitivele Unite împărtășesc un canal de radio și poate transmite date între ele. Actualul API de implementare Bluetooth necesită ca dispozitivele sunt împerecheate înainte de conectare. (Împerecherea se realizează automat atunci când porniți o conexiune criptată prin API Bluetooth)

Solicitarea de conectare de la aparatul asociat

Căutați dispozitive

Pentru a începe scanarea spectrului radio pentru prezența dispozitivelor disponibile pur și simplu apel metoda startDiscovery (). Scanarea are loc într-un flux separat asincron. Metoda returnează true, în cazul în care scanare de start-up a fost de succes. De obicei, procesul de scanare durează aproximativ 10-15 secunde. Pentru a obține informații despre dispozitivele găsite, aplicația trebuie să se înregistreze pentru BroadcastReceiver ACTION_FOUND intenție. Această intenție este numită pentru fiecare dintre dispozitivele găsite. Intentie conține câmpuri suplimentare și EXTRA_DEVICE EXTRA_CLASS, care conțin obiecte și BluetoothDevice BluetoothClass respectiv.

Porniți Bluetooth din aplicația

Dacă doriți să primiți notificări, atunci când schimbă vizibilitatea dispozitivului, înregistrați pentru BroadcastReceiver ACTION_SCAN_MODE_CHANGED intenție. câmpuri suplimentare EXTRA_SCAN_MODE EXTRA_PREVIOUS_SCAN_MODE și să furnizeze informații despre noua și vechea stare, respectiv. Ele pot lua valorile SCAN_MODE_CONNECTABLE_DISCOVERABLE, SCAN_MODE_CONNECTABLE sau SCAN_MODE_NONE. Prima valoare indică faptul că dispozitivul este disponibil pentru căutare. Al doilea - dispozitivul nu este disponibil pentru căutare, dar este capabil să accepte conexiuni. Al treilea - nu căutate și nu poate accepta conexiuni.

compus dispozitiv

Atunci când desfășurat unul dintre ele va acționa ca un server, care este de a păstra o BluetoothServerSocket deschisă. Scopul server - să aștepte o cerere pentru o conexiune de intrare, iar atunci când se confirmă pentru a crea BluetoothSocket. După aceea puteți închide BluetoothServerSocket. Luați în considerare procedura de conectare eliminate din punctul de vedere al serverului:

  1. Ia-BluetoothServerSocket metoda de asteptare listenUsingRfcommWithServiceRecord (String, UUID). Primul parametru al metodei este un nume descriptiv al serviciului. Sistemul se adauga automat la serviciul de baze de date Discovery Protocol (SDP). De obicei, acest parametru indică pur și simplu numele aplicației. Al doilea parametru identifică, de asemenea, serviciul. Acest parametru este utilizat de către client la confirmarea conexiunii.
  2. Obținerea de a asculta cereri de conectare prin metoda accept (). Aceasta este o metodă de blocare care returnează un rezultat sau atunci când conexiunea este confirmată, sau atunci când are loc o excepție. Compusul este confirmat atunci când unitatea de la distanță trimite o cerere de conectare la UUID, specificat în priza server de înregistrare. Daca va avea succes, să accepte () returnează o conexiune configurată BluetoothSocket.
  3. Dacă doriți să luați o conexiune suplimentară, apelați metoda închidere (). Acest lucru va conduce la eliberarea de priză și toate resursele, dar conexiunea este BluetoothSocket închisă. Spre deosebire de TCP / IP, RFCOMM permite doar să lucrați cu un client pe canal, astfel încât, în cele mai multe cazuri, are sens pentru a apela metoda de închidere () după setarea priza de adoptare felie.

Deoarece metoda accept () este blocat, nu este necesar să se determine fluxul de activitate principal, deoarece acest lucru se va închide pe termen nelimitat interfață. De obicei, toate lucrările cu BluetoothServerSocket și BluetoothSocket efectuate într-un fir separat. Pentru a ieși metoda de a accepta (), apelați metoda aproape () la BluetoothServerSocket (sau BluetoothSocket) din orice alt fir în aplicația dumneavoastră.

Mai jos este un exemplu al unui mecanism de instrumente flux descris mai sus de lucrări

În acest exemplu, se presupune că doar o singură conexiune poate fi stabilită, iar după ce conexiunea este confirmată și BluetoothSocket primit, aplicația trimite fluxul său individual acoperă BluetoothServerSocket și în afara buclei.

Rețineți că atunci când acceptă () returnează BluetoothSocket, priza este deja conectat, astfel încât nu este nevoie să se conecteze apela metoda ().

manageConnectedSocket () este o metodă în care pentru a crea flux de date pentru transmisie. Punerea sa în aplicare este posibil vor fi discutate mai jos.

Trebuie să închideți BluetoothServerSocket imediat după aerul de ascultare pentru prezența unei conexiuni de intrare. În metoda din exemplul apropiat () se numește imediat după primirea BluetoothSocket obiect. De asemenea, poate fi necesar pentru a opri o BluetoothSocket privată metodă publică.

Pentru a inițializa o conexiune la dispozitivul de la distanță (un dispozitiv care păstrează un server socket deschis), aveți nevoie pentru a obține BluetoothDevice obiect care conține informațiile cu privire la aceasta. Acest obiect este folosit pentru a obține și a inițializa compus BluetoothSocket.

Vom descrie procedura de conectare:

  1. Obținem BluetoothSocket cauzează metoda BluetoothDevice.createRfcommSocketToServiceRecord (UUID). Valoarea parametrului UUID ar trebui să se potrivească cu valoarea specificată în listenUsingRfcommWithServiceRecord serverul de apel.
  2. Inițializeze compus apel metoda connect (). După apelarea acestei metode, sistemul va efectua o căutare PSD de pe dispozitivul de la distanță pentru a mapa UUID. Daca va avea succes, sub rezerva cererea de confirmare din partea de server pentru a fi deschis canalul RFCOMM. Acesta este un apel de blocare. Dacă din anumite motive, conexiunea va fi rupt și se va anula (aproximativ 12 secunde), excepția va fi aruncat.


Ca și în cazul accepta, conectați () metoda ar trebui să fie realizată într-un fir separat, în caz contrar pot apărea interfața podvisanie.

Notă. Înainte de a apela conectați (), asigurați-vă că în acest moment nu există nici o scanare pentru a căuta dispozitive disponibile. În cazul executării simultane a acestor operațiuni, conexiunea va fi stabilită mult mai lent, și nu riscă să îndeplinească timeout.

Aici este un exemplu de aplicație client care inițializează compusul

Pentru a opri scanarea eter cauzat metoda cancelDiscovery (). Înainte de a apela la această metodă este posibil să se verifice dacă există prin isDiscovering Scan ().

transfer de date

După conectarea cu succes, fiecare dintre dispozitivele conectate are BluetoothSocket obiect, care este ușor de implementat transmisia / recepția de date:

  1. Cu getInputStream () și getOutputStream () obiecte Semi InputStream si OutputStream, transmisie de control asupra unei prize.
  2. Citiți și scrieți fluxul de date folosind tehnici de citire (byte []) și scrie (byte []).

Trebuie să utilizați un fir separat pentru a citi și scrie date. Acest lucru este important, deoarece metodele de citire (byte []) și de scriere (byte []) blochează și apel în fluxul principal poate paraliza programul. Bucla principală în fluxul separat trebuie să citească datele de la InputStream. Pentru a scrie la OutputStream are sens pentru a crea o metodă publică separată.

Traducere: Alexander Ledkov
Sursa: developer.android.com