OBEX sur USB avec IOKit
Question
Je suis nouveau à l'étoffe entière IOKit, donc il pourrait y avoir des solutions triviales pour mes problèmes. Je joue autour avec un stylo numérique qui fait OBEX sur USB. Jusqu'à présent, je suis une sous-classe de OBEXSession
à succès se connecter au périphérique.
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];
Après que error
est 0 et le message openedConnection est envoyé à la cible. Les données qui sont écrites et lues à / de ma pipe USB semble ok. Maintenant, je voudrais envoyer une requête GET, mais qui ne parvient en quelque sorte.
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];
Mais qui a toujours des résultats dans un kOBEXBadArgumentError
et je n'ai absolument aucune idée de ce que je fais mal. J'ai essayé de jouer avec les en-têtes différents, il est toujours la même, et pour autant que je sache, cela devrait être l'en-tête correcte. Ou quel autre argument pourrait probablement tort?
peut-il avoir quelque chose à voir avec le maxPacketLength
j'ai utilisé pour la connexion? J'utilisé 1024 parce que je ne savais pas quoi utiliser. J'ai essayé d'appeler -getMaxPacketLength mais retourne juste 0. Dois-je remplacer cette méthode? Ou comment dois-je faire face à cette longueur de paquet?
La solution
Enfin, je compris. Le problème se composait de deux parties. Le premier problème a été OBEXAddTargetHeader("LivescribeService", strlen("LivescribeService"), header);
. Parce que strlen est la longueur de la chaîne et non le nombre d'octets sont utilisés (+1 pour la fin de chaîne 0x00), le dispositif a répondu avec une erreur, car il attend la chaîne à mettre fin. Malheureusement, le OBEXSession simplement ignoré l'erreur qui est revenue de l'appareil.
Le deuxième problème était que j'ai envoyé les données reçues avec kOBEXTransportEventTypeStatus
au lieu de kOBEXTransportEventTypeDataReceived
à la méthode clientHandleIncomingData:
.
Maintenant, la connexion à l'appareil fonctionne comme prévu.