4

我需要创建一个 Cocoa 应用程序,它将创建一个可用于其他应用程序的虚拟串行端口,这意味着在 IO Kit Registry 中注册。

该应用程序的要点:

  • 创建一个虚拟串口(在 /dev 中列出并在 IOKit Registry 中注册)
  • 启动到另一台计算机的 tcp 连接
  • 将虚拟串行端口上收到的所有内容代理到网络,反之亦然。

此应用程序将由与计算机上的串行端口通信的第三方应用程序使用,从而允许在网络上定位特定的串行设备。Cocoa 和网络部分没有问题,我已经编写了几个通过网络通信的应用程序。我的挂断是串口。

我已经使用 socat/netcat/minicom 进行了测试,以验证它是否可以通过网络代理 pty/tty 流量,但我使用的 tty 并没有显示为可供随机应用程序使用,因为它没有在 IO Kit 中注册注册表。

虽然我可以使用 pty/tty 主/从进行通信,但我需要这个从 tty 才能显示给 Mac 应用程序。非常方便的是在 IO Kit Registry 中注册 tty 的方法。

我真的需要创建一个在 Cocoa 应用程序运行时注册的自定义 IOKit kext 驱动程序吗?如果是这样,我前面有一个很大的学习曲线。我应该从哪里开始阅读?或者,我可以使用 IOKit 创建一个虚拟串行端口并将其注册为应用程序的可用串行端口,而无需加载任何内核扩展?

感谢您提供的任何帮助,
有状态的

4

1 回答 1

6

首先,您是否检查过是否可以从该应用中借用解决方案?从网站上看,他们是否设法将虚拟串行端口完全集成到系统中并不明显。

如果有办法从用户空间做到这一点,我不知道。用户空间 IOKit API 通常不允许您创建类实例,更不用说新的设备驱动程序类了。也许您可以以其他方式说服 Cocoa 库找到它,尽管它没有在内核中注册。

我不知道您是否可以在内核中创建一个“虚拟”串行端口,然后将您的 tty 从您的用户空间守护进程移到 /dev 中的位置。也许这是一个选择。

如果您必须在内核中完成所有操作:

至少,虚拟驱动程序本身不应该做太多的工作,尽管它需要一些时间来跟上内核开发的速度。不幸的是,串行端口驱动程序的文档非常薄——关键是IOSerialDriverSync抽象类的子类化。我看到的唯一描述是在 Ole Henry Halvorsen 的OSX 和 iOS 内核编程一书中。它还有一个用于读写操作的示例片段。(披露:我是这本书的技术审阅者之一;我没有收到任何推荐它的动机 - 在这种情况下,它实际上是我所知道的唯一文档)你可以在Apple 的USBCDC 驱动程序AppleUSBCDCDMM是实际代表串口节点的类。

在内核中打开一个所谓的“内核控制”套接字相对简单,各个 API 都在此处记录;在用户空间中,您使用普通的 BSD 套接字send/ recvAPI。(这在前面的书中也有描述)然后你的守护进程可以连接到那个,你需要做的就是在套接字和虚拟串行端口设备之间推送数据。当然,您需要正确处理断开连接事件等。

尽管如此,我认为对于有经验的 C 程序员(使用一些 C++)来说,这是可以实现的第一个内核项目。

我希望这会有所帮助!

于 2012-04-30T19:39:05.117 回答