我需要创建一个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创建虚拟串行端口并将其注册为应用程序的可用串行端口,而无需加载任何内核扩展?
感谢您提供的任何帮助,
有状态
答案 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 ++)的第一个内核项目实现。
我希望有所帮助!