sACNについて調べてみよう!
こんにちは、めのんです!
前回、この週末はOpenSiv3DでLチカをやるということを書きました。
で、せっかくなのでsACNを使おうということになったのですが、本物のLED器具を用意すると結構なお金がかかりますし、場所も取るので大変です。 そこで、OpenSiv3DでLED器具をエミュレーションすることにしました。
実物が動くわけではないのでちょっと説得力には書けますが、技術的にはそんなに変わらないと思うので、私の週末のお遊びとしては十分です。
sACNを使うためにはそのプロトコルを調べないといけません。 探せばもしかしたらフリーのライブラリがあるのかもしれません。 でも、プログラミングを楽しむためにやっているんですから、ここはぜひ自分で実装することにしたいと思います。
sACNの規格はANSI E1.31のようです。 最新版は2018年版ですが、ひとつ前の2016年版が無償公開されているのでそれを使うことにしましょう。 リンクを貼っておきますね。
https://tsp.esta.org/tsp/documents/docs/E1-31-2016.pdf
ざっと目を通したところ、DMXのデータを送るだけなら大したことはなさそうです。
かいつまんで説明すると、Data Packetに必要な情報を詰め込んで、UDPのマルチキャストで送信すればOKのようです。 IPアドレスは、
239.255.<Universeの上位>.<Universeの下位>
でOKなようです。
sACNというかDMXでは、正式名称がDMX512-Aというように、512までのデータしか扱えません。 それ以上のデータを扱いたいときは、512バイトずつデータを区切って扱います。 ごく大雑把に言えば、その区切りごとに番号を振ったのが16ビットのUniverseです。 sACNでは1~63999の範囲をUniverseとして扱えるようです。
Data Packetは3つのレイヤーで構成されているのですが、これは単純に構造体で作ってしまえばよさそうです。 単純な構造体なので、CでもC++でも使えるようにしておくと利用範囲が広がりそうです。 パケットに詰め込む値の中には16ビットのものもあるので、ネットワークバイトオーダーに変換するのを忘れないようにしないといけません。
そんな感じで構造体を定義し始めてすぐに気づきました。
赤い丸を付けたところなんですけど、Vectorは4バイトのフィールドなのに開始オフセットが18になっています。 これだと普通に構造体を書いたのではアラインメントがおかしくなってしまいます。
#pragma packを使うといった方法もあるんでしょうけど、私はそういうの嫌いなんですよね。 しかたがないので、全フィールドの型はunsigned char型にして、16ビット以上あれば配列にすることしました。
できれば今夜の投稿までには簡単な送受信ができるところまで持っていきたいんですけど、ほかにもやることがあるので間に合うかどうか微妙です。 ちなみに仕事ならそれにこれに専念できますから余裕ですよ。
そんな感じで、今回はここまでにします。
それでは!!