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


Parámetros de conexión de baja energía de Bluetooth para Android, iOS y Win8

He estado buscando en todo el lugar para los parámetros de conexión Bluetooth necesarios que funcionarán para las tres de estas plataformas de operación. Estoy usando el perfil HOGP (Bluetooth over HID GATT) para este proyecto.

Mi proyecto es un sistema incrustado escrito por mí mismo con un módulo BLE que tengo control sobre los siguientes parámetros para la conexión.

  • ¿Cómo puedo cambiar el texto de EditText sin activar el Text Watcher?
  • Obtener el fondo de pantalla actual
  • Captura de cámara Android con FFmpeg
  • ImageButton en Android con fondo transparente
  • ¿Cómo hacer lo contrario de atributo de preferencia android: dependencia?
  • ¿Existe un reemplazo para el widget Galería con Reciclado de vistas?
    1. Intervalo de conexión Min
    2. Intervalo de conexión Máx.
    3. Latencia del esclavo
    4. Tiempo de espera de supervisión
    5. Intervalo de publicidad Min
    6. Intervalo de publicidad Max

    Mis dispositivos de destino se conectarán para satisfacer las conexiones con Android> = 4.3, iOS7 y> = Win 8.1.

    Apple fue lo suficientemente amable para dar un documento con los parámetros apropiados en la página 22 en el enlace de abajo. No he podido encontrar ninguna información sobre Android y Win 8.

    Https://developer.apple.com/hardwaredrivers/bluetoothdesignguidelines.pdf

    Mi configuración actual de trabajo para iOS7 probado completamente con la comunicación bidireccional con freeware lightBlue es la siguiente. Mi código incorporado y software de host para iOS7 funciona.

    1. Intervalo de conexión Min 30ms
    2. Intervalo de conexión Máx. 56.25ms
    3. Latencia de esclavo 3
    4. Supervisión Tiempo de espera 5000ms

    He encontrado desde otra página de desbordamiento de pila que android supuestamente funciona en el intervalo de conexión de 7,5 ms de los siguientes enlaces.

    1. Intervalo de tiempo de conexión BLE de Android
    2. Http://processors.wiki.ti.com/index.php/Bluetooth_SensorTag?DCMP=lprf-stdroid&HQS=lprf-stdroid-pr-wiki1#Supported_Android_devices

    Lamentablemente, el segundo requisito de Apple iOS spec es que "Intervalo Min ≥ 20 ms".

    ¿No entiendo estos rangos o cómo se interpretan? Si establezco el intervalo de min a 7,5 ms para Android no que los requisitos de las manzanas vacías? ¿Cómo puedo satisfacer ambos sistemas y también Win8 si es posible?

    Mi comprensión es que el dispositivo esclavo ofrece un ajuste sugerido entre el min y el máximo y el amo (smartphone) alertas al usuario del valor seleccionado real en ese rango.

    Aprecié cualquier ayuda con este tema y espero que este post podría beneficiar a otros teniendo en cuenta la base de conocimiento relativamente nueva e incompleta para BLE.

    ¡Gracias por adelantado!

  • ¿Justificar texto en una aplicación de Android utilizando un WebView pero presentando una interfaz similar a TextView?
  • Obtener excepción "IllegalStateException: No se puede realizar esta acción después de onSaveInstanceState"
  • EditText y InputFilter causan la repetición del texto
  • Aceptación de un certificado para HTTPs en Android
  • Permisos de aplicaciones en Android Marshmallow en PhoneGap
  • Establecer fuente de ImageView dinámicamente android
  • 3 Solutions collect form web for “Parámetros de conexión de baja energía de Bluetooth para Android, iOS y Win8”

    En primer lugar, el intervalo de conexión define una ventana de tiempo durante la cual ambos dispositivos utilizan la misma frecuencia para transferir datos. Hay 37 canales de datos en total, y los dispositivos conectados saltan a través de ellos cada intervalo de conexión.

    Por lo tanto, ambos dispositivos tienen que acordar valores precisos para estos parámetros desde el principio para estar sincronizados, es decir, conectados.

    En segundo lugar, cuando se establece la conexión, el maestro (o Central) envía los parámetros de conexión que soporta. El otro dispositivo (o periférico) los toma ciegamente. IOS por defecto establece el intervalo de conexión a 30 ms. Una vez establecida la conexión, el periférico puede solicitar la actualización de los parámetros de conexión, definiendo los valores mínimo y máximo, de acuerdo con las directrices que Apple le ha proporcionado. La parte receptora, lee iOS en este caso, seleccionará lo que encuentre mejor entre [min; max], y enviará la respuesta con los valores exactos que ha elegido. También puede rechazar la solicitud, si los valores no cumplen con las directrices.

    Por último, 7.5ms es la longitud mínima del intervalo de conexión definido por la especificación Bluetooth. El valor máximo es 4 s. Cuanto menor sea, mayor será el ancho de banda, pero mayor consumo de energía. Y lo contrario en los valores superiores. El mejor valor depende de la aplicación específica. Teniendo en cuenta que usted trabaja con HID perfil asumo la latencia es importante para usted.

    IOS dice que soporta intervalos de conexión de hasta 20ms (aunque me pareció difícil conseguir esto algunas veces), pero en su caso (perfil HID) también permiten 11.25 ms.

    Espero que ayude.

    Para modificar los parámetros en Android (solicitando de Central a Peripheral) puede hacer algo como esto:

    private String CONN_SERVICE_UUID = "00001800-0000-1000-8000-00805f9b34fb"; private static final UUID CONN_CHARACTERISTIC_UUID = UUID.fromString("00002a04-0000-1000-8000-00805F9B34FB"); private static final int CONN_INTERVAL = 0x0006; private static final int SUPERVISION_TIMEOUT = 0x000A; private void findServiceForConnectionParams(List<BluetoothGattService> gattServices){ BluetoothGattService connGattService = filterServices(gattServices, CONN_SERVICE_UUID); if (connGattService != null) { setConnectionInterval(connGattService); } } private void setConnectionInterval(BluetoothGattService gattService) { if (gattService == null) { Log.e(TAG, "setConnectionInterval. Gatt service is null!"); return; } BluetoothGattCharacteristic connCharacteristic = gattService.getCharacteristic(CONN_CHARACTERISTIC_UUID); if (connCharacteristic != null) { byte[] value = { (byte) (CONN_INTERVAL & 0x00FF), // gets LSB of 2 byte value (byte) ((CONN_INTERVAL & 0xFF00) >> 8), // gets MSB of 2 byte value (byte) (CONN_INTERVAL & 0x00FF), (byte) ((CONN_INTERVAL & 0xFF00) >> 8), 0, 0, (byte) (SUPERVISION_TIMEOUT & 0x00FF), (byte) ((SUPERVISION_TIMEOUT & 0xFF00) >> 8) }; connCharacteristic.setValue(value); boolean status = mBluetoothGatt.writeCharacteristic(connCharacteristic); Log.d(TAG, "setConnectionInterval. Change connection interval result: " + status); } else { Log.e(TAG, "setConnectionInterval. Connection characteristic is null!"); } } private BluetoothGattService filterServices(List<BluetoothGattService> gattServices, String targetUuid) { for(BluetoothGattService gattService : gattServices){ String serviceUUID = gattService.getUuid().toString(); Log.i(TAG, "serviceUUID: " + serviceUUID); if(serviceUUID.equals(targetUuid)){ Log.i(TAG, "serviceUUID matches! UUID: " + serviceUUID + " Type: " + gattService.getType()); // no needed, just to check which characteristics are offered for(BluetoothGattCharacteristic characteristic : gattService.getCharacteristics()) { Log.i(TAG, "serviceUUID characteristics: " + characteristic.getUuid().toString()); } return gattService; } } return null; } 

    Debo decir, sin embargo, que no funcionó para mí el uso de dispositivos Android 5 tanto como periféricos y centrales, porque el servicio de acceso genérico (0x1800) no está ofreciendo en mi dispositivo 0x2a04 característico para los parámetros de conexión preferidos. Sólo ofrece 0x2a00 (nombre de dispositivo) y 0x2a01 (apariencia). Referencias:

    http://www.cumulations.com/blogs/7/Doing-firmware-upgrade-over-BLE-in-Android

    https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters.xml

    https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.generic_access.xml

    https://farwestab.wordpress.com/2011/02/05/some-tips-on-android-and-bluetooth/

    Creo que esta característica sólo tiene por objeto proporcionar información al dispositivo Central. Por eso es generalmente de sólo lectura (para mí, y cxphong). La respuesta de Bingen no funciona universalmente, y no estoy seguro de que se suponga que funcione de esa manera. ¿Alguien realmente lo consiguió para trabajar en un dispositivo específico?

    Parece que Android y iOS no consultan la información en esta característica de sólo lectura, y por lo tanto no estoy seguro de que sea muy útil.

    Lo que funciona para mí se describe a continuación, para Cypress periférico y Android central. Un enfoque similar debería funcionar con otros dispositivos.

    1. En periférico, defina los parámetros de conexión preferidos en una estructura CYBLE_GAP_CONN_UPDATE_PARAM_T "params".
    2. Después de la conexión GATT, en el controlador de eventos CYBLE_EVT_GATT_CONNECT_IND (por ejemplo), llame a CyBle_L2capLeConnectionParamUpdateRequest (connHandle, & params).

    En el lado central, no hay nada que hacer. Después de recibir la petición, iniciará la actualización del parámetro un poco más tarde.

    Aclamaciones,

    David

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.