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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top