Вопрос

Я новичок во всем Iokit Stuff, так что могут быть некоторые тривиальные решения для моих проблем. Я играю с 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, а сообщение OpenConnection отправляется в цель. Данные, которые записываются и читают в/из моей USB -трубы, выглядят нормально. Теперь я хотел бы отправить получение, но это как -то терпит неудачу.

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. Должен ли я переопределить этот метод? Или как мне нужно иметь дело с этой длиной пакета?

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top