我需要创建一个Cocoa应用程序,它将创建一个可供其他应用程序使用的虚拟串行端口,这意味着在IO Kit Registry中注册。
应用的要点:
此应用程序将由与计算机上的串行端口通信的第三方应用程序使用,允许特定串行设备位于网络上。 Cocoa和网络部分没有问题,我写了几个通过网络交谈的应用程序。我的挂断是串口。
我已经使用socat / netcat / minicom进行了测试,以验证它是否能够通过网络代理pty / tty流量,但是我使用的tty并不会被随机应用程序显示为可用,因为它没有在IO Kit中注册注册。
虽然我可以使用pty / tty主/从进行通信,但我需要这个slave tty来显示Mac应用程序。什么是非常方便的是在IO Kit注册表中注册tty的方法。
我是否真的需要创建一个在Cocoa应用程序运行时注册的自定义IOKit kext驱动程序?如果是这样,我前面有一个很大的学习曲线。我应该在哪里开始阅读?或者,我是否可以使用IOKit创建虚拟串行端口并将其注册为应用程序的可用串行端口,而无需加载任何内核扩展?
感谢您提供任何帮助, 有状态
首先,您是否可以检查是否可以从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 ++)的第一个内核项目实现。
我希望有所帮助!