Abgesehen von denen, die normalerweise Apps entwickeln, wird Bluetooth Low Energy für elektronische Arbeiten usw. verwendet. Für diejenigen, die sagen "Ich möchte ein wenig beißen" (hauptsächlich ich), ist die BLE-API von Android etwas schwierig zu bedienen.
Ich dachte, es sei eine schwierige Sache, verschiedene Dinge zu tun, und entwickelte sie mit dem Ziel, eine Bibliothek zu erstellen, die so einfach wie möglich verwendet werden kann.
Dies ist eine Bibliothek, die die Bedienung vereinfacht und Grundkenntnisse über BLE erfordert. Wir empfehlen, Erste Schritte mit Bluetooth Low Energy (Hersteller: PROJEKTE) Kevin Townsend zu lesen.
Für diejenigen, die daran gewöhnt sind, RxAndroidBLE und Bletia: Behandeln Sie Android BLE mit moderner API items / 374d532a252c15aeb484) wird empfohlen. Es ist wahrscheinlich viel sauberer und hat keine Fehler.
... Warum hast du so eine Bibliothek gemacht?
Die gesamte asynchrone Verarbeitung im Zusammenhang mit BLE der Android-API wurde in ** synchrone Verarbeitung geändert. ** ** ** Ursprünglich hätte ich Versprechen verwenden sollen, aber ich habe der Einfachheit Priorität eingeräumt.
Wenn Sie beispielsweise mit BBC micro: bit kommunizieren möchten, können Sie dies mit dem folgenden Code tun. (Eigentlich müssen Sie es in einem von der Benutzeroberfläche getrennten Thread ausführen.)
private LazyBLEWrapper ble = new LazyBLEWrapper();
private final String LEDServiceUUID = "E95DD91D-251D-470A-A062-FA1922DFA9A8";
private final String LEDTextCharacteristicUUID = "E95D93EE-251D-470A-A062-FA1922DFA9A8";
private final String ButtonServiceUUID = "E95D9882-251D-470A-A062-FA1922DFA9A8";
private final String ButtonACharacteristicUUID = "E95DDA90-251D-470A-A062-FA1922DFA9A8";
private final String UARTServiceUUID = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
private final String UARTTxCharacteristicUUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E";
private final String UARTRxCharacteristicUUID = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E";
private final int timeout = 30*1000;
//Scan. Es ist eine Präfixübereinstimmung
BluetoothDevice device = ble.scanDevice(this,"BBC micro:bit", timeout);
//Verbindung
ble.connect(this,device, timeout);
//Rufen Sie zurück, wenn die Verbindung getrennt ist(Irgendein)
ble.setDisconnectCallback(new LazyBLEWrapper.DisconnectCallback() {
@Override
public void onDisconnect() {
Log.e(TAG,"Disconnected!");
}
});
//Geführt"Hello World"Und schreibe
ble.writeData("Hello World",LEDServiceUUID,LEDTextCharacteristicUUID, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT,timeout);
//Erfasst den Status des Tastendrucks und zeigt ihn an
Integer dat = ble.readDataInt(ButtonServiceUUID,ButtonACharacteristicUUID,BluetoothGattCharacteristic.FORMAT_UINT8,0,timeout);
Log.d(TAG, dat.toString());
//Benachrichtigung festlegen
ble.setNotify(ButtonServiceUUID,ButtonACharacteristicUUID,true,timeout);
//Anzeige einstellen
ble.setIndicate(UARTServiceUUID,UARTTxCharacteristicUUID,true,timeout);
//Rückruf einstellen. Dies wird von UIThread ausgeführt.
ble.setNotificationCallback(new LazyBLEWrapper.NotificationCallback() {
@Override
public void onNotification(BluetoothGattCharacteristic characteristic) {
if(ble.isMatchCharacteristicUUID(characteristic,ButtonACharacteristicUUID)) {
Integer ButtonA = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0);
Log.d(TAG, ButtonA.toString());
}
if(ble.isMatchCharacteristicUUID(characteristic,UARTTxCharacteristicUUID)) {
Log.d(TAG, characteristic.getStringValue(0));
}
}
});
//UART-Übertragung
ble.writeData("Hello UART\n",UARTServiceUUID,UARTRxCharacteristicUUID,BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT,timeout);
//Trennen
ble.disconnect(timeout);
//ble.forceDisconnect();
Wenn Sie Deep-Funktionen verwenden möchten, sollten Sie zunächst die Standard-API verwenden, um die Funktionen einzugrenzen Wir haben es implementiert und uns einfach auf ** häufig verwendete Funktionen ** konzentriert.
Der Anwendungsfall ist also
Nur.
Da es sich um eine synchrone Methode handelt, können Sie sie in einem einfachen Ablauf schreiben. (Obwohl Threads erforderlich sind) Da es nicht asynchron ist, haben alle Methoden mit Latenz eine Timeout-Spezifikation.
Als Bonus ist auch der Prozess des Erwerbs detaillierter Standortinformationen enthalten, der bei Verwendung von BLE unter Android 6.0 oder höher erforderlich ist.
Charakteristische Operationen (setValue, getValue usw.) zum Zeitpunkt der Benachrichtigung sind daher nicht enthalten Es verwendet Standard-Android-API-Methoden.
Grundsätzlich, weil es so konzipiert ist, dass das Android BLE API-Objekt so zurückgegeben wird, wie es ist Wenn Sie kleine Dinge tun möchten, können Sie die API dafür verwenden.
Hier herunterladen Der Einfachheit halber wird Android 5.0 oder höher nicht unterstützt. Die Lizenz ist eine zlib-Lizenz.
Wir haben den Vorgang nur unter Nexus 5X (Android 8.0) bestätigt.
Um die Implementierung zu vereinfachen, werden auch Terminaleinstellungen und Laufzeitberechtigungsbeziehungen bereitgestellt. Es ist in Ordnung, diese Methoden in einem UI-Thread auszuführen. (Es wird ohne Wartezeit abgeschlossen.)
v0.13: Sie behalten den Kontext nicht mehr intern bei, daher müssen Sie den Kontext oder die Aktivität übergeben.
//Überprüfen Sie, ob die BLE-Funktion des Terminals aktiviert ist. Vor der Kommunikation etc.
boolean isBluetoothFeatureEnabled()
//Fordern Sie an, die Bluetooth-Funktion des Terminals zu aktivieren.
void requestTurnOnBlueTooth(AppCompatActivity activity)
//Überprüfen Sie, ob das Terminal die BLE-Funktion unterstützt.
boolean isBluetoothFeatureSupported(Context context)
//Überprüfen Sie, ob Sie über detaillierte Standortberechtigungen verfügen.
//Erforderlich für den BLE-Scan.
boolean isPermitted(Context context)
//Fordern Sie detaillierte Standortberechtigungen an.
//Ursprünglich wird es von Activity durchgeführt und es wird nicht empfohlen, aber vorerst kann es verwendet werden, wenn es problematisch ist, z. B. beim Erstellen eines Prototyps.
//Ursprünglich ist es notwendig, die Absicht zu empfangen und zu verarbeiten, aber es funktioniert ohne sie, sodass sie nicht implementiert wird. Bitte implementieren Sie auf der Aktivitätsseite.
void permissionRequest(AppCompatActivity activity)
Vorerst habe ich es auf die folgenden drei Typen eingegrenzt, und ich frage mich, ob das alles ist, was ich brauche.
v0.13: Sie behalten den Kontext nicht mehr intern bei, daher müssen Sie den Kontext oder die Aktivität übergeben. Außerdem wurde es so geändert, dass der UI-Thread intern die BLE-bezogene Verarbeitung aufruft.
//Scannen Sie die umgebenden Peripheriegeräte.
//Fahren Sie mit dem Scannen fort, bis die Zeit abgelaufen ist. ArrayList in der Reihenfolge der Erkennung<BluetoothDevice>Aufbewahren und zurücksenden.
//Wenn nicht gefunden, werden 0 Listen zurückgegeben.
ArrayList<BluetoothDevice> scanDevice(Context context, int timeOut) throws IOException
//Scannen Sie die umgebenden Peripheriegeräte.
//Überprüft den Gerätenamen mit einer Präfixübereinstimmung und gibt sofort das erste übereinstimmende Gerät zurück.
//Wenn nicht gefunden, wird eine Ausnahme ausgelöst.
BluetoothDevice scanDevice(Context context, String deviceName, int timeOut) throws IOException
//Anschlussverklebung(Paarung)Suchen Sie aus der Liste der abgeschlossenen Peripheriegeräte.
//Überprüft den Gerätenamen mit einer Präfixübereinstimmung und gibt sofort das erste übereinstimmende Gerät zurück.
//Wenn nicht gefunden, wird null zurückgegeben.
BluetoothDevice scanBondedDevice(String deviceName)
Es scheint mühsam zu sein, mit GATT-Objekten umzugehen (viele Rückrufe), also habe ich es gehalten. Daher ist es einfach und hat keinen Rückgabewert.
v0.13: Sie behalten den Kontext nicht mehr intern bei, daher müssen Sie den Kontext oder die Aktivität übergeben. Außerdem wurde es so geändert, dass der UI-Thread intern die BLE-bezogene Verarbeitung aufruft. Der Trennungsprozess ist höflicher geworden und es gibt eine Wartezeit. Zum Trennen am Ende der Anwendung empfehlen wir, das Trennen ohne Wartezeit zu erzwingen. Pro Instanz kann nur eine GATT-Verbindung intern gehalten werden. v0.14: Löst jetzt eine Ausnahme aus, wenn versucht wird, eine Verbindung herzustellen, wenn eine Verbindung besteht.
//Stellen Sie eine Verbindung zum Gerät her und führen Sie einen Service-Scan durch. GATT-Objekte werden intern aufbewahrt.
//(Schneidverarbeitung etc. automatisch durchführen)
//Löst eine Ausnahme aus, wenn die Verbindung fehlschlägt.
void connect(Context context, BluetoothDevice device, int timeOut) throws IOException
//Vom Gerät trennen.
void disconnect(int timeOut)
//Trennen Sie das Gerät zwangsweise vom Gerät(Trennvorgang in der alten Version)
//Dies kann in einem UI-Thread erfolgen
void forceDisconnect()
Für einfaches Lesen und Schreiben von Merkmalen haben wir es in Version 0.11 verbessert, um es einfacher zu machen. Suchen Sie nach Diensten, suchen Sie nach Merkmalen, weisen Sie Werte usw. in einer Zeile zu.
Es wird viel gelesen, aber ich habe es mit der Android-API abgeglichen. Alle verfügbaren Formate werden unterstützt. Andererseits wurde beim Schreiben der Schwimmer weggelassen. Weil es ein Stil war, der etwas schwierig zu benutzen schien Die Entscheidung ist, dass es nicht viele Möglichkeiten gibt, Gleitkommazahlen zu schreiben.
//**********lesen***********
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Die neuesten Daten werden vom Peripheriegerät abgerufen, mit dem angegebenen Format und Offset interpretiert und als ganzzahliger Typ zurückgegeben.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
int readDataInt(String ServiceUUID,String CharacteristicUUID,int formatType,int offset,int timeOut) throws IOException
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Die neuesten Daten werden vom Peripheriegerät abgerufen, mit dem angegebenen Format und Offset interpretiert und als Gleitkommatyp zurückgegeben.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
float readDataFloat(String ServiceUUID,String CharacteristicUUID,int formatType,int offset,int timeOut) throws IOException
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Holen Sie sich die neuesten Daten vom Peripheriegerät und geben Sie sie als Byte-Zeichenfolge zurück.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
byte[] readDataValue(String ServiceUUID,String CharacteristicUUID,int timeOut) throws IOException
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Die neuesten Daten werden vom Peripheriegerät abgerufen, mit dem angegebenen Versatz interpretiert und als Zeichenfolge zurückgegeben.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
String readDataString(String ServiceUUID,String CharacteristicUUID,int offset,int timeOut) throws IOException
//**********Schreiben***********
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Legen Sie die angegebene Zeichenfolge als Inhalt für das Peripheriegerät mit der angegebenen Schreibmethode fest.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void writeData(String string,String ServiceUUID,String CharacteristicUUID,int writeType,int timeOut) throws IOException
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Legen Sie die angegebene Byte-Zeichenfolge als Inhalt für das Peripheriegerät mit der angegebenen Schreibmethode fest.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void writeData(byte[] value,String ServiceUUID,String CharacteristicUUID,int writeType,int timeOut) throws IOException
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Legen Sie die angegebene Ganzzahl als Inhalt im Peripheriegerät mit der angegebenen Schreibmethode fest.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void writeData(int num,int formatType,int offset,String ServiceUUID,String CharacteristicUUID,int writeType,int timeOut) throws IOException
Der formatType lautet wie folgt.
BluetoothGattCharacteristic.FORMAT_FLOAT //(32-bit float)
BluetoothGattCharacteristic.FORMAT_SFLOAT //(16-bit float)
BluetoothGattCharacteristic.FORMAT_SINT16
BluetoothGattCharacteristic.FORMAT_SINT32
BluetoothGattCharacteristic.FORMAT_SINT8
BluetoothGattCharacteristic.FORMAT_UINT16
BluetoothGattCharacteristic.FORMAT_UINT32
BluetoothGattCharacteristic.FORMAT_UINT8
Der writeType lautet wie folgt.
BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT
BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE
BluetoothGattCharacteristic.WRITE_TYPE_SIGNED
Da die Benachrichtigungseinstellungen ebenfalls Standard sind, habe ich es möglich gemacht, sie in Kurzform zu schreiben. Da setNotify die Einstellung auf der Peripherieseite und setCallback die Einstellung auf der Android-Seite ist, sind beide erforderlich.
Es kann jedoch nur ein Rückruf bei setCallback registriert werden, und das Merkmal ist intern Da es sich um eine Form der Überprüfung und Verzweigung handelt, muss setCallback zu Beginn der Anwendung nur einmal ausgeführt werden.
Die Anzeige wird ab Version 0.12 unterstützt.
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Aktiviert / deaktiviert die Benachrichtigungseinstellung auf der Peripherieseite für dieses Merkmal.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void setNotify(String ServiceUUID,String CharacteristicUUID,boolean enable,int timeOut) throws IOException
//Holen Sie sich das Dienstmerkmal aus der angegebenen Dienst-UUID-Zeichenfolge, Merkmal-UUID-Zeichenfolge,
//Aktiviert / deaktiviert die Anzeigeeinstellung auf der Peripherieseite für diese Eigenschaft.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void setIndicate(String ServiceUUID,String CharacteristicUUID,boolean enable,int timeOut) throws IOException
v0.14: Bitte setzen Sie null, um den Rückruf abzubrechen.
//Stellen Sie den Rückruf ein, wenn eine Benachrichtigung vom Peripheriegerät empfangen wird.
void setNotificationCallback(final NotificationCallback callback)
//Rückruf bei getrennter Verbindung
void setDisconnectCallback(final DisconnectCallback callback){
//Überprüfen Sie, ob sich die charakteristische UUID und die Zeichenfolgen-UUID befinden
//Sicher, wenn sie übereinstimmen, sonst falsch
//Es kann verwendet werden, um das durch Benachrichtigung oder Anzeige gesendete Merkmal zu identifizieren.
boolean isMatchCharacteristicUUID(BluetoothGattCharacteristic characteristic,String CharacteristicUUID)
//Rückrufschnittstelle für Benachrichtigungen
interface NotificationCallback {
void onNotification(BluetoothGattCharacteristic characteristic);
}
//Rückrufschnittstelle beim Trennen
interface DisconnectCallback {
void onDisconnect();
}
Dies ist die charakteristische Operation von v0.10. Sie können das Rohmerkmal erhalten. Verwenden Sie dieses Merkmal daher, wenn Sie detaillierte Vorgänge ausführen möchten.
Wenn Sie nur lesen und schreiben, greifen Sie zum Service, dann zum Merkmal, Es ist etwas kompliziert, da Sie mindestens 4 Zeilen in der Reihenfolge des Betriebs und der Ausgabe benötigen.
v0.13: Wird jetzt intern im UI-Thread ausgeführt. Verbesserte Nullprüfung.
//Rufen Sie den Dienst mithilfe der gesuchten Dienstinformationen aus der UUID-Zeichenfolge ab.
//Wenn nicht gefunden, wird null zurückgegeben.
BluetoothGattService getService(String serviceUUID)
//Verwenden Sie die gesuchten Dienstinformationen, um das Merkmal aus der UUID-Zeichenfolge abzurufen.
//Der von getService erfasste BluetoothGattService ist erforderlich, um das Merkmal mit derselben UUID zu ermitteln.
//Wenn nicht gefunden, wird null zurückgegeben.
BluetoothGattCharacteristic getCharacteristicInService(BluetoothGattService service, String CharacteristicUUID)
//Reflektieren Sie den Inhalt der Stromkennlinie im Peripheriegerät.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void writeCharacteristic(BluetoothGattCharacteristic characteristic, int timeOut) throws IOException
//Ruft den neuesten charakteristischen Inhalt vom Peripheriegerät ab und gibt ihn zurück.
//(Zu diesem Zeitpunkt ist das ursprüngliche Merkmal wahrscheinlich unverändert.)
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
BluetoothGattCharacteristic readCharacteristic(BluetoothGattCharacteristic characteristic, int timeOut) throws IOException
Deskriptoroperation. Es wird intern für Benachrichtigungseinstellungen verwendet. Beachten Sie, dass ich nicht viel getestet habe.
v0.13: Wird jetzt intern im UI-Thread ausgeführt. Verbesserte Nullprüfung.
//Schreiben Sie den Deskriptor in das Peripheriegerät.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void writeDescriptor(BluetoothGattDescriptor descriptor, int timeOut) throws IOException
//Lesen Sie den Deskriptor vom Peripheriegerät.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
BluetoothGattDescriptor readDescriptor(BluetoothGattDescriptor descriptor, int timeOut) throws IOException
//Aktiviert / deaktiviert die Benachrichtigungseinstellung auf der Peripherieseite eines bestimmten Merkmals.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void setNotification(BluetoothGattCharacteristic characteristic,boolean enable,int timeOut) throws IOException
//Aktiviert / deaktiviert die Anzeigeeinstellung auf der Peripherieseite eines bestimmten Merkmals.
//Löst eine Ausnahme aus, wenn die Kommunikation fehlschlägt.
void setIndication(BluetoothGattCharacteristic characteristic,boolean enable,int timeOut) throws IOException
//Übergeben Sie das Bluetooth-Gatt, das sich im Inneren befindet. Wenn es null ist, wird es getrennt.
//Bitte beachten Sie, dass es ohne Erlaubnis ungültig wird, wenn die Kommunikation unterbrochen wird.
BluetoothGatt getGatt()
//Aktiviert oder deaktiviert sehr redundante Protokolle.
//Standardmäßig aktiviert(Ich denke, es wird oft für das Prototyping verwendet)
//Wenn Sie false übergeben, werden nur schwerwiegende Protokolle ausgegeben.
void setDebug(boolean f)
//Überprüfen Sie, ob eine Methode ausgeführt wird
//boolean getLockState()
//Erzwungenes Öffnen
//void forceUnlock()
Es ist keine Bibliotheksmethode, aber ich benutze sie oft.
//Bitten Sie das Betriebssystem, sich mit dem angegebenen Gerät zu verbinden.
//Welche Art der Verklebung erfolgt, hängt vom Design des Peripheriegeräts ab.
device.createBond();
//Stellen Sie den Wert charakteristisch ein.
//Verwendung mit writeCharacteristic.
characteristic.setValue("Hello World");
//Extrahiert den Wert aus dem Merkmal im angegebenen Format.
//Verwendung mit readCharacteristic.
characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, offset);
Es wurde von Android-Anfängern und Java-Anfängern für mehr Anfänger erstellt. Ich bin ein paar Minuten lang Anfänger, daher denke ich, dass es verschiedene seltsame Dinge gibt.
Wenn Sie hier eine nützlichere Bibliothek oder etwas Seltsames finden, teilen Sie uns dies bitte in den Kommentaren mit.
Ich habe sehr viel auf die folgenden Seiten verwiesen.
Die verschiedenen Schmerzen, die ich während der Entwicklung hatte, wurden bereits vor zwei Jahren geschrieben. #kyobashidex, dass Android BLE auf kyobashi.dex hart gesprochen hat
Und hier. 5 TIPS FOR BLUETOOTH LOW ENERGY (BLE) ON ANDROID
Wir haben den Betrieb mit Nexus 5X (Android 8.0) und BBC micro: bit bestätigt. Auf dieser Seite finden Sie Informationen zur Vorbereitung auf der Micro: Bit-Seite. Versuchen Sie die BLE-Kommunikation mit Micro: bit nur über den Browser, der die Web-Bluetooth-API verwendet.
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<uses-feature android:name="android.hardware.location.gps" />
MainActivity.java
package jp.ne.sakura.sabowl.gpsnmeajp.bletest;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGattCharacteristic;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.UUID;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
final String LEDServiceUUID = "E95DD91D-251D-470A-A062-FA1922DFA9A8";
final String LEDTextCharacteristicUUID = "E95D93EE-251D-470A-A062-FA1922DFA9A8";
final String ButtonServiceUUID = "E95D9882-251D-470A-A062-FA1922DFA9A8";
final String ButtonACharacteristicUUID = "E95DDA90-251D-470A-A062-FA1922DFA9A8";
private LazyBLEWrapper ble = new LazyBLEWrapper(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
ble.setDebug(true);
if(!ble.isBluetoothFeatureSupported(this))
{
Toast.makeText(this, "Es ist ein Terminal, das Bluetooth nicht verwenden kann", Toast.LENGTH_LONG).show();
finish();
}
if(!ble.isPermitted(this)){
ble.permissionRequest(this);
}
}
void connect()
{
try {
//Geräteerkennung.
//ArrayList<BluetoothDevice> result = ble.scanDevice(this,5000); //Scannen Sie alle Geräte
//BluetoothDevice device = ble.scanDevice(this,"BBC micro:bit", 5000); //Namensscan mit Präfixübereinstimmung
BluetoothDevice device = ble.scanBondedDevice("BBC micro:bit"); //Suche aus der gebundenen Liste.(Keine detaillierte Positionsberechtigung erforderlich)
//device.createBond();//Verbindung
//Verbindung
ble.connect(this,device, 30000);
ble.setDisconnectCallback(new LazyBLEWrapper.DisconnectCallback() {
@Override
public void onDisconnect() {
Log.e(TAG,"Disconnected!");
}
});
//LED-Schrift
ble.writeData("Hello",LEDServiceUUID,LEDTextCharacteristicUUID, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT,30000);
//Schaltfläche "Get"
Integer dat = ble.readDataInt(ButtonServiceUUID,ButtonACharacteristicUUID,BluetoothGattCharacteristic.FORMAT_UINT8,0,30000);
Log.d(TAG, dat.toString());
//Einstellungen für die Tastenbenachrichtigung
ble.setNotify(ButtonServiceUUID,ButtonACharacteristicUUID,true,30000);
//UART-Empfangseinstellung
ble.setIndicate(UARTServiceUUID,UARTTxCharacteristicUUID,true,30000);
ble.setNotificationCallback(new LazyBLEWrapper.NotificationCallback() {
@Override
public void onNotification(BluetoothGattCharacteristic characteristic) {
if(ble.isMatchCharacteristicUUID(characteristic,ButtonACharacteristicUUID)) {
Integer ButtonA = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 0);
Log.d(TAG, ButtonA.toString());
mText.setText(ButtonA.toString());
}
if(ble.isMatchCharacteristicUUID(characteristic,UARTTxCharacteristicUUID)) {
Log.d(TAG, characteristic.getStringValue(0));
}
}
});
//UART-Übertragung
ble.writeData("Hello UART\n",UARTServiceUUID,UARTRxCharacteristicUUID,BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT,30000);
}catch (Exception e){
Log.e(TAG,"connect",e);
ble.forceDisconnect();
}
}
void disconnect(){
try {
// ble.setNotify(ButtonServiceUUID,ButtonACharacteristicUUID,false,30000);
// ble.setDisconnectCallback(null);
// ble.setNotificationCallback(null);
ble.disconnect(30*1000);
// finish();
}catch (Exception e){
Log.e(TAG,"disconnect",e);
ble.forceDisconnect();
}
}
public void onClick(View v) {
Button btn = (Button)v;
Log.i(TAG,"onClick");
switch( btn.getId() ){
//Wenn die Taste gedrückt wird
case R.id.buttonConnect:
//BLE-Verarbeitung
if(ble.isBluetoothFeatureEnabled())
{
//Führen Sie den Hauptfaden nicht aus, da er sonst blockiert(Ich werde für den Rest meines Lebens nicht zurückkommen))
new Thread(new Runnable() {
@Override
public void run() {
connect();
}
}).start();
}else{
ble.requestTurnOnBlueTooth(this);
}
mText.setText("Wow!");
break;
case R.id.buttonDisconnect:
//Führen Sie den Hauptfaden nicht aus, da er sonst blockiert(Ich werde für den Rest meines Lebens nicht zurückkommen))
new Thread(new Runnable() {
@Override
public void run() {
disconnect();
}
}).start();
break;
default:
break;
}
}
Recommended Posts