Help us understand the problem. What is going on with this article?

Janus gatewayのAdmin APIを使ってみる

概要

Janus gatewayというWebRTCメディアサーバーについての記事は多数ありますが、
用意されているAPIの使い方については公式以外ほとんどありません。
調べるのに苦労しましたので、ここにまとめておきたいと思います。

参考になるサイト

APIの種類

Janusで用意されているAPIには大きく分けると二つの種類があります。

  • Admin API

Janusを管理、モニターするためのAPIです。
この記事にて使ってみます。

  • プラグイン API

Janusにはビデオ通話やストリーミング、SIP関連などの多数のプラグインが用意されています。
そのプラグインを操作するためのAPIです。
次回記事にて使ってみるつもりです。

Websocketを介してAdmin APIを使ってみる

Janusのコンフィグを設定する

Admin APIを呼び出す際に使うパスワードを設定します。

/usr/local/etc/janus/janus.cfg
[general]
admin_secret = password

 
Websocketを介して使えるように設定します。
今回はwsの設定していますが、暗号化が必要な場合はwssの設定および証明書の準備をしましょう。
また、ここで指定したポートはFW等でブロックされないようにしておきます。

/usr/local/etc/janus/janus.transport.websockets.cfg
[admin]
admin_ws = yes
admin_ws_port = 7188

Pythonでコードを書く

Pythonのバージョンは2.7です。
今回はJanusにアクセスしてきたユーザの情報をモニターしてみます。

まずは、アクセスしているセッションのリストを取得します。

import websocket
import json
import random
import string

# Janusのエンドポイント
janus_admin_url = 'ws://10.0.0.1:7188/janus'

# 管理用パスワード
janus_admin_secret = 'password'

# ランダム文字生成
def random_string(length, seq=string.digits):
    sr = random.SystemRandom()
    return ''.join([sr.choice(seq) for i in range(length)])

# 8文字のランダム文字
transaction = random_string(8)

# list_sessionsメソッド呼び出すJsonを作る
data = {"janus":'list_sessions', "admin_secret": janus_admin_secret, "transaction": transaction}

# Websocketのコネクションを作成
websock = websocket.create_connection(janus_admin_url,subprotocols=["janus-admin-protocol"])

# 送信
websock.send(json.dumps(data))

# 受信
rejson =  websock.recv()

# 受信結果を表示
print rejson
{
   "janus": "success",
   "transaction": "73677159",
   "sessions": [
      311091039069809
   ]
}

次に、そのセッションがハンドルしているリストを取得します。
複数のプラグインが使われている場合などは、ハンドルが複数返されます。

sessions_list = json.loads(rejson).get('sessions',[])

# list_handlesメソッド呼び出すJsonを作る
data = {"janus":'list_handles', "admin_secret": janus_admin_secret, "transaction": transaction, "session_id": sessions_list[0]}

websock.send(json.dumps(data))
rejson =  websock.recv()
print rejson

{
   "janus": "success",
   "transaction": "73677159",
   "session_id": 311091039069809,
   "handles": [
      1721128026873430
   ]
}

最後に、そのハンドルの情報を取得します。

handles_list = json.loads(rejson).get('handles',[])

# handle_infoメソッド呼び出すJsonを作る
data = {"janus":'handle_info', "admin_secret": janus_admin_secret, "transaction": transaction, "session_id": sessions_list[0], "handle_id": handles_list[0]}

websock.send(json.dumps(data))
rejson =  websock.recv()
print rejson
{
   "janus": "success",
   "transaction": "73677159",
   "session_id": 311091039069809,
   "handle_id": 1721128026873430,
   "info": {
      "session_id": 311091039069809,
      "session_last_activity": 1367674698,
      "session_transport": "janus.transport.http",
      "handle_id": 1721128026873430,
      "opaque_id": "videoroomtest-L4YiOtywt1nm",
      "created": 464048923,
      "send_thread_created": true,
      "current_time": 1368713443,
      "plugin": "janus.plugin.videoroom",
      "plugin_specific": {
         "type": "publisher",
         "room": 1234,
         "id": 4565592288551424,
         "private_id": 3477273478,
         "display": "You",
         "media": {
            "audio": true,
            "audio_codec": "opus",
            "video": true,
            "video_codec": "h264",
            "data": false
         },
         "bitrate": 128000,
         "audio-level-dBov": 0,
         "talking": false,
         "destroyed": 0
      },

      ・・・
      (省略)
      ・・・
   }
}

上記の情報を説明します。
infoのpluginが「janus.plugin.videoroom」となっていることから、
このユーザはvideoroomにアクセスしていることがわかります。
またpluginの詳細はplugin_specificにあり、
room番号が「1234」、名前が「You」ということがわかります。
その他にもコーデックやビットレート、SDP等の情報も取得することができます。

最後に

今回はAdmin APIの基本的な使い方を説明しました。
この他にもAdmin APIには多数のメソッドが用意されています。
公式サイトを確認してみてください。
次回はプラグインAPIについても記事を書きたいと思います。

余談

今回が自分のQiita初記事でした。
間違っている箇所等あれば、ぜひご指摘ください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした