2012-04-30 159 views
2

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

主旨的应用程式:

  • 创建虚拟串行端口(/ dev中列出并与由于IOKit注册表中注册)
  • 发起TCP连接到另一个计算机接收上
  • 代理一切虚拟串口出到 网络,反之亦然。

这个应用程序将被第三方应用程序使用,与计算机上的串行端口进行通信,允许特定的串行设备位于网络中。可可和网络部分是没有问题的,我写了几个应用程序通过网络进行交谈。我的挂机是串口。

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

虽然我可以使用pty/tty主/从通讯进行通讯,但我需要这个slave tty显示Mac应用程序。在IO套件注册表中注册一个tty的方法非常方便。

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

感谢您的帮助,您可以提供,
有状态

回答

4

首先,你检查,如果你可以从this app?借用一个解决方案。它不是从网站上显而易见的,如果他们已经设法让他们的虚拟串行端口完全集成到系统中。

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

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

万一你必须这样做,所有的内核:

虚拟驱动程序本身不应该是很多工作,至少,即使它会需要一些时间起床速度与内核开发。不幸的是,这些文档对于串口驱动程序来说非常简单 - 关键在于对抽象类进行子类化。几乎所有我见过的描述都在Ole Henry Halvorsen的OSX和iOS内核编程一书中。它还具有读取&写入操作的示例的片段。(披露:我是本书的技术审阅人之一;我没有收到任何推荐它的激励 - 在这种情况下,它实际上是我所知道的唯一文档)您可以找到完整串行端口驱动程序的源代码在Apple's USBCDC driver,AppleUSBCDCDMM是实际代表串口节点的类。

在内核中打开所谓的"kernel control"套接字比较简单,单个API为documented here;从用户空间使用正常的BSD插座send/recv API。 (这在前面的书中也有描述)然后你的守护进程可以连接到它,你需要做的就是在套接字和虚拟串口设备之间推送数据。当然,您需要正确处理断开连接事件等。

不过,我认为这可以作为一个经验丰富的C程序员的第一个内核项目(使用一些C++)来实现。

我希望有帮助!

+2

好东西,pmjordan。我确实看了看你引用的应用程序,他们实际上是将编译的socat可执行文件捆绑到他们的应用程序中,然后将参数传递给它执行。并且,它使用的那些串行端口也未在IO套件注册表中注册。我买了你提到的那本书的一个副本,那里有大量的信息。感谢指针! – Stateful

+0

@Stateful不客气,祝你好运! – pmdj

+0

@Stateful你有没有继续这一点? – tcv