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.

  • "La conexión a adb ha fallado y se ha producido un error grave".
  • La solicitud AJAX de Phonegap Android falla
  • Prueba de facturación en la aplicación de Android Market con credenciales falsas de tarjetas de crédito
  • Cómo agregar una matriz de cadenas en un objeto JSON?
  • ViewPager no vuelve a dibujar contenido, permanece / se vuelve en blanco
  • Obtención de las dimensiones del teclado virtual
    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!

  • Imagen Redimensionar, Girar, Mover poniendo algún indicador alrededor de la imagen
  • Eliminar espacio entre los botones de LinearLayout (Android)
  • Cómo el calendario de Google o Instagram hacer sus aplicaciones todo el tiempo en marcha y funcionando incluso después de la parada de fuerza
  • Android Map V2 - ¿Por qué MAPS_RECEIVE permiso?
  • Fragmento de la animación de transacciones: inserte y deslice hacia fuera
  • Servicio: onTaskRemoved no llamado si se inició con bindService
  • 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.