【问题标题】:Mac - Virtual Serial PortMac - 虚拟串口
【发布时间】:2012-04-30 18:46:49
【问题描述】:

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

应用要点:

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

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

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

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

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

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

【问题讨论】:

    标签: macos serial-port iokit


    【解决方案1】:

    首先,您是否检查过是否可以从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++)来说,我认为这是可以实现的第一个内核项目。

    希望对你有帮助!

    【讨论】:

    • 好东西,pmjordan。我确实查看了您引用的那个应用程序,他们实际上将 socat 的编译可执行文件捆绑到他们的应用程序中,然后只是将参数传递给它以供执行。而且,它使用的那些串行端口也没有在 IO Kit Registry 中注册。我买了你提到的那本书,里面有很多信息。谢谢指点!
    • @Stateful 你有没有解决这个问题?
    • 嗨 tcv,对不起,没有。我转向了其他一些项目。不过,我仍然很想解决这个问题。
    猜你喜欢
    • 2015-12-10
    • 1970-01-01
    • 2010-09-06
    • 2017-03-28
    • 1970-01-01
    • 2023-03-11
    • 2010-09-10
    • 2010-09-08
    • 2011-01-08
    相关资源
    最近更新 更多