Mac - 虚拟串口

时间:2012-04-30 18:46:49

标签: macos serial-port iokit

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

应用程序的要点:

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

如果您必须在内核中执行所有操作:

虚拟驱动程序本身不应该太多工作,至少,尽管需要一些时间来熟悉内核开发。不幸的是,对于串行端口驱动程序,文档非常简洁 - 关键是对IOSerialDriverSync抽象类进行子类化。我见过的唯一描述是Ole Henry Halvorsen的 OSX和iOS内核编程一书。它还有一个用于阅读和阅读的例子的片段。写作业务。 (披露:我是本书的技术评审员之一;我没有收到推荐它的任何奖励 - 在这种情况下,它确实是我所知道的唯一文档)你可以找到源代码Apple's USBCDC driver中的完整串行端口驱动程序,AppleUSBCDCDMM是实际代表串行端口节点的类。

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

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

我希望有所帮助!