janus-gatewayのAPIの定義は公式サイトを見てもらうとして、でもあれってこんなんを送ったらこんなんが返ってくるかもぉっていう感じで、あくまでもアクセス例であって定義ではないと思うんよね。載ってないフィールドも有ったりするし???
ということで、Retrofit2でのAPI定義インターフェースを載せちゃうぞ?
まずは、janus-gatewayそのものに対するREST風APIの定義から。前回のlong pollのと一緒で先頭に{api}を入れているのはjanus-gatewayの設定でその部分のpathを変更することが可能だからであーる(まだ酔ってないよ)。多少冗長なのもあるけど、勘弁してな。あとPOJOはGitHubのリポジトリJanusRTCAndroidをみてな。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@POST("{api}") public Call<Session> create( @Path("api") final String api, @Body final Creator create); @GET("{api}/info") public Call<ServerInfo> getInfo(@Path("api") final String api); @POST("{api}/{session_id}") public Call<Plugin> attach( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Body final Attach attach); @POST("{api}/{session_id}") public Call<Void> destroy( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Body final Destroy destroy); |
上から順に何をするAPIかを簡単に書くとこんな感じです。
- create
セッションを作成するためのAPI、返り値のセッションidを使って以降の処理を行います。 - info
前回も少し触れましたが、janus-gatewayのサーバー情報を取得するためのAPIです。 - attach
janus-gatewayの実際の処理はプラグインを経由して行います。attachは指定したプラグインへ接続を行います。返ってきたプラグインid(プラグインハンドル)とセッションidを使うとプラグインに対して処理要求を行うことができます。 - destroy
セッションを終了します。プラグインにattachしていればそれも開放されます。
videoroomプラグインに対するAPI定義はこんな感じ。
見て分かる通り、APIを送る先は全て同じ…違うのはリクエストボディだけなので本来はsendだけあれば十分なのですが、そうするとぱっと見でわかりにくくなるのと、リクエストボディのJSON文字列を自前で作らないといけなくなってしまい面倒なので、POJOからリクエストボディを生成できるようにヘルパーとして追加してあります。なのでこっちも多少冗長ですが、勘弁してな。そもそもPOJO使わずに自前で送信データ生成するならRetrofit2を使う理由が半減してしまう気がするし。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
@POST("{api}/{session_id}/{plugin_id}") public Call<EventRoom> join( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Path("plugin_id") final BigInteger pluginId, @Body final Message message); @POST("{api}/{session_id}/{plugin_id}") public Call<EventRoom> offer( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Path("plugin_id") final BigInteger pluginId, @Body final Message message); @POST("{api}/{session_id}/{plugin_id}") public Call<EventRoom> trickle( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Path("plugin_id") final BigInteger pluginId, @Body final Trickle trickle); @POST("{api}/{session_id}/{plugin_id}") public Call<EventRoom> trickleCompleted( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Path("plugin_id") final BigInteger pluginId, @Body final TrickleCompleted trickle); @POST("{api}/{session_id}/{plugin_id}") public Call<ResponseBody> send( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Path("plugin_id") final BigInteger pluginId, @Body final Message message); @POST("{api}/{session_id}/{plugin_id}") public Call<Void> detach( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Path("plugin_id") final BigInteger pluginId, @Body final Detach detach); @POST("{api}/{session_id}/{plugin_id}") public Call<Void> hangup( @Path("api") final String api, @Path("session_id") final BigInteger sessionId, @Path("plugin_id") final BigInteger pluginId, @Body final Hangup hangup); |
こっちも上から順に何をするAPIかを簡単に書くとこんな感じになります。
- join
ビデオチャットルームへ参加します。publisherとして参加する場合もsubscriberとして参加する場合も同じAPIを叩きますが、リクエストボディが少し違います。 - offer
シグナリングの際にofferを送る時に呼び出します。でも対となるanswerを送る時はsendで^^; - trickle
シグナリングの際にIceCandidateを送る時に呼び出します。 - trickleCompleted
シグナリングの際にIceCandidateを送る時に呼び出します。本来はtrickleだけでいいのですが、リクエストボディが少し違うので専用に。 - send
プラグインに対するAPIコールは全てパスが同じでリクエストボディが違うだけなので実際はこのsendだけで十分です…以下省略 - detach
プラグインからdetachします。これを呼び出すとプラグインid(プラグインハンドル)は無効になります。 - hangup
プラグインとはattachしたままでPeerConnectionだけを切断したい場合に使うらしいです、でもサンプルアプリでは使っていません(。・_・。)いまいちユースケースを思いつかない?
API定義は以上、つまりこれであなたもフルスクラッチでjanus-gatewayと接続できる…
んなわけねーだろな?まぁできる人もいるだろうけどたいていはダメだろうなぁ^^;WebRTCのシグナリング周りに詳しければなんとかなるかもしれないけど、そもそもそれならこの記事を読まなくても作れるよな。
飲んでは無いけど眠くなってきた(=_=)
実はこっから先は書くのが難しい、WebRTCワカラナイマン(。・_・。)
単純に言葉で表せば、janus-gatewayの話というよりも、WebRTCのPeerConnectionFactoryとPeerConnectionからのイベント/コールバックとそれに応じてjanus-gatewayのAPIを叩くってことになるんだけど。
えっとぉーPeerConnectionとはなんぞや?とかとかとかはきれいスッパリなくして本家WebRTCのサイト等を見てもらうことにしよう(^o^)/ 残るはAndroidでWebRTCの現時点でのネイティブAPIを使う時にどないするかということで、一旦janus-gatewayから離れてAndroidでWebRTCネイティブAPIを使う話を書こう(iOS?なにそれ?おいしいの?)。
続く(^.^)/~~~