Bluetooth Low Energy (LE) ist zwar eine relativ neue Technologie, hat sich jedoch bereits als vielseitiges und nützliches Kommunikationsmedium erwiesen. Das Gerät kann zum drahtlosen Verbinden von Geräten verwendet werden, ermöglicht es jedoch auch Geräten, als Beacons und Broadcast-Daten zu fungieren.
In diesem Tutorial erfahren Sie mehr über die BluetoothLeAdvertiser
Diese Klasse ermöglicht es Entwicklern, aus einem unterstützten Telefon einen Bluetooth LE-Beacon zu machen, ohne dass zusätzliche Hardware erforderlich ist. Sie erfahren auch, wie Sie nach Bluetooth LE-Ankündigungsdaten suchen, damit Sie in Ihren eigenen Anwendungen entsprechend reagieren können. Sie können die Quelldateien für dieses Lernprogramm auf GitHub herunterladen.
Für dieses Lernprogramm können Sie mit dem Erstellen eines leeren leeren Projekts in Android Studio beginnen. Sie müssen die minimale SDK-Version auf festlegen 21 in deiner build.gradle Datei, da Bluetooth LE-Werbung erst bei Lollipop auf Android eingeführt wurde. Obwohl es einige Möglichkeiten gibt, APIs einzuhüllen, die vor SDK 21 nicht unterstützt werden, werden sie in diesem Lernprogramm nicht behandelt. Wir werden uns nur auf die neue Technologie konzentrieren.
defaultConfig applicationId "com.tutsplus.bleadvertising" minSdkVersion 21 targetSdkVersion 23 VersionCode 1 Versionsname "1.0"
Als Nächstes müssen Sie dem Projekt drei Berechtigungen hinzufügen AndroidManifest.xml. Die ersten beiden ermöglichen die Bluetooth-Kommunikation und die dritte Berechtigung, ACCESS_COARSE_LOCATION
, ist eine neue Voraussetzung für die Verwendung von Bluetooth auf Android 6.0-Geräten und höher.
Wenn Sie auf einem Gerät entwickeln, auf dem Android 6.0 oder höher ausgeführt wird, benötigt Ihre App die vom Benutzer erteilte Standortberechtigung. Anweisungen dazu finden Sie unter Grundlegendes zu Berechtigungen in Android M, die ich Anfang des Jahres geschrieben habe. Der Einfachheit halber wird in diesem Lernprogramm einfach die Erlaubnis vom Android-App-Info-Bildschirm erteilt.
Jetzt, da Sie die Berechtigung haben, auf alles zuzugreifen, was Ihre Anwendung benötigt, ist es Zeit, die Layout-Datei zu erstellen. Öffnen activity_main.xml und erstellen Sie ein einfaches Layout mit zwei Schaltflächen und einer Textansicht.
Die Zwei Taste
Objekte werden verwendet, um Werbung oder Entdeckung zu starten. Das Textvorschau
wird verwendet, um die bei der Erkennung gefundenen Daten anzuzeigen. Wenn Sie die Layoutdatei ausgefüllt haben, können Sie sie schließen und öffnen MainActivity.java. In dieser Datei müssen Sie zunächst die Implementierung für hinzufügen View.OnClickListener
das wird von den Tasten verwendet.
public class MainActivity erweitert AppCompatActivity implementiert View.OnClickListener @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); @Override public void onClick (Ansicht v) if (v.getId () == R.id.discover_btn) discover (); else if (v.getId () == R.id.advertise_btn) advertise ();
In obigem onClick (Ansicht v)
Methode, werben()
und entdecken()
werden später in diesem Tutorial definiert. Sie können jetzt Stubs für diese Methoden hinzufügen, damit Ihre App kompiliert werden kann. Als Nächstes müssen Sie Mitgliedsvariablen oben in der Klasse erstellen, um die Schaltflächen und die Textansicht zu verfolgen.
private TextView mText; private Schaltfläche mAdvertiseButton; private Schaltfläche mDiscoverButton;
Wenn Sie Ihre Ansichten definiert haben, müssen Sie sie in initialisieren onCreate (Bundle SavedInstanceState)
und verdrahten sie jeweils Taste
bis zum OnClickListener
Sie haben zuvor definiert.
@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mText = (TextView) findViewById (R.id.text); mDiscoverButton = (Button) findViewById (R.id.discover_btn); mAdvertiseButton = (Button) findViewById (R.id.advertise_btn); mDiscoverButton.setOnClickListener (this); mAdvertiseButton.setOnClickListener (this);
Vergewissern Sie sich schließlich, dass das von Ihnen oder Ihren Benutzern verwendete Gerät mehrere Ankündigungen unterstützt. Während die für die Werbung als Peripheriegerät benötigten Softwarefunktionen bei Lollipop verfügbar sind, müssen Hersteller auch einen Bluetooth-Chipsatz verwenden, der Werbung unterstützt.
Wenn Bluetooth LE-Werbung nicht unterstützt wird, sollten Sie die beiden Schaltflächen in Ihrer Anwendung deaktivieren. Diese Funktion funktioniert zwar auf dem Nexus 6, 5X, 6P und 9, es gibt jedoch auch andere Telefone, die Bluetooth LE-Werbung unterstützen. Weitere Geräte werden weiterhin hergestellt, da die Hersteller neuere Telefone und Tablets erstellen.
if (! BluetoothAdapter.getDefaultAdapter (). isMultipleAdvertisementSupported ()) Toast.makeText (dies ist "Mehrere Werbung nicht unterstützt", Toast.LENGTH_SHORT) .show (); mAdvertiseButton.setEnabled (false); mDiscoverButton.setEnabled (false);
Um Werbung über Bluetooth LE zu starten, müssen Sie die BluetoothLeAdvertiser
vom Android BluetoothAdapter
. Das kannst du im tun werben()
Methode, die aufgerufen wird, wenn auf die Werbeschaltfläche geklickt wird.
Werbetreibender für BluetoothLeAdvertiser = BluetoothAdapter.getDefaultAdapter (). GetBluetoothLeAdvertiser ();
Sobald Sie Ihre haben BluetoothLeAdvertiser
, Sie legen die Einstellungen fest, die für die Werbung verwendet werden, z. B. die Stromstärke, die die Antenne bei der Übertragung verwenden soll, und wie oft das Gerät Werbung machen soll. Das AdvertiseSettings.Builder
In class können Sie außerdem festlegen, ob das mobile Gerät verbindbar sein soll. Dadurch können Sie viel mehr Daten zwischen Geräten streamen.
AdvertiseSettings settings = new AdvertiseSettings.Builder () .setAdvertiseMode (AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) .setTxPowerLevel (AdvertiseSettings.ADVERTISE_TX_POWER_HIGH) .setConnectable (false) .build ();
Sie werden feststellen, dass dieses Beispiel Werbung mit hoher Signalstärke (TX-Leistung) und niedriger Latenzzeit ist. Dies macht Ihr Gerät schnell auffindbar, kann jedoch auch viel Batterie beanspruchen, was bei der Entwicklung im mobilen Bereich ein kostbares Gut ist.
Es gibt andere Optionen für den Werbemodus. Das ADVERTISE_MODE_LOW_POWER
Option ist die Standardeinstellung für Werbung und überträgt die wenigsten häufig, um die meiste Energie zu sparen. Das ADVERTISE_MODE_BALANCED
Option versucht, Energie zu sparen, ohne zu lange zwischen Anzeigen zu warten.
Die Sendeleistung kann auf extrem niedrig, niedrig, mittel oder hoch eingestellt werden. Jede Ebene entspricht der Sichtbarkeit eines Bluetooth LE-Werbepakets, wobei die genauen Bereiche von der Gerätehardware abhängen.
Als Nächstes definieren Sie eine UUID, die zum Identifizieren Ihrer Pakete verwendet wird, wenn sie angekündigt werden. Sie können eine neue UUID erstellen, indem Sie die verwenden uuidgen Dienstprogramm von der Befehlszeile aus.
CDB7950D-73F1-4D4D-8E47-C090502DBD63
Während dieses Dienstprogramm eine 128-Bit-UUID erstellt, verwendet das Android-System nur 16-Bit-UUIDs für die Ankündigung und passt eine 128-Bit-UUID automatisch an. Im obigen Beispiel wäre die 16-Bit-UUID 950D. Speichern Sie anschließend die 128-Bit-UUID als Zeichenfolge strings.xml.
CDB7950D-73F1-4D4D-8E47-C090502DBD63
Sobald Sie Ihre UUID erstellt haben, ist es Zeit, die ParcelUuid
, AdvertiseData
Objekt und sendet einige zusätzliche Daten als zusätzlichen Dienst. In diesem Beispiel übertragen Sie nur den Namen des Geräts und die Zeichenfolge "Daten"
(die in ein Byte-Array umgewandelt werden müssen), da die Größe Ihrer Werbepakete ziemlich begrenzt ist.
ParcelUuid pUuid = new ParcelUuid (UUID.fromString (getString (R.string.ble_uuid))); AdvertiseData data = new AdvertiseData.Builder () .setIncludeDeviceName (true) .addServiceUuid (pUuid) .addServiceData (pUuid, "Data" .getBytes (Charset.forName ("UTF-8")));
Das letzte, was Sie tun, um über Bluetooth LE mit Ihrem Gerät zu werben, ist das Erstellen eines Rückrufs, der auf Erfolg oder Misserfolg bei der Werbung aufmerksam macht und dann über das Internet zu werben beginnt BluetoothLeAdvertiser
.
AdvertiseCallback advertisingCallback = new AdvertiseCallback () @Override public void onStartSuccess (AdvertiseSettings settingsInEffect) super.onStartSuccess (settingsInEffect); @Override public void onStartFailure (int errorCode) Log.e ("BLE", "Advertising onStartFailure:" + errorCode); super.onStartFailure (errorCode); ; Advertiser.startAdvertising (Einstellungen, Daten, AdvertisingCallback);
An diesem Punkt sollten Sie in der Lage sein, Ihre App auszuführen und über Bluetooth LE zu werben. Im nächsten Schritt dieses Lernprogramms werden jedoch Anzeigen ermittelt, sodass Sie diese Informationen anzeigen können.
Bevor Sie mit dem Erkennen von Bluetooth LE-Diensten beginnen, müssen Sie oben in Ihrer Klasse einige weitere Mitgliedsvariablen hinzufügen.
privater BluetoothLeScanner mBluetoothLeScanner; privater Handler mHandler = neuer Handler ();
mBluetoothLeScanner
dient zum Scannen nach Bluetooth LE-Paketen und mHandler
steuert einen kleinen Timer, der die Erkennung nach einer bestimmten Zeit stoppt.
Zusätzlich zu diesen Member-Variablen müssen Sie eine neue erstellen ScanCallback
an der Spitze Ihrer Klasse, so dass später in Ihrer Anwendung eine innere Klasse auf sie zugreifen kann. Dieser Rückruf empfängt das Ergebnis einer erkannten akzeptablen Werbung und zeigt den Namen des Werbegeräts und die zugehörigen Daten in einer Textansicht an.
private ScanCallback mScanCallback = new ScanCallback () @Override public void onScanResult (Ergebnis von int callbackType, ScanResult) super.onScanResult (callbackType, Ergebnis); if (result == null || result.getDevice () == null || TextUtils.isEmpty (result.getDevice (). getName ()) zurückgeben; StringBuilder-Builder = neuer StringBuilder (result.getDevice (). GetName ()); builder.append ("\ n"). anfügen (neuer String (result.getScanRecord (). getServiceData (result.getScanRecord (). getServiceUuids (). get (0)), Charset.forName ("UTF-8")) ); mText.setText (builder.toString ()); @Override public void onBatchScanResults (List.)Ergebnisse) super.onBatchScanResults (Ergebnisse); @Override public void onScanFailed (int errorCode) Log.e ("BLE", "Discovery onScanFailed:" + errorCode); super.onScanFailed (errorCode); ;
Als nächstes initialisieren mBluetoothLeScanner
im onCreate (Bundle SavedInstanceState)
Wie nachfolgend dargestellt.
mBluetoothLeScanner = BluetoothAdapter.getDefaultAdapter (). getBluetoothLeScanner ();
Nachdem Sie den Bluetooth-Scanner initialisiert haben, können Sie damit beginnen, den Bluetooth-Scanner auszuarbeiten entdecken()
Methode. Für diese Beispielanwendung erstellen Sie eine ScanFilter
Objekt und legen Sie es in ein Liste
damit Ihre Anwendung nur auf die Werbepakete antwortet, an denen Sie interessiert sind.
ScanFilter filter = new ScanFilter.Builder () .setServiceUuid (new ParcelUuid (UUID.fromString (getString (R.string.ble_uuid)))) .build (); filters.add (filter);
Sie müssen auch ein erstellen Scaneinstellungen
Objekt, das ähnlich arbeitet wie das AdvertiseSettings
Objekt, das Sie zuvor in diesem Lernprogramm erstellt haben.
ScanSettings settings = new ScanSettings.Builder () .setScanMode (ScanSettings.SCAN_MODE_LOW_LATENCY) .build ();
Sobald Sie Ihre Filter, Einstellungen und Rückrufe eingerichtet haben, können Sie mit der Erkennung von Bluetooth LE-Anzeigen beginnen.
mBluetoothLeScanner.startScan (Filter, Einstellungen, mScanCallback);
Wenn Sie Ihre Anwendung jetzt auf zwei Geräten ausführen, die sowohl Bluetooth LE-Ankündigungen unterstützen als auch eines für die Ankündigung und das andere für die Erkennung festlegen, sollte das Ermittlungsgerät den Werbetreibenden finden und die angekündigten Daten anzeigen. Der folgende Screenshot zeigt einen Nexus 5X, der einen Werbe-Nexus 6 entdeckt.
Als letztes müssen Sie ein neues erstellen Lauffähig
Objekt und verknüpfen Sie es mit mHandler
. Der Handler wartet zehn Sekunden und startet dann die Lauffähig
das stoppt die Entdeckung. Der Grund dafür ist, dass die Entdeckung die Batterie des Geräts schnell entladen kann. Sie möchten nur versuchen, Werbepakete für kurze Zeit zu entdecken oder wenn Sie ein Werbegerät erwarten.
mHandler.postDelayed (neues lauffähig () @Override public void run () mBluetoothLeScanner.stopScan (mScanCallback);, 10000);
Während dieses Beispiel nicht besonders anschaulich ist, haben Sie gerade eine voll funktionsfähige App erstellt, die über Bluetooth LE bewirbt, damit andere Geräte sie erkennen und Daten übertragen können. Obwohl in diesem Lernprogramm mit Android Werbung und Entdeckungen durchgeführt wurden, können Sie eine ähnliche App für iOS erstellen, um Daten auf beiden Plattformen gemeinsam zu nutzen oder ein eigenes Bluetooth LE-fähiges Gerät zu erstellen, das mit Mobiltelefonen und Tablets interagieren kann.
Da diese Technologie weiter wächst und in jedermanns Taschen integriert wird, gibt es unendlich viele Möglichkeiten für Entwickler, wirklich interessante Dinge zu machen. Weitere Informationen zum Arbeiten mit zusätzlicher Bluetooth-Technologie unter Android finden Sie unter Erstellen eines Bluetooth-Scanners mit der Bluetooth-API von Android von Matthew Kim.