4

他のアプリで使用できる仮想シリアル ポートを作成する Cocoa アプリを作成する必要があります。つまり、IO Kit レジストリに登録されます。

アプリの要点:

  • 仮想シリアル ポートを作成します (/dev にリストされ、IOKit レジストリに登録されます)。
  • 別のコンピューターへの tcp 接続を開始する
  • 仮想シリアル ポートで受信したすべてをネットワークにプロキシし、その逆も同様です。

このアプリは、コンピューターのシリアル ポートと通信するサード パーティのアプリによって使用され、特定のシリアル デバイスをネットワーク経由で配置できるようにします。Cocoa とネットワークの部分は問題ありません。ネットワーク経由で通信するアプリをいくつか作成しました。私のハングアップはシリアルポートです。

socat/netcat/minicom でテストを行って、ネットワーク経由で pty/tty トラフィックをプロキシするためにすべてが機能することを確認しましたが、使用する tty は、IO キットに登録されていないため、ランダムなアプリケーションで使用可能として表示されません。レジストリ。

通信には pty/tty マスター/スレーブを使用できますが、Mac アプリケーションに表示するにはこのスレーブ tty が必要です。非常に便利なのは、tty を IO Kit Registry に登録する方法です。

Cocoa アプリの実行時に登録されるカスタム IOK​​it kext ドライバーを本当に作成する必要がありますか? もしそうなら、私は私の前に大きな学習曲線を持っています. どこから読み始めればよいですか?または、IOKit を使用して仮想シリアル ポートを作成し、カーネル拡張機能をロードすることなく、アプリケーションで使用可能なシリアル ポートとして登録できますか?

あなたが提供できる助けをありがとう、
ステートフル

4

1 に答える 1

6

まず、このアプリからソリューションを借りることができるかどうかを確認しましたか? 仮想シリアル ポートがシステムに完全に統合されているかどうかは、Web サイトからは明らかではありません。

ユーザー空間からそれを行う方法がある場合、私はそれを認識していません。ユーザー空間の IOKit API では通常、新しいデバイス ドライバー クラスはおろか、クラス インスタンスを作成することもできません。おそらく、カーネルに登録されていないにもかかわらず、Cocoa ライブラリーにそれを見つけるよう説得することができます。

カーネルに「ダミー」シリアルポートを作成して、tty をユーザー空間デーモンから /dev のその場所に移動できるかどうかはわかりません。多分それはオプションです。

カーネルですべてを行う必要がある場合:

仮想ドライバー自体は、少なくとも大した作業ではありませんが、カーネル dev の速度に追いつくにはある程度の時間が必要です残念ながら、シリアル ポート ドライバーのドキュメントはかなり薄いです。重要なのは、IOSerialDriverSync抽象クラスをサブクラス化することです。私が見た唯一の説明は、Ole Henry Halvorsen のOSX and iOS Kernel Programmingの本にあります。また、読み取りおよび書き込み操作の例の断片もあります。(開示:私はこの本の技術評論家の 1 人でした。私はそれを推奨するインセンティブを受け取っていません。この場合、文字通り私が知っている唯一のドキュメントです)。完全なシリアル ポート ドライバのソースは、Apple のUSBCDC ドライバー,AppleUSBCDCDMMシリアル ポート ノードを実際に表すクラスです。

カーネルでいわゆる「カーネル制御」ソケットを開くのは比較的簡単です。個々の API はここに文書化されています。ユーザー空間からは、通常の BSD ソケットsend/ recvAPI を使用します。(これは前述の本でも説明されています) その後、デーモンはそれに接続できます。あとは、ソケットと仮想シリアル ポート デバイスの間でデータをプッシュするだけです。もちろん、切断イベントなどを正しく処理する必要があります。

それでも、これは経験豊富な C プログラマー (C++ を使用) にとって最初のカーネル プロジェクトとして実現可能だと思います。

それが役立つことを願っています!

于 2012-04-30T19:39:05.117 に答える