OBEX sobre USB con iokit
Pregunta
Soy nuevo en todas las cosas de Iokit, por lo que puede haber algunas soluciones triviales para mis problemas. Estoy jugando con un SmartPen que hace OBEX sobre USB. Hasta ahora obtuve una subclase de OBEXSession
para conectarse con éxito 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];
Después error
es 0 y el mensaje OpenedConnection se envía al objetivo. Los datos que se escriben y leen a/desde mi tubería USB se ven bien. Ahora me gustaría enviar un Get, pero eso de alguna manera falla.
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];
Pero eso siempre resulta en un kOBEXBadArgumentError
Y no tengo absolutamente ninguna idea de lo que estoy haciendo mal. Traté de jugar con diferentes encabezados, siempre es lo mismo, y hasta donde sé, este debería ser el encabezado correcto. ¿O qué otro argumento probablemente podría estar mal?
¿Podría esto tener algo que ver con el maxPacketLength
¿Usé para conectarme? Usé 1024 porque no tenía idea de qué usar. Traté de llamar -getMaxPacketLength pero eso regresa solo 0. ¿Tengo que anular ese método? ¿O cómo tengo que lidiar con esa longitud de paquete?
Solución
Finalmente lo descubrí. El problema consistió en dos partes. El primer problema fue OBEXAddTargetHeader("LivescribeService", strlen("LivescribeService"), header);
. Debido a que Strlen es la longitud de la cadena y no cuántos bytes se usan (+1 para el terminador de cadena 0x00), el dispositivo respondió con un error porque espera que la cadena termine. Lamentablemente, la OBEXSSIÓN simplemente ignoró el error que regresó del dispositivo.
El segundo problema fue que envié los datos recibidos con kOBEXTransportEventTypeStatus
en vez de kOBEXTransportEventTypeDataReceived
hacia clientHandleIncomingData:
método.
Ahora la conexión al dispositivo funciona como se esperaba.