Create en Bluetooth Scanner Med Android Bluetooth API
22
Del
14
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Bluetooth har blitt en svært populær teknologi, spesielt på mobile enheter. Det er en teknologi for å oppdage og overføre data mellom enheter i nærheten. Nesten alle moderne mobile enheten har Bluetooth-funksjonalitet i disse dager. Hvis du ønsker å lage en app grensesnitt med en annen Bluetooth-enhet, alt fra telefoner til høyttalerne, må du vite hvordan du bruker Android Bluetooth API.
I denne opplæringen, vil vi være å gjøre en app som er lik den innebygde Bluetooth app i Android innstillinger. Den vil inneholde følgende funksjoner:
aktivere Bluetooth på en enhet
vise en liste over sammenkoblede enheter
oppdage og liste nærliggende Bluetooth-enheter
Vi vil også gå over det grunnleggende for å koble til og sende data til en annen Bluetooth-enhet. Jeg har opprettet et prosjekt for å få oss i gang, som du kan laste ned fra GitHub. Skjermbildet under illustrerer hva starteren prosjektet ser ut. Hvis du får problemer eller får problemer, så kan du ta en titt på det ferdige prosjektet på GitHub.
1. Aktivering av Bluetooth
Før vi kan aktivere Bluetooth på en Android-enhet, må vi be om de nødvendige tillatelser. Vi gjør dette i appens manifest. BLUETOOTH tillatelsen innebærer at vår app for å koble til, koble fra, og overføre data med en annen Bluetooth-enhet. Den BLUETOOTH_ADMIN tillatelsen innebærer at vår app for å oppdage nye Bluetooth-enheter og endre Bluetooth-innstillingene enhetens
< manifest xmlns:. Android = "http://schemas.android.com/apk/res/android" pakke = "com.tutsplus.matt.bluetoothscanner" > < bruker-tillatelse android: name = "android.permission.BLUETOOTH" /> < bruker-tillatelse android: name = "android.permission.BLUETOOTH_ADMIN" />
Vi vil bruke Bluetooth-adapter til grensesnitt med Bluetooth. Vi instantiate adapteren i ListActivity klassen. Hvis kortet er null, betyr dette Bluetooth støttes ikke av enheten og applikasjonen vil ikke fungere på den aktuelle enheten. Vi håndterer denne situasjonen ved å vise et varsel dialog for brukeren og spennende app
Overrideprotected void onCreate (Bundle savedInstanceState) {... BTAdapter = BluetoothAdapter.getDefaultAdapter (.); //Telefonen ikke støtter Bluetooth så la brukeren vite og exit. if (BTAdapter == null) {new AlertDialog.Builder (denne) .setTitle ("Ikke kompatibel") .setMessage ("Telefonen støtter ikke Bluetooth") .setPositiveButton ("Exit", ny DialogInterface.OnClickListener () {public ugyldig onClick (dialog DialogInterface, int som) {System.exit (0);}}) .setIcon (android.R.drawable.ic_dialog_alert) .vis (); }}
Hvis Bluetooth er tilgjengelig på enheten, trenger vi å aktivere den. For å aktivere Bluetooth, starter vi en intensjon gitt til oss av Android SDK, BluetoothAdapter.ACTION_REQUEST_ENABLE. Dette vil presentere en dialogboks for brukeren, ber dem om tillatelse til å aktivere Bluetooth på enheten. REQUEST_BLUETOOTH er en statisk heltall vi satt til å identifisere aktiviteten forespørsel
public class ListActivity strekker ActionBarActivity implementerer DeviceListFragment.OnFragmentInteractionListener {public static int REQUEST_BLUETOOTH = 1.; ... Beskyttet void onCreate (Bundle savedInstanceState) {... hvis {Intent enableBT = new Intent (BluetoothAdapter.ACTION_REQUEST_ENABLE) (BTAdapter.isEnabled ()!); startActivityForResult (enableBT, REQUEST_BLUETOOTH); }}}
2. Innhenting av en liste over sammenkoblede enheter
I dette trinnet, vi skanne etter Bluetooth-enheter og viser dem i en liste. I sammenheng med en mobil enhet, kan en Bluetooth-enhet enten være:
ukjent
paret
koblet
Det er viktig å vite forskjellen mellom en paret og en tilkoblet Bluetooth-enhet. Sammenkoblede enheter er klar over hverandres eksistens og dele en kobling nøkkel, som kan brukes til å autentisere, noe som resulterer i en forbindelse. Enheter blir automatisk koblet sammen når en kryptert tilkobling er opprettet.
Tilkoblede enheter dele en RFCOMM kanal, slik at de kan sende og motta data. En enhet kan ha mange sammenkoblede enheter, men det kan bare være koblet til én enhet om gangen.
Bluetooth-enheter er representert ved BluetoothDevice objektet. En liste over sammenkoblede enheter kan fås ved å påkalle de getBondedDevices () metoden, som returnerer et sett med BluetoothDevice stedene. Vi påberope getBondedDevices () metoden i DeviceListFragment sin onCreate () -metoden
public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState.); Log.d ("DEVICELIST", "Super kalt for DeviceListFragment onCreate \\ n"); deviceItemList = new Arraylist < DeviceItem > (); Still < BluetoothDevice > pairedDevices = bTAdapter.getBondedDevices ();}
Vi bruker getName () og getAddress () metoder for å få mer informasjon om Bluetooth-enheter. Den getName () metoden returnerer den offentlige identifikator av enheten mens getAddress () metoden returnerer enhetens MAC-adresse, en identifikator entydig identifiserer enheten.
Nå som vi har en liste over de sammenkoblede enheter, vi skaper en DeviceItem objekt for hver BluetoothDevice objekt. Vi deretter legge til hver DeviceItem objekt til en rekke navngitt deviceItemList. Vi vil bruke dette array å vise listen over sammenkoblede Bluetooth-enheter i vår app. Koden for å vise listen over DeviceItem objekter er allerede til stede i start prosjektet
if (pairedDevices.size () > 0) {for (BluetoothDevice enhet: pairedDevices). {DeviceItem newDevice = new DeviceItem (device.getName ( ), device.getAddress (), "false"); deviceItemList.add (newDevice); }}
3. Oppdage nærliggende Bluetooth-enheter
Det neste trinnet er å oppdage enheter enheten er ikke koblet sammen med ennå, ukjente enheter, og legg dem til i listen over sammenkoblede enheter. Vi gjør dette når brukeren kraner skanneknappen. Koden for å håndtere dette ligger i DeviceListFragment.
Vi må først gjøre en BroadcastReceiver og overstyre OnReceive () -metoden. Den OnReceive () metoden startes når en en Bluetooth-enhet er funnet.
OnReceive () metoden tar en intensjon som sin andre argument. Vi kan kontrollere hva slags hensikt kringkaster med ved å kalle getAction (). Dersom handlingen er BluetoothDevice.ACTION_FOUND, da vet vi at vi har funnet en Bluetooth-enhet. Når dette skjer, skaper vi en DeviceItem objekt med enhetens navn og MAC-adresse. Til slutt legger vi DeviceItem objektet til ArrayAdapter å vise det i vår app.
Public class DeviceListFragment strekker Fragment implementerer AbsListView.OnItemClickListener {... privat endelige BroadcastReceiver bReciever = new BroadcastReceiver () {public void OnReceive (Context kontekst, Intent hensikt) {String action = intent.getAction (); if (BluetoothDevice.ACTION_FOUND.equals (handling)) {BluetoothDevice device = intent.getParcelableExtra (BluetoothDevice.EXTRA_DEVICE); //Opprett en ny enhet element DeviceItem newDevice = new DeviceItem (device.getName (), device.getAddress (), "false"); //Legg det til vår adapter mAdapter.add (newDevice); }}};}
Når skanneknappen er slått på, må vi rett og slett for å registrere mottakeren vi bare gjort og påkalle startDiscovery () -metoden. Hvis skanneknappen er slått av, avregistrere vi mottakeren og påberope cancelDiscovery (). Husk at oppdagelsen tar opp mye ressurser. Hvis søknaden forbinder med en annen Bluetooth-enhet, bør du alltid avbryte funn før tilkobling.
Vi fjerner også ArrayAdapter objekt, mAdapter, når oppdagelsen begynner. Når vi starte skanningen, ønsker vi ikke å inkludere gamle enheter som kan ikke lenger være innenfor rekkevidde av enheten.
Offentlig Vis onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Vis view = inflater.inflate (R .layout.fragment_deviceitem_list, container, false); ToggleButton skanne = (ToggleButton) view.findViewById (R.id.scan); ... Scan.setOnCheckedChangeListener (ny CompoundButton.OnCheckedChangeListener () {public void onCheckedChanged (CompoundButton buttonView, boolsk isChecked) {IntentFilter filter = new IntentFilter (BluetoothDevice.ACTION_FOUND); if (isChecked) {mAdapter.clear (); getActivity () .registerReceiver (bReciever, filter), bTAdapter.startDiscovery ();} else {getActivity () unregisterReceiver (bReciever);. bTAdapter.cancelDiscovery ();}}});}
Det var det. Vi har avsluttet vår Bluetooth skanneren.
4. Koble til en enhet
Bluetooth-tilkoblinger fungerer som enhver annen forbindelse. Det er en server og en klient, som kommuniserer via RFCOMM stikkontakter. På Android, er RFCOMM stikkontakter representert som en BluetoothSocket objekt. Heldigvis for oss, det meste av den tekniske koden for servere håndteres av Android SDK og tilgjengelig via Bluetooth API.
Koble som en klient er enkel. Din første innhente RFCOMM kontakten fra den ønskede BluetoothDevice ved å ringe createRfcommSocketToServiceRecord (), passerer i en UUID, en 128-bits verdi som du oppretter. UUID er lik et portnummer.
For eksempel, la oss anta at du gjør en chat app som bruker Bluetooth til å chatte med andre nærliggende brukere. For å finne andre brukere til å chatte med, ville du ønsker å se etter andre enheter med chat app installert. For å gjøre dette, vil vi se etter UUID i listen over tjenester av enheter i nærheten. Ved hjelp av en UUID til å lytte og godta Bluetooth-tilkoblinger legger automatisk at UUID til telefonens liste over tjenester, eller service oppdagelse protokollen.
Når BluetoothSocket er opprettet, du Call Connect () på BluetoothSocket. Dette vil klargjøre en forbindelse med BluetoothDevice gjennom RFCOMM kontakten. Når vår enhet er tilkoblet, kan vi bruke kontakten for å utveksle data med den tilkoblede enheten. Å gjøre dette er lik en hvilken som helst standard server gjennomføring.
Opprettholde en Bluetooth-tilkobling er kostbart, så vi trenger å lukke kontakten når vi ikke lenger trenger det. Å lukke kontakten kaller vi close () på BluetoothSocket
Følgende kodebit viser hvordan du kobler til en gitt BluetoothDevice.
Public class ConnectThread strekker Tråd {private BluetoothSocket bTSocket; public boolean koble (BluetoothDevice bTDevice, UUID mUUID) {BluetoothSocket temp = null; try {temp = bTDevice.createRfcommSocketToServiceRecord (mUUID); } Catch (IOException e) {Log.d ("CONNECTTHREAD", "Kunne ikke opprette RFCOMM socket:" + e.toString ()); return false; } Try {bTSocket.connect (); } Catch (IOException e) {Log.d ("CONNECTTHREAD", "Kan ikke koble til:" + e.toString ()); try {bTSocket.close (); } Catch (IOException nært) {Log.d ("CONNECTTHREAD", "Kunne ikke nær sammenheng:" + e.toString ()); return false; }} Return true; } Public boolean avbryte () {try {bTSocket.close (); } Catch (IOException e) {Log.d ("CONNECTTHREAD", "Kunne ikke nær sammenheng:" + e.toString ()); return false; } Return true; }}
Koble som en server er litt vanskeligere. Først fra din BluetoothAdapter, må du få en BluetoothServerSocket, som vil bli brukt til å lytte etter en tilkobling. Dette brukes kun for å få forbindelsen er delt RFCOMM socket. Når tilkoblingen er opprettet, er serveren socket ikke lenger trenger og kan lukkes ved å ringe close () på den.
bruke et server socket ved å ringe listenUsingRfcommWithServiceRecord (String navn, UUID mUUID). Denne metoden tar to parametre, et navn av typen String og en unik identifikator av type UUID. Navnet parameter er navnet vi gi tjenesten når den er lagt til telefonens SDP (Service Discovery Protocol) oppføring. Den unike identifikatoren skal samsvare med UUID klienten prøver å koble er å bruke.
Vi kaller deretter godta () på den nylig innhentet BluetoothServerSocket å vente på en tilkobling. Når akseptere () kallet returnerer noe som ikke er null, vi tilordne den til vår BluetoothSocket, som vi deretter kan bruke til å utveksle data med den tilkoblede enheten.
Følgende kodebit viser hvordan å godta en tilkobling som en server:
public class ServerConnectThread strekker Tråd {private BluetoothSocket bTSocket; offentlig ServerConnectThread () {} public void acceptConnect (BluetoothAdapter bTAdapter, UUID mUUID) {BluetoothServerSocket temp = null; try {temp = bTAdapter.listenUsingRfcommWithServiceRecord ("tjenestenavn", mUUID); } Catch (IOException e) {Log.d ("SERVERCONNECT", "Kan ikke hente en BluetoothServerSocket:" + e.toString ()); } While (true) {try {bTSocket = temp.accept (); } Catch (IOException e) {Log.d ("SERVERCONNECT", "Kan ikke godta en innkommende tilkobling."); gå i stykker; } If (! BTSocket = null) {try {temp.close (); } Catch (IOException e) {Log.d ("SERVERCONNECT", "Kan ikke lukke Server:" + e.toString ()); } gå i stykker; }}} Public void closeConnect () {try {bTSocket.close (); } Catch (IOException e) {Log.d ("SERVERCONNECT", "Kunne ikke nær sammenheng:" + e.toString ()); }}}
Lese og skrive til tilkoblingen er gjort ved hjelp av bekker, Input og OutputStream. Vi kan få en henvisning til disse strømmene ved å ringe getInputStream () og getOutputStream () på BluetoothSocket. Å lese fra og skrive til disse bekkene, kaller vi leser () og skrive () henholdsvis
Følgende kodebit viser hvordan du gjør dette for en enkelt heltall.
Public class ManageConnectThread strekker Tråd {public ManageConnectThread () {} public void senddata (BluetoothSocket socket, int data) kaster IOException {ByteArrayOutputStream output = ny ByteArrayOutputStream (4); output.write (data); OutputStream outputStream = socket.getOutputStream (); outputStream.write (output.toByteArray ()); } Public int receiveData (BluetoothSocket socket) kaster IOException {byte [] buffer = new byte [4]; ByteArrayInputStream innspill = new ByteArrayInputStream (buffer); Inputinput = socket.getInputStream (); inputStream.read (buffer); returnere input.read (); }}
Du kan finne både eksempler i det ferdige prosjektet på GitHub
Konklusjon
Vi har nå laget vår egen Bluetooth scanner og lært følgende:.
< li> be om de nødvendige Bluetooth tillatelser
Aktiver Bluetooth på telefonen
få en liste over sammenkoblede enheter
skanne og vise en liste over Bluetooth-enheter
opprette en Bluetooth-forbindelse mellom to enheter
sende og motta data via Bluetooth
Bruk gjerne koden i det ferdige prosjektet på GitHub og endre den i dine egne applikasjoner .