Android BLE Passive Scan

Ich möchte BLE-Werbetreibende passiv in meiner Android-App scannen.
Aber ich konnte nicht finden, wie das zu tun

Aber ich kann nicht feststellen ob es möglich ist, passiven Scan-Modus zu verwenden oder nicht.

Frage : Ist es möglich, "PASSIVE SCAN" auf Android zu verwenden? Wenn es möglich ist, wie man diese Funktion benutzt?

  • Android-Liste BLE-Geräte nach dem Gerät scannen
  • Schnellere WiFi-Scan-Rate zu erhalten rssi Änderungen android
  • Tun Android-Geräte scannen * aktiv * für WiFi-Netzwerke?
  • Android - Wie man Access Points scannt und das stärkste Signal auswählt?
  • Holen Sie sich BLE Scan ohne Filter doppelte UUID
  • Android BluetoothDevice.getName () return null
  • Android-Subnetz-Scan
  • One Solution collect form web for “Android BLE Passive Scan”

    Der Unterschied zwischen active und passive Scan ist, dass active Scans einen SCAN_RESPONSE paket vom Werbetreibenden anfordern. Dies geschieht durch das Senden eines SCAN_REQUEST Pakets, nachdem eine Anzeige erkannt wurde. Die Informationen (Payload) von beiden werden im scanRecord Parameter des Gerätes gefunden, das den Rückruf gefunden hat.

    Aus der Kernspezifikation :

    Ein Gerät kann das aktive Scannen verwenden, um mehr Informationen über Geräte zu erhalten, die nützlich sein können, um eine Benutzeroberfläche zu füllen. Das aktive Scannen beinhaltet mehr Link-Layer-Werbebotschaften.

    Also, für jeden Gebrauchfall ist es nicht notwendig, sich zwischen diesen beiden Scan-Typen zu unterscheiden.

    Aber wenn du auf Anzeigen im Hintergrund hören willst, dann musst du das selbst tun, indem du einen Service schaffst – es gibt keine eingebaute Funktionalität (ab Android 4.4).


    Für das Hintergrundscannen nehmen Sie dieses Beispiel an. Aber der Scan endet an dem Punkt, an dem deine App vom System getötet wird (oder vom Benutzer gestoppt).

    Starten eines PendingIntent durch AlarmManager (irgendwo in deiner App, das muss mindestens einmal laufen, um den Service zu starten …)

     AlarmManager alarmMgr = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(getActivity(), BleScanService.class); PendingIntent scanIntent = PendingIntent.getService(getActivity(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime(), intervalMillis, scanIntent); 

    BleScanService

     public class BleScanService extends Service implements LeScanCallback { private final static String TAG = BleScanService.class.getSimpleName(); private final IBinder mBinder = new LocalBinder(); private BluetoothManager mBluetoothManager; private BluetoothAdapter mBluetoothAdapter; public class LocalBinder extends Binder { public BleScanService getService() { return BleScanService.this; } } @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } @Override public void onCreate() { super.onCreate(); initialize(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { long timeToScan = preferences.scanLength().get(); startScan(timeToScan); return super.onStartCommand(intent, flags, startId); } /** * Initializes a reference to the local bluetooth adapter. * * @return Return true if the initialization is successful. */ public boolean initialize() { // For API level 18 and above, get a reference to BluetoothAdapter // through // BluetoothManager. if (mBluetoothManager == null) { mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); if (mBluetoothManager == null) { Log.e(TAG, "Unable to initialize BluetoothManager."); return false; } } if (mBluetoothAdapter == null) { mBluetoothAdapter = mBluetoothManager.getAdapter(); if (mBluetoothAdapter == null) { Log.e(TAG, "Unable to obtain a BluetoothAdapter."); return false; } } Log.d(TAG, "Initialzed scanner."); return true; } /** * Checks if bluetooth is correctly set up. * * @return */ protected boolean isInitialized() { return mBluetoothManager != null && mBluetoothAdapter != null && mBluetoothAdapter.isEnabled(); } /** * Checks if ble is ready and bluetooth is correctly setup. * * @return */ protected boolean isReady() { return isInitialized() && isBleReady(); } /** * Checks if the device is ble ready. * * @return */ protected boolean isBleReady() { return getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE); } @Override public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { Log.d(TAG, "Found ble device " + device.getName() + " " + device.getAddress()); broadcastOnDeviceFound(device, scanRecord); } /** * Broadcasts a message with the given device. * * @param device * @param scanRecord */ protected void broadcastOnDeviceFound(final BluetoothDevice device, byte[] scanRecord) { assert device != null : "Device should not be null."; Intent intent = new Intent(BleServiceConstants.ACTION_DEVICE_DISCOVERED); intent.putExtra(BleServiceConstants.EXTRA_DEVICE_DISCOVERED_DEVICE, device); intent.putExtra(BleServiceConstants.EXTRA_DEVICE_DISCOVERED_SCAN_RECORD, scanRecord); sendBroadcast(intent); } /** * Starts the bluetooth low energy scan It scans at least the * delayStopTimeInMillis. * * @param delayStopTimeInMillis * the duration of the scan * @return <code>true</code> if the scan is successfully started. */ public boolean startScan(long delayStopTimeInMillis) { if (!isReady()) return false; if (preferences.shouldScan().get()) { if (delayStopTimeInMillis <= 0) { Log.w(TAG, "Did not start scanning with automatic stop delay time of " + delayStopTimeInMillis); return false; } Log.d(TAG, "Auto-Stop scan after " + delayStopTimeInMillis + " ms"); getMainHandler().postDelayed(new Runnable() { @Override public void run() { Log.d(TAG, "Stopped scan."); stopScan(); } }, delayStopTimeInMillis); } return startScan(); } /** * @return an handler with the main (ui) looper. */ private Handler getMainHandler() { return new Handler(getMainLooper()); } /** * Starts the bluetooth low energy scan. It scans without time limit. * * @return <code>true</code> if the scan is successfully started. */ public boolean startScan() { if (!isReady()) return false; if (preferences.shouldScan().get()) { if (mBluetoothAdapter != null) { Log.d(TAG, "Started scan."); return mBluetoothAdapter.startLeScan(this); } else { Log.d(TAG, "BluetoothAdapter is null."); return false; } } return false; } /** * Stops the bluetooth low energy scan. */ public void stopScan() { if (!isReady()) return; if (mBluetoothAdapter != null) mBluetoothAdapter.stopLeScan(this); else { Log.d(TAG, "BluetoothAdapter is null."); } } @Override public void onDestroy() { preferences.edit().shouldScan().put(false).apply(); super.onDestroy(); } } 

    Die Konstanten sind nur Strings, um die Absichtsaktion und zusätzliche Namen zu verteilen. Es gibt einen weiteren Vorzugsladen, der speichert, wie lange die Scanphase sein soll … Sie können sie leicht ersetzen.

    Dann musst du einen Broadcast-Receiver mit einem Intent-Filter registrieren, der mit dem oben genannten Aktionsnamen BleServiceConstants.ACTION_DEVICE_DISCOVERED ( BleServiceConstants.ACTION_DEVICE_DISCOVERED )

     public class DeviceWatcher extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { BluetoothDevice device = intent.getParcelableExtra(BleServiceConstants.EXTRA_DEVICE_DISCOVERED_DEVICE); // do anything with this information } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.