带有 IOKit 的 USB 上的 OBEX

Posted

技术标签:

【中文标题】带有 IOKit 的 USB 上的 OBEX【英文标题】:OBEX over USB with IOKit 【发布时间】:2012-02-08 01:47:51 【问题描述】:

我是整个 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,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。我是否必须重写该方法?或者我该如何处理这个数据包长度?

【问题讨论】:

我怀疑这可能与设备有关...设备的任何链接/在线文档可能会有所帮助... 【参考方案1】:

我终于想通了。问题由两部分组成。第一个问题是OBEXAddTargetHeader("LivescribeService", strlen("LivescribeService"), header);。因为 strlen 是字符串的长度,而不是使用了多少字节(+1 表示 0x00 字符串终止符),所以设备以错误响应,因为它希望字符串被终止。遗憾的是,OBEXSession 只是忽略了从设备返回的错误。

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

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

【讨论】:

以上是关于带有 IOKit 的 USB 上的 OBEX的主要内容,如果未能解决你的问题,请参考以下文章

Linux上的串口和USB设备有什么区别?

带有 USB 适配器的笔记本电脑上的串行端口

如何在 OS X 上获取 USB 驱动器的硬盘驱动器序列号?

STM32F4 上的 USB 音频输入

如何为 IOKit 属性设置临时权利?

iokit.IOServiceGetMatchingServices 在 Python3 下坏了?