7

Attualmente sto implementando un'applicazione iOS che utilizza CoreBluetooth per trasferire i dati tra 2 dispositivi. Ad esempio, per inviare i dati dalla centrale al periferico, io uso questo codice:Dimensione massima dei dati durante l'invio di dati tramite BTLE su iOS

NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; 
NSLog(@"Writing data of length %d", [data length]); 
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; 

Questo funziona assolutamente bene, ma la cosa è che ho letto più volte che le caratteristiche in grado di trasferire un massimo di 20 byte subito. Inoltre, quando guardo Apple's BTLE Example Code implementano un meccanismo che divide i dati in blocchi di 20 byte. Ma il codice sopra stampa qualcosa come Writing data of length 124 - i dati arrivano bene sull'altro dispositivo, però.

Quindi: Perché funziona? E ancora di più, temo che questo possa rompersi ad un certo punto, specialmente quando entrano in gioco dispositivi non iOS.

+0

periferiche possono essere sia iOS7 o iOS6? – Rashad

+0

@Rashad iOS 7.0 e iOS 7.1.1. E come ho detto, sono particolarmente interessato se questo si romperà con dispositivi non iOS (che devo considerare) – BlackWolf

+0

@BlackWolf, hai trovato una risposta alla tua domanda. Non riesco a trovare un modo per controllare ATT_MTU per iPhone. In IOS 9 esiste un metodo - (NSUInteger) maximumWriteValueLengthForType: (CBCharacteristicWriteType) di tipo NS_AVAILABLE (NA, 9_0); , questo dà l'ATT_MTU.ma non so se MTU dato da questo metodo è valido per tutte le versioni di iOS. –

risposta

1

Sto usando iOS 7.1.1 e ho anche scoperto che posso inviare fino a 132 byte in modo affidabile da un iPhone a un iPad utilizzando BLE. Ho anche sentito che i 20 byte erano il massimo ma non sembra proprio che sia

+0

È interessante notare che su OS X (e altri sistemi, suppongo) il limite è ancora 20 byte – BlackWolf

+0

quindi come posso aumentare quella dimensione se voglio? –

+1

non è possibile, è qualcosa che è determinato dall'hardware OS +. Devi tagliare i tuoi dati alle dimensioni del blocco appropriate – BlackWolf

1

Come punto di partenza, la dimensione ATT_MTU determina il numero di byte che è possibile scrivere. Questo valore viene scambiato/negoziato tra i due dispositivi. Sfortunatamente, questo valore non sembra essere esposto nell'interfaccia CoreBluetooth di Apple :(

Ma ho appena usato uno sniffer BLE e nel mio caso erano 158 byte. Ma di nuovo questo valore può cambiare nel tempo ...

se si scrive più dati rispetto ATT_MTU quindi lo stack Bluetooth può utilizzare una cosiddetta procedura di Prepare-scrittura, ma non tutte le pile supporta questo. non hanno testato se Apple supporta questa ...

:)

2

Lo standard BLE richiede 23 byte come minimo ATT_MTU (Protocollo massimo di trasmissione degli attributi) che tutti i BLE devici es deve supportare. Il massimo ATT_MTU è di 255 byte, tuttavia, ed è stato raddoppiato di nuovo per BLE 4.2.

BLUETOOTH SPECIFICATION versione 4.2 [Vol 3, Parte A]:

implementazioni Tutti L2CAP sostiene un MTU minimo di [...] 23 ottetti oltre il nesso logico LE-U; tuttavia, alcuni protocolli e profili richiedono esplicitamente il supporto per un MTU più grande .

Quando si stabilisce una connessione, entrambi i dispositivi scambieranno la loro dimensione ATT_MTU e verrà utilizzato il più piccolo di entrambi i valori. Quando Apple ha iniziato con BLE, avrebbero solo supportato il minimo, ma da allora hanno ampliato le dimensioni possibili. Questo è il motivo per cui i tuoi 124 byte funzionano, ma la documentazione e il codice di esempio più vecchi utilizzano un ATT_MTU molto più piccolo.

1

Su iOS 9+ è possibile utilizzare questo metodo su ogni CBCentral sottoscritto per determinare la quantità di dati da inviare al pezzo:

[central maximumUpdateValueLength]; 
+1

Non è pensato solo per l'uso dal lato periferico? – JustAMartin

+0

Questo è solo per periferiche –