Mac - Virtual Serial Port
Brauche ich zum erstellen einer Kakao-app, erstellen Sie einen virtuellen seriellen port für andere apps verfügbar, was bedeutet, registriert in den IO-Kit-Registrierung.
Kern der app:
- Erstellen Sie einen virtuellen seriellen port (aufgelistet in /dev und registriert mit dem IOKit Registry)
- Initiieren einer tcp-Verbindung von einem anderen computer
- Proxy alles empfangen, die auf dem virtuellen seriellen Anschluss aus, um die
Netzwerk und Umgekehrt.
Dieser app verwendet werden, die von Drittanbieter-apps, die reden zu seriellen ports auf dem computer, so dass für die jeweilige serielle Geräte über das Netzwerk verteilt. Die Kakao-und Netzwerk-Teil ist kein problem, ich habe mehrere apps geschrieben, dass die Rede über das Netzwerk. Meine hangup ist die serielle Schnittstelle.
Ich getan habe, den test mit schockiert/netcat/minicom, um zu überprüfen, dass es alle arbeiten, die proxy-pty/tty Datenverkehr über das Netzwerk, sondern die tty ich nicht als nutzbar, die von zufälligen Anwendungen, weil es nicht erfasst werden in der IO-Kit-Registrierung.
Während ich kann ein pty/tty-master/slave für die Kommunikation, ich muss das slave-tty zu zeigen, bis zu Mac-Anwendungen. Was praktisch wäre, ist eine Möglichkeit, sich zu registrieren eine tty-Schnittstelle in der IO-Kit-Registrierung.
Brauche ich wirklich, um eine benutzerdefinierte IOKit kext-Treiber, der registriert bekommt bei Cocoa-app-Laufzeit? Wenn so, ich haben eine große Lernkurve vor mir. Wo sollte ich anfangen zu Lesen? Oder, kann ich IOKit zum erstellen einer virtuellen seriellen port, und registrieren Sie es als eine nutzbare serielle Schnittstelle für Anwendungen, die zimmerreserviereung, ohne das laden von kernel-Erweiterungen?
Vielen Dank für jede Hilfe Sie bereitstellen können,
Stateful
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst von allen, haben Sie überprüft, ob Sie ausleihen können, die eine Lösung von mit diesem app? Es ist nicht eindeutig aus der website, wenn Sie es geschafft haben, Ihre virtuellen seriellen ports, die vollständig in das system integriert.
Ob es einen Weg gibt, es zu tun vom user-space, ich bin mir nicht bewusst es. Der user-space-IOKit-API in der Regel nicht lassen, erstellen Sie Instanzen der Klasse, geschweige denn neue Geräte-Treiber-Klassen. Vielleicht kann man das irgendwie sonst überzeugen die Cocoa-Bibliotheken zu finden, obwohl Sie nicht eingetragen in den kernel.
Ich weiß nicht, ob Sie bekommen konnte, Weg mit der Erstellung einer "dummy" serielle Schnittstelle in den kernel und dann bewegen Sie Ihr tty-Gerät an seinen Platz in /dev aus Ihrem userspace-daemon. Vielleicht ist das eine option.
In den Fall, Sie haben es zu tun alles in den kernel:
Der virtuelle Fahrer sollte man sich nicht zu viel Arbeit, zumindest, aber es wird einige Zeit dauern, um bis zu Geschwindigkeit, mit der kernel-dev. Leider ist die Dokumentation Recht Dünn für serial-port-Treiber - der Schlüssel ist die Unterklassen der
IOSerialDriverSync
abstrakte Klasse. Nur über die einzige Beschreibung, die ich gesehen habe, ist in Ole Henry Halvorsen ist OSX und iOS Kernel Programming Buch. Es hat auch ein fragment, ein Beispiel für das Lesen & schreiben-Operationen. (Offenlegung: ich war einer von den tech-Rezensenten für dieses Buch; ich don 'T erhalten keine Anreize, es empfehle - in diesem Fall es' s buchstäblich die einzige Dokumentation, die ich kenne) können Sie den Quellcode für eine komplette serial port driver in Apple USBCDC Treiber,AppleUSBCDCDMM
ist die Klasse, in der Tat stellt die serielle port-Knoten.Es ist relativ einfach zu öffnen, ein so genanntes "kernel control" Steckdose im kernel, der die einzelnen APIs sind hier dokumentiert; von user-space-verwenden Sie die normalen BSD-socket -
send
/recv
APIs. (dies ist auch beschrieben in dem oben genannten Buch) Ihre daemon verbinden können, und alles, was Sie würde tun müssen, ist push die Daten zwischen der Buchse und der virtuelle serielle port-Gerät. Werden Sie behandeln müssen, trennen Sie die Ereignisse und so richtig natürlich.Immer noch, ich denke, das ist erreichbar, wie ein erste-kernel-Projekt für einen erfahrenen C-Programmierer (mit einigen C++).
Ich hoffe, das hilft!