PJSIP - オープンソースSIPスタック 日本語訳


本日本語訳は[PJSIP - Open Source SIP Stack](http://www.pjsip.org/docs/latest/pjsip/docs/html/index.htm)をよりよく理解をする支援を行う目的で作成されたものであり、非公式なドキュメントです。

原文: [PJSIP - Open Source SIP Stack](http://www.pjsip.org/docs/latest/pjsip/docs/html/index.htm)

## PJSIPって何？
PJSIPは、小さなフットプリント、高い性能、そして柔軟さを持つようにデザインされた、オープンソースのSIPプロトコルスタックです。

### 歴史
PJSIPは2003年から開発が活発に行われています。しかし実際にはもっと以前から開発が行われてきました。最初の開発者はSIPスタックの実装を1999年に開始しました。RFC2543の時代です。そしてプログラミングにおけるいくつかの異なるアプローチ（最初の実装はC++で行われました！）と、SIPプロトコル自体の発展があり、現在(第３世代)のPJSIP(バージョン0.2.9は第二世代です)は、長年の開発経験から学んだ設計面での考慮と実装面での工夫を取り込む事で、かなり安定していると考えられます。
もちろん、将来においてもこの宣言が維持されるかどうかは、時が経ってみなければわかりません。


## さあ始めよう

PJSIPは、トップレベルと各階層から提供される、様々なレベルでのAPIを含んでいます。
その為、このドキュメントの新しい読者は読み始める場所を特定する事が、ほんのちょっと難しいと感じるかもしれません。

## PJSUA APIを使う
[PJSUA API - High Level Softphone API](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSUA__LIB.htm)は、典型的なSIPクライアントアプリケーションを作るのに必要な、全てのSIPコンポーネントとメディアを高位のAPIでラップしています。
以下のようなものを簡単に実現する事が出来ます。

* 複数アカウントの登録(accounts)
* 高レベルのSIP/メディアセッション(calls)
* 友達リスト、プレゼンス（訳者注: 状態/退席中、在席中など）、インスタント・メッセージ
* 高機能で簡単に使えるメディア操作

いくつかのタイプのアプリケーションで必要とされるカスタマイズ（例えばカスタムSIPトランスポート、カスタムSIPメディアなど）の為に、ソースコードの幾つかの部分をメンテナンスしている間も、[PJSUA API - High Level Softphone API](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSUA__LIB.htm)は、スレッド戦略やメモリ制限を注意深く扱うことで、PDAや携帯電話などのデバイス上で動作可能であるように意識してきました（コール数、メディアポートなどなど...）。

しかしながら、[PJSUA API - High Level Softphone API](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSUA__LIB.htm)は、いくつかのタイプのアプリケーションにとっては最も適切なAPIではないかもしれません。
もっともっと進んだ用途の場合、PJSIPとPJMEDIAを直接使用してアプリケーションを実装するのが、より良い方法です。それについては次の項目で述べます。

## PJSIPとPJMEDIAを直接使用する
最高の柔軟性とパワーを得るには、PJSIPとPJMEDIAを直接使うのが最も良い方法です。
ただし言うまでもなく、この方法の欠点は学習曲線がひどく急勾配な事です。

しかしながら、以下のリンクが有益な情報を提供してくれるでしょう。

* [PJSIP Developer's Guide](http://www.pjsip.org/docs.htm) PDFドキュメントは、PJSIPのデザインコンセプトを理解する為の最高の説明書です。
* [pjsip-apps/src/samples](http://www.pjsip.org/cgi-bin/viewcvs.cgi/pjproject/trunk/pjsip-apps/src/samples/)ディレクトリに幾つかのサンプルが有ります。
* [PJSUA API - High Level Softphone API](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSUA__LIB.htm)のソースコードは、PJSIP/PJMEDIAを使用して高位のAPIをどのように実装するのか参考になると思います。
* そして最後に、あなたはいつだってソースコードを参照する事ができます！

## このドキュメントについて
このドキュメントはPJSIPに関するリファレンスを含んでいます。より深いレベルの説明（および一般情報）は、[PJSIP Developer's Guide](http://www.pjsip.org/docs.htm)というPDFドキュメントを読む事をお勧めします。これは[http://www.pjsip.org/docs.htm](http://www.pjsip.org/docs.htm)にあります。

### ドキュメントの読み方
メインの目次は、このページの一番上のリンクの[Modules](http://www.pjsip.org/docs/latest/pjsip/docs/html/modules.htm)にあります。

このドキュメントはPJSIPのヘッダーファイルから[Doxgen](http://www.doxygen.org/)によって整形されました。

### コンテンツ
各コンテンツの詳細を知るには、ページの最初にある[Modules](http://www.pjsip.org/docs/latest/pjsip/docs/html/modules.htm)リンクをクリックしてください。

以下が[Modules](http://www.pjsip.org/docs/latest/pjsip/docs/html/modules.htm)における、トップレベルのセクションで、図のようにレイアウトされています。
![pjsip-arch.jpg](https://qiita-image-store.s3.amazonaws.com/0/13835/6471e433-6f66-e90b-52b7-cd9e7951340f.jpeg "pjsip-arch.jpg")
スタティックライブラリのレイアウト

最下層からスタティックライブラリを列挙します。

* [PJLIB](http://www.pjsip.org/pjlib/docs/main.htm)は抽象プラットフォームとフレームワーク・ライブラリです。この階層には全てのライブラリが依存しています。
* PJLIB-UTILはテキスト処理、XML、STUNなどのための補助関数を提供します。
* PJMEDIAはマルチメディアのためのフレームワークです。
* PJMEDIA-CODECはメディアコーデックのプレースホルダです。
* [Core SIP Library]() (PJSIP-CORE)はPJSIPライブラリのコア部分であり、アプリケーション内の全てのSIPオブジェクトのオーナー/マネージャーであるSIP [Endpoint](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSIP__ENDPT.htm)を含んでいます。全てのSIPオブジェクトとは、例えばメッセージングエレメント、パース、転送の管理、モジュールの管理、そしてステートレス・オペレーションなどを含みます。
* PJSIP-COREに含まれる[Transaction Layer](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSIP__TRANSACT.htm)モジュールは、ステートフル・オペレーションや、ダイアログのような、より高いレイヤの基本機能を提供します。
* PJSIP-COREに含まれる[Base User Agent Layer/Common Dialog Layer](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSIP__UA.htm)モジュールはダイアログの管理とダイアログの使用法に関するサポートを提供します。
* [Event and Presence Framework](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSIP__SIMPLE.htm) (PJSIP-SIMPLE)は基本的なSIPイベント・フレームワーク（これはcommon/base ダイアログフレームワークによって使用されます）と、transfer functionsから使用される、プレゼンス機能の上位実装です。
* [User Agent Library](http://www.pjsip.org/docs/latest/pjsip/docs/html/group__PJSIP__HIGH__UA.htm) (PJSIP-UA)は、INVITEセッションの高レベル抽象層です（内部でcommon/baseダイアログ フレームワークを使用します）。このライブラリは主にSIPクライアントの登録とコール転送の為の関数を提供します。
* そして最後に、PJSUA API - High Level Softphone API (PJSUA-LIB)は最高レベルの抽象層です。これは既に挙げた全ての関数群を高レベルにラップし、APIを簡単に使えるようにするためのものです。