Mac - 虚拟串口

6
我需要创建一个Cocoa应用程序,该应用程序将创建一个虚拟串行端口供其他应用程序使用,即在IO Kit注册表中注册。
应用程序的要点:
- 创建虚拟串行端口(列在/dev中并在IOKit注册表中注册) - 向另一台计算机发起TCP连接 - 将从虚拟串行端口接收到的所有内容代理到网络上,反之亦然。
这个应用程序将被第三方应用程序使用,这些应用程序与计算机上的串行端口通信,允许特定串行设备位于网络上。 Cocoa和网络部分没有问题,我已经编写了几个可以通过网络通信的应用程序。 我的瓶颈是串行端口。
我已经使用socat / netcat / minicom进行了测试,以验证它可以将pty / tty流量代理到网络上,但是我使用的tty不能被随机应用程序使用,因为它未在IO Kit注册表中注册。
虽然我可以使用pty / tty主/从进行通信,但我需要将此从tty显示给Mac应用程序使用。非常方便的方法是注册tty到IO Kit注册表中。我真的需要创建一个自定义的IOKit kext驱动程序,在Cocoa应用程序运行时对其进行注册吗?如果是这样,我有很大的学习曲线。我应该从哪里开始阅读?或者,我可以使用IOKit创建虚拟串行端口并将其注册为可用的串行端口,而无需加载任何内核扩展吗?
感谢您提供的任何帮助,
Stateful
1个回答

7
首先,您是否已经检查过是否可以从此应用程序中借鉴解决方案?从网站上看不出他们是否已成功将虚拟串口完全集成到系统中。
如果有一种从用户空间实现的方法,我不知道。用户空间IOKit API通常不允许您创建类实例,更不用说新的设备驱动程序类了。也许您可以以某种方式说服Cocoa库找到它,尽管它没有在内核中注册。
我不知道是否可以在内核中创建一个“虚假”的串行端口,然后从用户空间守护程序将您的tty移到/dev的位置。也许这是一个选项。 如果您确实需要在内核中全部完成: 虚拟驱动本身不应该太难,但至少需要一些时间来适应内核开发。不幸的是,串口驱动程序的文档非常薄弱 - 关键是对IOSerialDriverSync抽象类进行子类化。我看到的唯一描述几乎只在Ole Henry Halvorsen的《OSX和iOS内核编程》书中。它还有一个关于读写操作的片段示例。(披露:我是这本书的技术审查员之一;我没有任何推荐它的动机 - 在这种情况下,这是我所知道的唯一文档)您可以在苹果的USBCDC驱动程序中找到完整串行端口驱动程序的源代码,AppleUSBCDCDMM是实际表示串行端口节点的类。
在内核中打开所谓的“内核控制”套接字相对简单,各个API在此处有文档;从用户空间使用正常的BSD套接字send/recv API。(这也在上述书中描述)然后您的守护程序就可以连接到该套接字,所有您需要做的就是在套接字和虚拟串口设备之间传递数据。当然,您还需要正确处理断开连接等事件。
尽管如此,我认为有经验的C程序员(带有一些C ++)可以将其作为第一个内核项目来完成。
希望这有所帮助!

2
非常棒的内容,pmjordan。我确实看了一下你提到的应用程序,他们实际上将 socat 的编译可执行文件捆绑到他们的应用程序中,然后只是传递参数以进行执行。而且,它使用的那些串行端口也没有在 IO Kit 注册表中注册。我买了你提到的书,里面有大量的信息。感谢你的指引! - Stateful
@Stateful 你有进展吗? - tcv
2
嗨tcv,抱歉,不行。我已经转向其他项目了。不过我仍然很想解决这个问题。 - Stateful

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接