Reacción a la publicidad dirigida BLE (ADV_DIRECT_IND) en Android
¿Cómo reaccionar a la publicidad dirigida ( ADV_DIRECT_IND == 0001
) en Android?
Hay un BLE-gadget que envía la publicidad dirigida a un teléfono Android (con la dirección MAC de código duro del teléfono por ahora) y en mi aplicación de Android me gustaría reaccionar e iniciar una conexión con el gadget y leer el org.bluetooth. El valor de character.location_and_speed del gadget:
- Kontakt Beacons: Resultados incoherentes y poco fiables al determinar la distancia de la baliza
- Desactivar con fuerza el dispositivo BLE conectado a la aplicación de Android activa onConnectionStateChange con el estado 8
- ¿Cuántos dispositivos podemos emparejar vía Bluetooth de BLE a Android?
- ¿Por qué el "" BluetoothAdapter: startLeScan (): null "" ocurrió cuando BLE Scan en Android?
- Android 4.3 BTLE como servidor: ¿Cómo iniciar anuncios?
Por favor avise si es posible por medio de Android 5 API .
- ¿Por qué `ACTION_GATT_DISCONNECTED` toma tanto tiempo para actualizar el estado?
- Soporte Bluetooth Smart (4.0) / GATT en Android 4.0?
- Conexión Bluetooth con Android
- Android 6.0 Marsmallow BLE: Parámetros de conexión
- ¿Cómo obtener respuestas más rápidas con AltBeacon?
2 Solutions collect form web for “Reacción a la publicidad dirigida BLE (ADV_DIRECT_IND) en Android”
La publicidad directa funciona – al menos con el teléfono HTC M8 y Android 5.0 (API nivel 21 y superior).
La solución ha sido añadir las direcciones del dispositivo al ScanFilter .
Si deja los filtros vacíos, no se llamarán las devoluciones de llamada de exploración.
Aquí mi código de trabajo:
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>();
Primero el método para inicializar 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); }
Y luego las devoluciones de llamada de exploración:
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 } };
Finalmente, el código para iniciar la exploración:
mScanner.startScan(mFilters, mSettings, mDirectedScanCallback);
Sin embargo, una pregunta sigue abierta:
No sé cómo detectar el tipo de análisis en el lado de Android – es decir, si la exploración fue dirigida o no .
Para responder parcialmente a la pregunta abierta:
He notado que el ScanRecord.getBytes()
está vacío – todo '\ 0' – para una exploración dirigida ( ADV_DIRECT_IND
) – pero contendría los datos publicitarios de otra manera ( ADV_IND
).
- Lista de dispositivos BLE para Android después de escanear dispositivos
- Vinculación mediante programación al dispositivo BLE en Android
- Android 4.3: BLE: Comportamiento de filtrado de startLeScan ()
- Privado vs direcciones públicas en Bluetooth de baja energía en Android
- Programáticamente, ¿Cómo identificar si un faro pertenece a Eddystone o iBeacon?
- Android Bluetooth LE - Leer las características que no funcionan en Samsung
- Android 4.3 BLE cómo escribir Característica
- ¿Tiene la naturaleza nativa de sincronización BLE GATT de implementación de Android?
- Retrasos en aplicaciones de Android GraphView en tiempo real
- ¿Es bueno reemplazar el receptor de radiodifusión con Greenrobot Eventbus para activar funciones basadas en eventos y la transferencia de datos de servicio a actividad?
- Android BLE: recuperar el servicio UUID en la devolución de llamada onLeScan () cuando se anuncia desde iOS Peripheral
- Cómo resolver el error onClientConnectionState () - status = 22 clientIf = 7 en BLE