OSC通信を始める前に

UDP通信が開通したので、OSCを使ってメッセージのやり取りをしたいと思います。💪

UDP通信とOSC通信って何が違うの?って話もよく出て来るのですが。UDP通信っていうのは通信規格みたいなもので、OSC通信っていうのは通信で使うメッセージです。つまりUDP通信を使ってOSCメッセージを伝達します。

例えば↓ではUDPで『1』『0』でLEDをコントロールしましたが、これだけだとLEDが複数あった場合、どのLEDなのが分からないので"/LED1 1" "/LED1 0"とすれば点灯するLEDを指定することができますよね。


OSC通信のライブラーってかなり沢山ありますね。どれが良いかなかなか分からないのですが、今回はデータ通信の基本はUDP通信でやり取りして、UDPで送受信したバイナリーデータをOSCライブラリーでエンコード、デコードすることによって情報のやり取りができるライブラリーを選びました。

OSCメッセージは"/LED1 1"として扱いますが、UDP通信をする場合はもう少し複雑なバイナリーデータになります。

OSCの詳しいデータフォーマットは下記を参考にしてください。

今日はpythonでOSCの通信フォーマットの確認をしてみたいと思います。

まずはpythonにライブラリーをインストールします。

$ pip3 install python-osc

テストプログラムです。メッセージは”/LED 1  2"としてみました。

メッセージを作った後はそのデータをエンコードしてみます。

from pythonosc import osc_message_builder
from pythonosc import osc_message
builder = osc_message_builder.OscMessageBuilder(address="/LED1")
builder.add_arg(1)
builder.add_arg(2)
msg = builder.build()
print(msg._dgram)
print(type(msg._dgram))
#
osc_msg = osc_message.OscMessage(msg._dgram)
print(osc_msg.address)
print(osc_msg.params)

実行結果です。

$ python3 osc_test.py
b'/LED1\x00\x00\x00,ii\x00\x00\x00\x00\x01\x00\x00\x00\x02'
<class 'bytes'>
/LED1
[1, 2]

”/LED1  1  2”はバイナリーで下記のようにデコードされています。

b'/LED1\x00\x00\x00,ii\x00\x00\x00\x00\x01\x00\x00\x00\x02'


そのデータを下記でエンコードしてアドレスとデータを取り出してみました。

osc_msg = osc_message.OscMessage(msg._dgram)
print(osc_msg.address)
print(osc_msg.params)
/LED1
[1, 2]

OSCメッセージは音響機器の制御用に設計されたらしくで、かなり複雑なメッセージもやりとできるようで、調べると使いこなすの大変だなぁ〜って思ってしまうけど、マイコンの通信であればそこまで複雑にはならないと思います。

OSCを使わなくても、自分でメッセージ(コマンド)設計をすれば良いのですが、エンコード、デコードのライブラリーがあるので、使えばちょっと楽できるかな程度ですね。😙

次回は、これをESP32にに組み込んでみますね。

では🤚


この記事が気に入ったらサポートをしてみませんか?