OBEX через USB с IOKit
Я новичок во всем, что касается 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 ответ
Наконец я понял это. Проблема состояла из двух частей. Первая проблема была OBEXAddTargetHeader("LivescribeService", strlen("LivescribeService"), header);
, Поскольку strlen - это длина строки, а не количество используемых байтов (+1 для ограничителя строки 0x00), устройство ответило с ошибкой, поскольку оно ожидает завершения строки. К сожалению, OBEXSession просто проигнорировал ошибку, которая вернулась с устройства.
Вторая проблема заключалась в том, что я отправил полученные данные с kOBEXTransportEventTypeStatus
вместо kOBEXTransportEventTypeDataReceived
к clientHandleIncomingData:
метод.
Теперь подключение к устройству работает как положено.