OBEX через USB с IOKit - PullRequest
       7

OBEX через USB с IOKit

3 голосов
/ 11 января 2012

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

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, и сообщение открытое соединение отправляется цели. Данные, которые записываются и читаются в / из моего 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. Должен ли я переопределить этот метод? Или как мне иметь дело с этой длиной пакета?

1 Ответ

1 голос
/ 20 января 2012

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

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

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

...