前書き
この記事は 現在も編集中 です。
随時更新予定なので抜けている情報があります。
成果物
コマンドラインからOSCをブロードキャストするサーバを立ち上げるツールosc_broadcasterを作成しました。
インストール
以下の三つの方法があります。
- Homebrewでインストール
- ビルド済みファイルをダウンロード
- ソースコードをビルドしてインストール
Homebrewからインストール
brew tap enkatsu/osc_broadcaster
brew install osc_broadcaster
ビルド済みファイルをダウンロード
こちらからダウンロードできます。
ソースコードをビルドしてインストール
cargo install
使い方
使い方はこんな感じです。
USAGE:
osc_broadcaster [OPTIONS]
OPTIONS:
-h, --help Print help information
-i, --listen-ip-address <LISTEN_IP_ADDRESS> [default: 0.0.0.0]
-l, --listen-port <LISTEN_PORT> [default: 32000]
-s, --send-port <SEND_PORT> [default: 12000]
-V, --version Print version information
接続
サーバにOSCアドレス /server/connect
でメッセージを送信すると、
サーバが保持している接続済みクライアントリストに登録されます。
(osc_broadcaster) <-{ port: 32000, OSC: /server/connect }- (client)
OSCメッセージ配信
接続後にOSCメッセージを送信すると、 自身を含む接続済みクライアントにOSCメッセージが配信されます。
# Send from client
(osc_broadcaster) <-{ port: 32000, OSC: /your/osc/addr "hello" }- (client)
# Send to client
(osc_broadcaster) -{ port: 12000, OSC: /your/osc/addr "hello" }-> (client)
切断
サーバにOSCアドレス /server/disconnect
でメッセージを送信すると、
サーバが保持している接続済みクライアントリストから削除されます。
(osc_broadcaster) <-{ port: 32000, OSC: /server/disconnect }- (client)
作った経緯
一台のマシンからOSCを送信して、 複数台のマシンを一括制御する相談を受けたので、 「そういえばProcessingにOSCをブロードキャストするツールがあったな」と思い、 ちゃんと調査してみました。
この二つがoscP5のブロードキャストのサンプルです。
実は以前に会社の勉強会用に PHPでOSCライブラリを実装する という苦行を経験していたので、今回は新しくOSCに関する調査はあまり必要ではありませんでした。
ブロードキャストの仕組み
ブロードキャストの仕組みは成果物の項目で説明した通りです。
接続用OSCメッセージ(/server/connect
)を受信した際に、
UDPパケットから送信元のIPアドレスを取得して、配信先アドレスに登録していきます。
切断用OSCメッセージ(/server/disconnect
)を受信すると、
UDPパケットから送信元のIPアドレスを取得して、配信先アドレスから削除します。
接続用OSCメッセージ か 切断用OSCメッセージ 意外のOSCメッセージを受け取ると、 配信先アドレスに記録してあるクライアント全体受け取ったOSCメッセージを送信します。
TODO
図を入れて説明
実装
最初はPythonで実装しようと思いました。 ですが、配布後に手軽に実行できることを考えて、C/C++やJavaあたりを使おうと考えました。 結果、Rustにいい感じのOSCライブラリがあったのを思い出したので、 今回は勉強も兼ねてRustで実装することにしました。
OSCライブラリはrosc、 実行時のオプション解析はclapが サポートも続いていそうだったので採用しました。
今後の展望
- 配信グループ機能の実装
/server/connect ${GROUP_ID}
とかで特定のグループに接続できる/server/groups
でグループ一覧を返してくれる
- TCPを使ったOSCにも対応