Mejora del rendimiento de una conexión Bluetooth de baja energía

2

Pregunta de seguimiento de Stackoverflow

Estoy intentando escribir un valor característico repetidamente en un corto período de tiempo. Diferentes fuentes dicen que las tasas entre 200 y 305 kbit / s deberían ser posibles. Sin embargo, solo llego a ~ 36 kbit / s .

Estoy usando un iPhone 4S para escribir la característica repetidamente. Una placa de desarrollo con un chip BLE CSR1000 sirve como periférico que acepta las escrituras. Estoy utilizando escrituras sin respuesta para evitar reconocimientos en la capa de atributo. Consulte mi pregunta en Stackoverflow para obtener más detalles.

Una escritura en el valor característico de 20 bytes de longitud ocurre después de cada milisegundo. Por lo tanto, estoy enviando 160 kbit / s . Solo se reciben ~ 36 kbit / s . Lo extraño de esto es que, al comienzo de la sesión, todo funciona bien por una fracción de segundo. Entonces, los paquetes comienzan a caer. Sin embargo, la mayoría de las veces, los paquetes de cuatro solicitudes de escritura continuas funcionan bien antes de que una cantidad variable de paquetes se caiga nuevamente.

He encontrado una correlación significativa entre el rendimiento y el valor de Conn_Interval. Sin embargo, el iPhone 4S no aceptará ningún valor Conn_Interval inferior a 0x0f. Esto ya es inferior a lo que Apple propone dentro de sus pautas de hardware. Cuando cumplo con sus valores y uso un intervalo mínimo de 20 ms, y un intervalo máximo de 40 ms, el rendimiento disminuye a ~ 15 kbit / s.

Conn_Interval = 0x000f = 18.75 ms
Conn_Latency  = 0x0000
Supervision_Timeout = 0x00fc

El documento "Modelando el rendimiento máximo de Bluetooth de baja energía en un enlace propenso a errores" de Gomez et al. describe la influencia de Conn_Interval y los errores de bits en el rendimiento. Sin embargo, según su análisis, habría una cantidad relativamente alta de errores de bits, si esta fuera la fuente limitante del problema. La placa de desarrollo se encuentra muy cerca del iPhone 4S. Por lo tanto, supongo que existen otros factores limitantes.

  • ¿Qué otros parámetros podrían influir en el rendimiento en Bluetooth Low Energy?
  • ¿Por qué el Conn_Interval es tan importante? Si el intervalo es mayor, ¿no deberían llenarse los eventos de conexión individuales con más paquetes, lo que lleva a un rendimiento similar?
  • ¿Podría un Bluetooth Sniffer / Analyzer ayudar a detectar si realmente hay tantos errores de bit? En caso afirmativo, ¿qué analizadores recomendaría?
pregunta Etan

4 respuestas

1

Podría obtener una respuesta de Apple al grabar un TSI y esperar un mes.

Básicamente, dicen que el comportamiento está pensado en iOS 5.1. De alguna manera tiene sentido, porque no quieren que el rendimiento de su aplicación dependa de si otra aplicación usa Bluetooth o WiFi.

  

Según los comentarios de los ingenieros: bajo iOS 5.1, debe haber 6 pares de notificaciones durante un intervalo de conexión, lo que significa 6 * tamaño de paquete * 1000 / intervalo. Esto debería traducirse a un máximo de ~ 55 kbps (el intervalo mínimo es de 20 ms, el tamaño del paquete es de 23 bytes). Tomamos la decisión de limitar el número de pares por intervalo y tener un intervalo mínimo debido al hecho de que el iPhone y el iPad tienen una antena compartida entre BT classic, BT LE y WiFi.

     

iOS LE está diseñado para ser un transporte de baja potencia. Para un mayor rendimiento, BT classic es un mejor método de transporte.

     

De vuelta a mí: en base a los comentarios de los ingenieros anteriores, si el deseo es lograr un rendimiento de 200 kbs, el bluetooth clásico es la respuesta. Sin embargo, si el deseo es trabajar con una aplicación en el iPhone, puedo entender que esto no es un cambio simple: Classic BT requiere una licencia de IMF.

    
respondido por el Etan
1

