2012-04-27 12 views
19

Follow-Up question on Electrical Engineering StackexchangeBluetooth Low Energy - la actualización de un valor característico repetidamente

Quiero escribir el valor de una Bluetooth Low Energy característica repetidamente en un corto periodo de tiempo (como un posible caso de uso, imaginar un ratón).

  • La característica con un UUID de 128 bits es 20 bytes largo. Por lo tanto, puede escribirse en una sola transacción de baja energía.
  • Las escrituras se producen a una velocidad de 50 Hz, que es igual a una escritura una vez cada 20 ms.
  • Por lo tanto, se escriben 20 * 50 * 8 = 8 kbit/s.
  • Estoy usando el comando /Escribir sin respuesta modo para escribir la característica. Por lo tanto, no hay reconocimientos en la capa de atributos.
  • No hay otros dispositivos Bluetooth o Bluetooth de baja energía conectados. Nada se realiza a través de WLAN. No se leen o escriben otras características durante las pruebas.

Probé el programa enviando paquetes con números de secuencia de un iPhone 4S. El número de secuencia se incrementa en uno después de cada paquete enviado.

En el lado de recepción, se utiliza una placa de desarrollo programable, que incorpora un chip BLE CSR1000, que recibe los paquetes e imprime los números de secuencia recibidos en la conexión en serie.

Mis problemas son los siguientes:

  • Después de algún tiempo, comienza a recibir los paquetes cayeron. Los primeros ~ 100 paquetes funcionan bien a 50 Hz. A partir de ese momento, los paquetes comienzan a ser eliminados.

      0x00 - 0x46 received 
          0x47, 0x48 missing 
    0x49, 0x4a, 0x4b, 0x4c received 
            0x4d missing 
    0x4e, 0x4f, 0x50, 0x51 received 
            0x52 missing 
    0x53, 0x54, 0x55, 0x56 received 
            0x57 missing 
    ... 
    

    mayoría de las veces, un paquete de cuatro paquetes se transmite finas (en raras ocasiones, sólo 2 paquetes). Luego, faltan de 1 a 7 paquetes.

    Cuando reduzco el tamaño del valor característico, el problema persiste.

    Cuando escribo a 100Hz en lugar de a 50Hz, la imagen es la misma: solo que las caídas comienzan después de alrededor de 35 paquetes y que se cortan 5-7 paquetes entre la transmisión exitosa de cuatro paquetes.

    Con los paquetes perdidos, la velocidad de transmisión resultante es de alrededor de 5 kbit/s, independientemente de la frecuencia de las escrituras. Esto está claramente por debajo de ~ 305 kbit/s que debería ser técnicamente posible con Bluetooth Low Energy.

  • El problema también ocurre en la dirección opuesta, cuando envío paquetes de la placa de desarrollo al iPhone 4S. De nuevo, 5 kbit/s es el máximo que obtengo. El mecanismo de notificación se usa para este escenario. De nuevo, no hay reconocimientos en la capa de atributos.

  • Cuando trato de enviar en ambas direcciones al mismo tiempo, las cosas empiezan a explotar hasta el punto en que tengo que restablecer tanto la placa de desarrollo como el iPhone 4S.

Preguntas:

  • Que este sea un problema del chip Bluetooth de baja energía, que se utiliza en la placa de desarrollo?

    En caso afirmativo, ¿por qué el problema también ocurre en la dirección opuesta, donde el iPhone actúa como el receptor?

    ¿Existen placas de desarrollo en el mercado que admitan el acceso de alta frecuencia a las características?

  • ¿Cuál podría ser el origen del problema?

    Intente también hacer referencia a partes de las diapositivas/artículos de especificaciones/presentaciones de Bluetooth además de suposiciones.

Existen ratones Bluetooth Low Energy en el mercado. Los ratones tienen tasas de sondeo típicas de 125 Hz y tienen que enviar al menos dos valores de 16 bytes más gastos adicionales de HID por tick. Por lo tanto, una solución para mi problema debería estar disponible.

actualización

El conexión LE evento completo se describe en especificación Bluetooth versión 4.0 Vol 2 Parte E Sección 7.7.65.1. Recibo los siguientes valores para los diferentes parámetros de conexión:

Parameter    Value  Description 
-------------------------------------------------- 
Conn_Interval   0x0054  Time = 105 ms 
Conn_Latency   0x0000  Time = 0 ms 
Supervision_Timeout  0x00fc  Time = 2520 ms 
Master_Clock_Accuracy  0x05    50 ppm 
+0

¿Qué tarjeta LE chip/dev utiliza? –

+1

¿Qué parámetros ha configurado para la conexión? ¿Está utilizando el valor predeterminado? –

+0

¿Cómo ves los tiempos de conexión? – chwi

Respuesta

14

La emisión de un de conexión parámetros de actualización resuelto el problema y un mayor rendimiento de 5 kbit/s a ​​~ 33 kbit/s. Sin embargo, aún está por debajo de los ~ 305 kbit/s esperados.

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

¿Hay algún método para alcanzar los ~ 305 kbit/s completos?

Follow-Up question on Electrical Engineering Stackexchange

se pudo obtener una respuesta de Apple por la quema de una ETI y la espera de un mes.

Básicamente, dicen que el comportamiento está destinado a iOS 5.1. Es 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.

por los ingenieros comentarios - Bajo iOS 5.1 no debería ser de 6 pares de notificaciones durante un intervalo de conexión, lo que significa 6 * packetsize * 1000/intervalo. Esto debería traducirse en ~ 55kbps como máximo (el intervalo mínimo de 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 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 nuevo a mí: según 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 desea trabajar con una aplicación en el iPhone, I puede entender que esto no es un cambio simple: Classic BT requiere la licencia de MFI .

2

El principal problema parece ser que se trata de un problema de memoria intermedia en el chip que está utilizando. Desde la especificación principal, Volumen 3, Parte F, 3.3.2:

Para notificaciones, que no tienen una PDU de respuesta, no hay control de flujo y se puede enviar una notificación en cualquier momento.

Los comandos que no requieren una respuesta no tienen ningún control de flujo. Nota: un servidor puede estar inundado de comandos, y una especificación de capa superior puede definir cómo evitar que esto ocurra.

Los comandos y las notificaciones que se reciban pero no se puedan procesar, debido a desbordamientos de búfer u otras razones, se descartarán. Por lo tanto, esas PDU deben considerarse no confiables.

+0

El problema existe también en la dirección desde la placa de desarrollo hasta el iPhone 4S. – Etan

+1

Comandos de escritura y notificaciones, como se menciona aquí, no tienen ningún mecanismo de control de flujo inherente. La implementación debe definir qué sucederá si desborda los búferes internos de la pila. Para el comportamiento del iPhone cuando esto sucede, intente publicar esta pregunta en la lista de correo de Apple Bluetooth. – introiboad

Cuestiones relacionadas