使用IOKit通过USB进行OBEX

时间:2012-01-11 17:26:07

标签: macos cocoa iokit obex

我是整个IOKit的新手,所以可能会有一些简单的解决方案来解决我的问题。我正在玩一个通过USB进行OBEX的Smartpen。到目前为止,我有一个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,并将opensConnection消息发送给目标。从我的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 个答案:

答案 0 :(得分:1)

最后我明白了。问题包括两部分。第一个问题是OBEXAddTargetHeader("LivescribeService", strlen("LivescribeService"), header);。因为strlen是字符串的长度而不是使用了多少字节(0x00字符串终止符为+1),所以设备响应错误,因为它期望字符串终止。遗憾的是,OBEXSession忽略了从设备返回的错误。

第二个问题是我使用kOBEXTransportEventTypeStatus而不是kOBEXTransportEventTypeDataReceived将收到的数据发送到clientHandleIncomingData:方法。

现在,与设备的连接按预期工作。