¿Estás seguro de que todos esos paquetes están saliendo del iPhone? Tal vez Apple impone restricciones de ancho de banda en las aplicaciones, como le dije en el flujo de apilamiento que realmente debería hacer esta pregunta en la lista de correo de Apple Bluetooth, donde hay varios ingenieros de Apple útiles que podrían ayudarlo.

De lo contrario, realmente necesita especificar qué conjuntos de chips está utilizando si desea obtener algo de estas preguntas.

EDITAR: está bien, está utilizando el conjunto de chips CSR, entonces sugiero que se ponga en contacto directamente con CSR y publique su pregunta aquí:

enlace

EDIT2: un rastreador podría ayudarlo a ver si esos paquetes están siendo enviados realmente por el iPhone y no recibidos por el conjunto de chips CSR, o simplemente es que el iPhone nunca envía realmente ellos sobre el aire

    
respondido por el introiboad
0

¿Qué placa de desarrollo está utilizando? Ha habido algunos problemas con Bluegiga y el BLE-112A. Las especificaciones originales que enumeraron no eran del todo correctas con respecto a la capacidad de memoria y las opciones de perfil de firmware disponibles. Tengo entendido que se supone que deben actualizar sus especificaciones de software en función de los comentarios que hayan recibido.

Dependiendo de lo que intente hacer, otra opción puede estar presente en el smart Beacon de tod para obtener más información, consulte todhq.com

    
respondido por el Don
0

Lo que se ve cuando se eliminan los paquetes se debe a un desbordamiento de búfer en el lado del iPhone (probablemente, creo) o en el lado del host. Comenzando con iOS 11.2, Apple proporciona un mecanismo que le permite verificar si el búfer está listo antes de escribir el siguiente paquete; canSendWriteWithoutResponse:

Si espera hasta que canSendWriteWithoutResponse sea verdadero antes de escribir un paquete, se garantiza que la entrega se colocó en el búfer de recepción, pero no se garantiza que haya sido procesado (no reconocido). La otra cosa que podría ayudar es negociar un tamaño de MTU mayor que 20. Apple admite MTU en 185B y hasta 251 (longitud de datos extendida, también conocida como EDL). Al dividir sus paquetes de datos en tamaños MTU-3, su paquete == (MTU-3) x 1 por intervalo de conexión. @ 185B MTU, intervalo de conexión de 24 ms Tengo un rendimiento de alrededor de 48 kbps sin paquetes descartados. Cuando se envían datos al iPhone desde el dispositivo, el SDK en ese extremo necesitará el equivalente a 'canSendWriteWithoutResponse', que en mi caso utiliza hardware / SDK de SiLabs, p. Ej.,

'' '

 do {
     result = gecko_cmd_gatt_server_send_characteristic_notification(
              0xFF,
              evt->data.evt_gatt_server_attribute_value.attribute,
              chunk.length,
     [chunk bytes])->result;
 } while(result == bg_err_out_of_memory); 
  //retry until buffer is empty and ready for more 
 //then update the offset
 offset += thisChunkSize;

'' '

Aquí hay un video y un .pdf de Apple que explica las diferentes técnicas BLE y las velocidades esperadas. MTU + Connection Interval es lo que se usa para determinar el rendimiento máximo. 48kps deben ser fácilmente alcanzables, 96kbps y tal vez un poco más alto es posible.

Novedades en Core Bluetooth

video: https://devstreaming-cdn.apple.com/videos/wwdc/2017/712jqzhsxoww3zn/712/712_hd_whats_new_in_core_bluetooth.mp4?dl=1
pdf: https://devstreaming-cdn.apple.com/videos/wwdc/2017/712jqzhsxoww3zn/712/712_whats_new_in_core_bluetooth.pdf 
    
respondido por el Jerry Horton

Lea otras preguntas en las etiquetas