Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Análisis pasivo de Android BLE

Quiero analizar los anunciantes BLE pasivamente en mi aplicación de Android.
Pero no pude encontrar cómo hacerlo.

Pero no puedo encontrar si es posible utilizar el modo de exploración pasiva o no.

Pregunta : ¿Es posible utilizar "PASSIVE SCAN" en Android? Si es posible, ¿Cómo usar esta función?

  • Archivo de vídeo sdk cut / trim de Android
  • Manejo de respuestas con Volley
  • Cómo mostrar las casillas de verificación pre verificadas en android
  • Estilo de la casilla de verificación de Android
  • Captura todas las excepciones de tipo de programación de Android
  • Falta de privilegios para acceder al servicio de cámara en Android 6.0
  • One Solution collect form web for “Análisis pasivo de Android BLE”

    La diferencia entre active exploración active y passive es que active exploraciones active solicitan un SCAN_RESPONSE SCAN_RESPONSE del anunciante. Esto se hace enviando un SCAN_REQUEST SCAN_REQUEST después de que se hayan detectado anuncios. La información (carga útil) de ambos estará en el parámetro scanRecord del dispositivo encontrado devolución de llamada.

    Desde la especificación núcleo :

    Un dispositivo puede utilizar el escaneado activo para obtener más información acerca de los dispositivos que pueden ser útiles para rellenar una interfaz de usuario. La exploración activa implica más mensajes publicitarios de capa de enlace.

    Por lo tanto, para cualquier usecase no será necesario diferenciar entre esos dos tipos de escaneado.

    Pero si quieres escuchar anuncios en segundo plano, entonces necesitas hacerlo tú mismo creando un Service – no hay funcionalidad incorporada (a partir de Android 4.4).


    Para la exploración en segundo plano, tome este ejemplo. Sin embargo, el análisis finalizará en el momento en que su aplicación sea eliminada por el sistema (o detenida por el usuario).

    Iniciando un PendingIntent a través de AlarmManager (en cualquier parte de tu aplicación, que se debe ejecutar al menos una vez para iniciar el servicio …)

     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(); } } 

    Las constantes son sólo Cuerdas para distribuir la acción intencional y los nombres adicionales. Hay otra tienda de preferencias que almacena el tiempo que la fase de escaneado debe ser … Usted puede reemplazarlo fácilmente por sus necesidades.

    A continuación, debe registrar un receptor de difusión con un filtro de intenciones que coincida con el nombre de acción anterior ( 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 } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.