6

Wie reagiert man auf gerichtete Werbung (ADV_DIRECT_IND == 0001) in Android?Reagiert auf BLE gerichtete Werbung (ADV_DIRECT_IND) in Android

Es gibt ein BLE-Gadget, das gerichtete Werbung an ein Android-Handy sendet (mit fest codierter MAC-Adresse des Telefons) und in meiner Android-App möchte ich reagieren und eine Verbindung zum Gadget herstellen und die org.bluetooth.characteristic.location_and_speed Wert aus dem Gadget:

screenshot

Bitte beraten, wenn sie mit den Mitteln der Android 5 API möglich ist.

Antwort

3

Direktwerbung funktioniert - zumindest mit HTC M8 Telefon und Android 5.0 (API Level 21 und höher).

Die Lösung bestand darin, die Geräteadressen zu ScanFilter hinzuzufügen.

Wenn Sie die Filter leer lassen, werden die Scan-Callbacks nicht aufgerufen.

Hier ist meine Arbeitscode:

public static final String TAG = "My_BLE_app"; 

public static final String DEVICE_1 = "D4:BE:84:72:5B:8E"; 
public static final String DEVICE_2 = "C4:39:07:19:60:E2"; 

private Context mContext; 
private BluetoothAdapter mBluetoothAdapter; 
private BluetoothLeScanner mScanner; 
private ScanSettings mSettings; 
private List<ScanFilter> mFilters = new ArrayList<ScanFilter>(); 

Zuerst wird das Verfahren zur Initialisierung BLE:

public boolean init() { 
    BluetoothManager bluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE); 
    mBluetoothAdapter = bluetoothManager.getAdapter(); 
    if (mBluetoothAdapter == null) 
     return false; 

    mScanner = mBluetoothAdapter.getBluetoothLeScanner(); 
    mSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build(); 

    mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_1).build()); 
    mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_2).build()); 

    return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE); 
} 

Und dann die Scan-Rückrufe:

private ScanCallback mDirectedScanCallback = new ScanCallback() { 
    @Override 
    public void onScanResult(int callbackType, ScanResult result) { 
     processResult(result); 
    } 

    @Override 
    public void onBatchScanResults(List<ScanResult> results) { 
     for (ScanResult result: results) { 
      processResult(result); 
     } 
    } 

    private void processResult(ScanResult result) { 
     BluetoothDevice device = result.getDevice(); 
     if (device == null) 
      return; 

     String address = device.getAddress(); 
     if (!BluetoothAdapter.checkBluetoothAddress(address)) 
      return; 

     int rssi = result.getRssi(); 

     Log.d(TAG, "address=" + address + ", rssi=" + rssi); 

     // TODO connect to the device in under 1 second 
    } 
}; 

schließlich der Code den Scanvorgang zu starten :

mScanner.startScan(mFilters, mSettings, mDirectedScanCallback); 

Eine Frage ist allerdings noch offen:

Ich weiß nicht, wie die Art der Scan an der Android Seite zu erkennen -, dass, wenn der Scan gerichtet war oder nicht.

1

teilweise auf die offene Frage beantworten:
ich bemerkt habe, dass die ScanRecord.getBytes() leer - all ‚\ 0‘ - für eine gezielte Scan (ADV_DIRECT_IND) - aber die Werbedaten sonst (ADV_IND) enthalten würde.