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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top