2012-01-11 5 views
3

Я новичок во всем материале IOKit, поэтому могут возникнуть некоторые тривиальные решения для моих проблем. Я играю с Smartpen, который делает OBEX через USB. До сих пор я получил подкласс OBEXSession, чтобы успешно подключиться к устройству.OBEX через USB с IOKit

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]; 

После этого error равно 0, и сообщение посылается openedConnection к цели. Данные, которые записываются и читаются в/из моей трубки USB, выглядят нормально. Теперь я хочу отправить GET, но это как-то не получается.

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]; 

Но это всегда приводит к kOBEXBadArgumentError, и я совершенно не знаю, что я делаю неправильно. Я пытался играть с разными заголовками, это всегда одно и то же, и, насколько я знаю, это должен быть правильный заголовок. Или какой другой аргумент может быть ошибочным?

Может это что-то сделать с maxPacketLength Я использовал для подключения? Я использовал 1024, потому что я понятия не имел, что использовать. Я попытался вызвать -getMaxPacketLength, но он возвращает только 0. Нужно ли переопределять этот метод? Или как мне нужно иметь дело с этой длиной пакета?

+0

Я подозреваю, что это может быть зависимым от устройства ... любая ссылка/документация на устройство может помочь ... – Yahia

ответ

1

Наконец-то я понял это. Проблема состояла из двух частей. Первая проблема была OBEXAddTargetHeader("LivescribeService", strlen("LivescribeService"), header);. Поскольку strlen - это длина строки, а не количество байтов (+1 для терминатора строк 0x00), устройство ответило на ошибку, потому что ожидает, что строка будет прервана. К сожалению, OBEXSession просто проигнорировала ошибку, которая вернулась с устройства.

Вторая проблема заключалась в том, что я отправил полученные данные с kOBEXTransportEventTypeStatus вместо kOBEXTransportEventTypeDataReceived в метод clientHandleIncomingData:.

Теперь подключение к устройству работает должным образом.