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にに組み込んでみますね。
では🤚
この記事が気に入ったらサポートをしてみませんか?