OBEX tramite USB con IOKit
Domanda
Sono nuovo a tutta la roba IOKit, quindi ci potrebbero essere alcune soluzioni banali per i miei problemi. Sto giocando intorno con uno Smartpen che fa OBEX via USB. Finora ho ottenuto una sottoclasse di OBEXSession
con successo la connessione al dispositivo.
OBEXAddTargetHeader("LivescribeService",
strlen("LivescribeService"),
header);
CFMutableDataRef headerData = OBEXHeadersToBytes(header);
OBEXError error = [session OBEXConnect:kOBEXConnectFlagNone
maxPacketLength:maxPacketLength
optionalHeaders:(void *)CFDataGetBytePtr(headerData)
optionalHeadersLength:CFDataGetLength(headerData)
eventSelector:@selector(openedConnection)
selectorTarget:target
refCon:NULL];
Dopo che error
è 0 e il messaggio viene inviato openedConnection al bersaglio. I dati che vengono scritti e letti da / per la pipa USB sembra ok. Ora mi piacerebbe inviare un GET, ma che non riesce in qualche modo.
UInt32 connectionIDInt = 0x1;
const char *connectionID[4] = {0x0,0x0,0x0,0x0};
memcpy(connectionID, &connectionIDInt, 4);
OBEXAddConnectionIDHeader(connectionID, 4, header);
OBEXAddNameHeader(CFSTR("ppdata?key=pp0000"), header);
headerData = OBEXHeadersToBytes(header);
error = [session OBEXGet:YES
headers:(void *)CFDataGetBytePtr(headerData)
headersLength:CFDataGetLength(headerData)
eventSelector:@selector(OBEXGetHandler:)
selectorTarget:target
refCon:nil];
Ma che sempre si traduce in una kOBEXBadArgumentError
e non ho assolutamente idea di cosa sto facendo male. Ho provato a giocare con diverse intestazioni, è sempre lo stesso, e per quanto ne so, questo dovrebbe essere l'intestazione corretta. O che cosa altro argomento probabilmente potrebbe essere sbagliato?
Potrebbe questo avere qualcosa a che fare con la maxPacketLength
che ho usato per la connessione? Ho usato 1024 perché non avevo idea di cosa usare. Ho provato a chiamare -getMaxPacketLength ma che restituisce solo 0. Devo ignorare tale metodo? O come devo far fronte a tale lunghezza del pacchetto?
Soluzione
Alla fine ho capito. Il problema era costituito da due parti. In primo problema è stato OBEXAddTargetHeader("LivescribeService", strlen("LivescribeService"), header);
. Poiché strlen è la lunghezza della stringa e non come vengono usati molti byte (+1 per il terminatore 0x00 stringa) il dispositivo risposto con un errore perché esso vede la stringa da terminare. Purtroppo l'OBEXSession semplicemente ignorato l'errore che è tornato dal dispositivo.
Il secondo problema è stato che ho inviato i dati ricevuti con kOBEXTransportEventTypeStatus
invece di kOBEXTransportEventTypeDataReceived
al metodo clientHandleIncomingData:
.
Ora il collegamento con il dispositivo funziona come previsto.