2012-04-27 8 views
19

Follow-Up question on Electrical Engineering StackexchangeBluetooth Low Energy - l'aggiornamento di un valore caratteristico ripetutamente

Voglio scrivere il valore di una caratteristica Bluetooth Low Energy ripetutamente in un breve lasso di tempo (come un possibile caso d'uso, immaginare un mouse).

  • La caratteristica con un UUID 128 bit è 20 byte lungo. Pertanto, può essere scritto in una singola transazione Low Energy.
  • Le scritture si verificano a una frequenza di 50 Hz, che è uguale a una scrittura una volta ogni 20 ms.
  • Pertanto, 20 * 50 * 8 = 8 kbit/s vengono scritti.
  • Sto utilizzando il comando /Scrittura senza risposta per scrivere la caratteristica. Pertanto, nessun riconoscimento si verifica sul livello dell'attributo.
  • Nessun altro dispositivo Bluetooth o Bluetooth Low Energy è collegato. Nulla viene eseguito su WLAN. Nessun'altra caratteristica viene letta o scritta durante i test.

Testare il programma inviando pacchetti contenenti numeri di sequenza da un iPhone 4S. Il numero di sequenza viene incrementato di uno dopo ogni pacchetto inviato.

Sul lato ricevente, viene utilizzata una scheda di sviluppo programmabile, che incorpora un chip BLE CSR1000, che riceve i pacchetti e stampa i numeri di sequenza ricevuti sulla connessione seriale.

I miei problemi sono i seguenti:

  • Dopo qualche tempo, i pacchetti iniziare a ricevere caduto. I primi ~ 100 pacchetti funzionano bene a 50 Hz. Da quel momento in poi, i pacchetti inizieranno a cadere.

      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 
    ... 
    

    Molto spesso, un pacchetto di quattro pacchetti viene trasmesso correttamente (raramente, solo 2 pacchetti). Quindi, mancano 1-7 pacchetti.

    Quando si riduce la dimensione del valore caratteristico, il problema persiste.

    Quando scrivo a 100 Hz anziché a 50 Hz, l'immagine è la stessa, solo che le gocce iniziano a verificarsi dopo circa 35 pacchetti e che 5-7 pacchetti vengono rilasciati tra la trasmissione riuscita di quattro pacchetti.

    Con i pacchetti persi, la velocità di trasmissione risultante è di circa 5 kbit/s, indipendentemente dalla frequenza delle scritture. Questo è chiaramente al di sotto del ~ 305 kbit/s che dovrebbe essere tecnicamente possibile tramite Bluetooth Low Energy.

  • Il problema si verifica anche nella direzione opposta, quando invio pacchetti dalla scheda di sviluppo all'iPhone 4S. Ancora una volta, 5 kbit/s è il massimo che ottengo. Il meccanismo di notifica viene utilizzato per questo scenario. Di nuovo, nessun riconoscimento si verifica sul livello dell'attributo.

  • Quando provo a inviare entrambe le direzioni contemporaneamente, le cose iniziano a saltare fino al punto in cui devo reimpostare sia la scheda di sviluppo che l'iPhone 4S.

Domande:

  • Sia questo un problema del chip Bluetooth Low Energy, che viene utilizzato sulla scheda di sviluppo?

    Se sì, perché il problema si verifica anche nella direzione opposta, dove l'iPhone funge da ricevitore?

    Esistono schede di sviluppo sul mercato che supportano l'accesso ad alta frequenza alle caratteristiche?

  • Quale potrebbe essere l'origine del problema?

    Si prega inoltre di fare riferimento a parti della Spec. Bluetooth/diapositive/articoli di presentazione oltre alle ipotesi.

Esistono mouse Bluetooth Low Energy sul mercato. I mouse hanno frequenze di polling tipiche di 125 Hz e devono inviare almeno due valori di 16 byte più un overhead HID aggiuntivo per tick. Pertanto, dovrebbe essere disponibile una soluzione per il mio problema.

Aggiornamento

Il LE Connection Complete evento è descritto in Bluetooth Specification Version 4.0 Vol 2 Parte E Sezione 7.7.65.1. Ricevo i seguenti valori per i vari parametri di connessione:

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

Quale scheda chip/scheda LE si sta utilizzando? –

+1

Quali parametri hai impostato per la connessione: stai utilizzando l'impostazione predefinita? –

+0

Come vedi i tempi di connessione? – chwi

risposta

14

emissione di un collegamento parametri di aggiornamento risolto il problema e una maggiore produttività da 5 kbit/s per ~ 33 kbit/s. Tuttavia, questo è ancora al di sotto del previsto ~ 305 kbit/s.

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

Esistono metodi per raggiungere l'intero ~ 305 kbit/s?

Follow-Up question on Electrical Engineering Stackexchange

potuto ottenere una risposta da Apple bruciando una STI e in attesa di un mese.

Fondamentalmente, dicono che il comportamento è previsto in iOS 5.1. È in qualche modo sensato, perché non vogliono che le prestazioni della tua app dipendano dal fatto che un'altra app utilizzi Bluetooth o WiFi.

Per i commenti tecnici - sotto iOS 5.1 ci dovrebbe essere di 6 paia di notifiche nel corso di un intervallo di connessione, il che significa 6 * PacketSize * 1000/intervallo. Questo dovrebbe tradursi in ~ 55kbps max (l'intervallo minimo è 20ms, il pacchetto è 23 byte). Abbiamo preso la decisione di di limitare il numero di coppie per intervallo e di avere un intervallo minimo dovuto a per il fatto che entrambi hanno un'antenna condivisa tra BT classic, BT LE e WiFi.

iOS LE è progettato per essere un trasporto a bassa potenza. Per una maggiore produttività BT classic è un metodo di trasporto migliore.

Torna a me - Sulla base dei commenti dei tecnici sopra, se il desiderio è quello di raggiungere un throughput di 200 kbs, il bluetooth classico è la risposta. Tuttavia, se il desiderio è quello di lavorare con un'applicazione su iPhone, I può capire che questo non è un semplice cambiamento - Classic BT richiede la licenza MFI .

2

Il problema principale sembra essere che è un problema di buffer sul chip in uso. Dalla specifica principale, Volume 3, Parte F, 3.3.2:

Per le notifiche, che non dispongono di una PDU di risposta, non esiste un controllo di flusso e una notifica può essere inviata in qualsiasi momento.

I comandi che non richiedono una risposta non hanno alcun controllo di flusso. Nota: un server può essere inondato di comandi e una specifica di livello superiore può definire come impedire che ciò si verifichi.

I comandi e le notifiche ricevuti ma non possono essere elaborati, a causa di buffer overflow o altri motivi, devono essere eliminati. Pertanto, tali PDU devono essere considerati inaffidabili.

+0

Il problema esiste anche nella direzione dalla scheda di sviluppo a iPhone 4S. – Etan

+1

Write I comandi e le notifiche, come menzionato qui, non hanno alcun meccanismo di controllo del flusso intrinseco. È inattivo l'implementazione per definire cosa succede se si overflow i buffer interni dello stack. Per il comportamento dell'iPhone quando ciò accade, prova a postare questa domanda nella mailing list di Apple Bluetooth. – introiboad

Problemi correlati