2022年2月 この範囲を時系列順で読む この範囲をファイルに出力する
ぼちぼち本業が復活しつつある今日この頃。
ガラクタイジリばかり続けていても実入りはありませんのでありがたいことです。
ガラクタイジリは本業の合間に続けていきますが、時間が少ないので課題を整理してとりかからないといけません。
当面の課題はArt-Netパッチマシンと客席テーブルです。
Art-Netパッチマシンは受信モニタを仕上げ、パッチ機能をハメ込める作りにしていきます。
客席テーブルは、昨週の現場で部下が使ったのでその感想を聞き、ポリエステル樹脂を塗布した天板の具合いを見て方針を決めます。ポリエステル樹脂でもダメなら天板をどうするか更に考えないといけません。あとは軽量化です。現時点でも実用レベルの重さですが、あと5kgのダイエットを目指します。
#ガチ工作
ガラクタイジリばかり続けていても実入りはありませんのでありがたいことです。
ガラクタイジリは本業の合間に続けていきますが、時間が少ないので課題を整理してとりかからないといけません。
当面の課題はArt-Netパッチマシンと客席テーブルです。
Art-Netパッチマシンは受信モニタを仕上げ、パッチ機能をハメ込める作りにしていきます。
客席テーブルは、昨週の現場で部下が使ったのでその感想を聞き、ポリエステル樹脂を塗布した天板の具合いを見て方針を決めます。ポリエステル樹脂でもダメなら天板をどうするか更に考えないといけません。あとは軽量化です。現時点でも実用レベルの重さですが、あと5kgのダイエットを目指します。
#ガチ工作
このところ何回か出ている「VT-100」について少し解説。
私も使ったことはありませんが、今のパソコンやスマホに至る画期的な発明だと思います。
まだパソコンという言葉すらなかった時代、コンピュータという言葉だけでそれらが総称されていた時代、大型汎用機(メインフレーム)をより使いやすくするための端末として開発された物です。
見た目にはMS-DOS隆盛時代のパソコンみたいな姿をしていますが、大雑把に言うなら「リモコン」です。単体ではキー入力を画面に表示するくらいしか出来ません。処理を行うメインフレームに指示を送り、その戻りを表示するだけです。今どきの感覚のOSも搭載されておらず、データを保存する機能もありません。
ですが、このVT-100を発端にパソコンやインターネットが生まれたと言っても過言ではないのです。
たぶんですが、VT-100だけで完結させて何か出来たら面白くね?と思った人がいて、本当にそうしてしまったのがパソコンの実質的な発祥ではないかと。インターネットも、離れたメインフレームを繋げたアーパネットが発祥と言われていますが、実際には遠くに置いたVT-100をもっと簡単にメインフレームに繋げたいというニーズに対し「楽するために努力した結果」なのではないかと。
これらは私の勝手な想像でありますが、VT-100が無かったら今が少し違っていたのは間違いないと思います。
ANSIエスケープシーケンスや正規表現などのエスケープコードと呼ばれる制御体系はメインフレームやVT-100で用いられていたもので、その名残が未だに使われているのです。
知らなくてもプログラムは書けますが、知っていた方が便利なことも少なくありません。
#妄想
私も使ったことはありませんが、今のパソコンやスマホに至る画期的な発明だと思います。
まだパソコンという言葉すらなかった時代、コンピュータという言葉だけでそれらが総称されていた時代、大型汎用機(メインフレーム)をより使いやすくするための端末として開発された物です。
見た目にはMS-DOS隆盛時代のパソコンみたいな姿をしていますが、大雑把に言うなら「リモコン」です。単体ではキー入力を画面に表示するくらいしか出来ません。処理を行うメインフレームに指示を送り、その戻りを表示するだけです。今どきの感覚のOSも搭載されておらず、データを保存する機能もありません。
ですが、このVT-100を発端にパソコンやインターネットが生まれたと言っても過言ではないのです。
たぶんですが、VT-100だけで完結させて何か出来たら面白くね?と思った人がいて、本当にそうしてしまったのがパソコンの実質的な発祥ではないかと。インターネットも、離れたメインフレームを繋げたアーパネットが発祥と言われていますが、実際には遠くに置いたVT-100をもっと簡単にメインフレームに繋げたいというニーズに対し「楽するために努力した結果」なのではないかと。
これらは私の勝手な想像でありますが、VT-100が無かったら今が少し違っていたのは間違いないと思います。
ANSIエスケープシーケンスや正規表現などのエスケープコードと呼ばれる制御体系はメインフレームやVT-100で用いられていたもので、その名残が未だに使われているのです。
知らなくてもプログラムは書けますが、知っていた方が便利なことも少なくありません。
#妄想
開発作業用のノートパソコンはWindows11ですが、慣れると使いやすいですね。
そう思う操作感の大半がMacOSやLinux系のパクリに見えますが、古いアプリも設定さえすれば安定して動くので便利に使えてます。
誰かが作ったコンテンツやサービスを消費するだけならiOSやAndroidが良いと思いますし、日常使いの文具としてやネット上のシステムを踏み台に発信するならMacOSが便利だと思いますが、舞台照明系のシステム構築やガチなモノづくりをするならWindowsの方が環境を整えやすいと思われます。使いたいのはOSではなくアプリやネット上のサービスですから、趣向や目的に合わせて選べばいいのです。
数十年前にMP-80というワンボードマイコンにハンドアセンブルを16進数で打ち込むことから始まった私にとってはどれも便利過ぎるのでどれでもいいのですけど。
#日常
そう思う操作感の大半がMacOSやLinux系のパクリに見えますが、古いアプリも設定さえすれば安定して動くので便利に使えてます。
誰かが作ったコンテンツやサービスを消費するだけならiOSやAndroidが良いと思いますし、日常使いの文具としてやネット上のシステムを踏み台に発信するならMacOSが便利だと思いますが、舞台照明系のシステム構築やガチなモノづくりをするならWindowsの方が環境を整えやすいと思われます。使いたいのはOSではなくアプリやネット上のサービスですから、趣向や目的に合わせて選べばいいのです。
数十年前にMP-80というワンボードマイコンにハンドアセンブルを16進数で打ち込むことから始まった私にとってはどれも便利過ぎるのでどれでもいいのですけど。
#日常
画面とArt-Netの送受信を結合させられる段階になりました。Art-Netをスルー出力し特定のユニバースをモニタします。
簡易ながら実験段階で出来ていることですから、画面を整えたからってなんだよって構成ですが、パッチマシンの一部を先行して作っているので重要な過程です。表示することが目的ではなく、最低限持たなければならない機能を出来るだけ見やすく使いやすく軽く、そして今後の伸びしろを持たせた構成でまとめ上げることが目的です。
#[Art-Net]
簡易ながら実験段階で出来ていることですから、画面を整えたからってなんだよって構成ですが、パッチマシンの一部を先行して作っているので重要な過程です。表示することが目的ではなく、最低限持たなければならない機能を出来るだけ見やすく使いやすく軽く、そして今後の伸びしろを持たせた構成でまとめ上げることが目的です。
#[Art-Net]
今日も大半が待機時間な小屋付き増員です。
Art-Netを送信する物が無いので画面とキー操作の作り込みをしました。
簡単なようで難しいのがキー入力です。
どんな文字でも受け付けるinput()などの文字列入力コマンドを使えば入力自体は簡単ですが、カーソルキーなどを即応させたいし、ホットキーでコマンドを入力したいし、入力の際にエラーにならない様にフィルタをかけたい。
面倒だったのは数値の入力。用いられる数値には範囲がありますから、範囲外の入力がされたならその時点でアラートを出したい。
例えば、数値範囲が0-127だとして、128や1000などの範囲外の数値が入力されたならその時点でアラートを出す。求める数値が整数なら小数点以下の入力は阻止する。数値を得たいのだから数字キー以外の入力は受け付けない。など。
求める操作のリズム感によりますが、数値範囲や小数点の条件などでフィルタする関数を作っておいても無駄にはならないでしょう。
当面の目標であるArt-Netのモニタは整数だけを受け付ければいいのですが、極端な話「.」ピリオドを受け付けなければこれは簡単。小数点以下1桁の範囲指定が一番面倒でした。
これらの処理には「正規表現」と呼ばれる奇怪な文字列を使わなければなりません。「3桁以下の整数文字列='^[1-9][0-9]{,2}$'」とか「小数点以下1桁の2桁以下の実数文字列='^[0-9]{,2}\.{,1}[0-9]{,1}$'」といった書き方をします。なんですかねコレ。
慣れてしまえば、まぁ、ありかなと。ANSIエスケープシーケンス並みに古いVT100時代からの名残りです。
#Python
Art-Netを送信する物が無いので画面とキー操作の作り込みをしました。
簡単なようで難しいのがキー入力です。
どんな文字でも受け付けるinput()などの文字列入力コマンドを使えば入力自体は簡単ですが、カーソルキーなどを即応させたいし、ホットキーでコマンドを入力したいし、入力の際にエラーにならない様にフィルタをかけたい。
面倒だったのは数値の入力。用いられる数値には範囲がありますから、範囲外の入力がされたならその時点でアラートを出したい。
例えば、数値範囲が0-127だとして、128や1000などの範囲外の数値が入力されたならその時点でアラートを出す。求める数値が整数なら小数点以下の入力は阻止する。数値を得たいのだから数字キー以外の入力は受け付けない。など。
求める操作のリズム感によりますが、数値範囲や小数点の条件などでフィルタする関数を作っておいても無駄にはならないでしょう。
当面の目標であるArt-Netのモニタは整数だけを受け付ければいいのですが、極端な話「.」ピリオドを受け付けなければこれは簡単。小数点以下1桁の範囲指定が一番面倒でした。
これらの処理には「正規表現」と呼ばれる奇怪な文字列を使わなければなりません。「3桁以下の整数文字列='^[1-9][0-9]{,2}$'」とか「小数点以下1桁の2桁以下の実数文字列='^[0-9]{,2}\.{,1}[0-9]{,1}$'」といった書き方をします。なんですかねコレ。
慣れてしまえば、まぁ、ありかなと。ANSIエスケープシーケンス並みに古いVT100時代からの名残りです。
#Python
今週末は小屋付きの増員ですが、毎度のことながらそれほどやることはありません。
居眠りも出来ないので、パソコンに向かって仕事をしている風味でArt-Netのソースコードの見直しです。勢いで書いた関数型のC言語っぽいコードをPythonらしい書き方に直しつつ、贅肉を削っております。
Pythonには群のデータを扱う方法がいくつかあります。Art-NetというかDMX512のパッチマシンを作るにはこられを巧く使うことが大事です。
これらには大きく分けて3つあります。list型、taple型、dictionary型です。これらは似ていますが出来ることが違います。また、どれを使っても出来ることでも内容によって処理速度が違ったりします。特徴をよく理解して使わないと損です。
list型は群に対しても個に対しても計算が出来ます。文字列に対する加工も含まれますが、他の型ではそれが出来ません。
taple型は様々な型のデータを一つに束ねて扱えます。関数の戻り値は基本的にこれだと思っていいでしょう。taple型の使い方がわかるとPythonの便利さが実感出来てコーディングの幅も広がるような気がします。
dictionary型はデータ参照用と言ったらいいでしょうか。キーワードに対して様々な型のデータを関連付けられ、なんといっても抽出が速い。キーワードが規則性のある数値の場合は他の2つもあまり変わらないかもしれませんが、キーワードが規則性を持たない場合はdictionary型が圧倒的に速く便利だと思います。
具体的な違いや用法はその筋の教科書や先達の書き込みに任せますが、PythonがPythonであるところはここなのかもしれません。
RaspberryPiが見た目以上に優秀なハードウェアなのもありますが、Pythonで制御系を書いても遅いとは感じません。
もちろん、C言語とかで書いてコンパイルした方が速いのは間違いありませんが、書いてすぐに実行できるPythonは生産性が高いと思います。
少し遠回りかもしれませんが、C++に書き直すことを前提にPythonで書き、動いたらC++に移植するってのが制御系を作るのにいいかもしれないなぁ~なんて思ったりしてます。コーディングの規則が違うだけで書く内容は凄く似てますので、PythonでスケッチしてC++で清書するのです。勢いで書いたPythonをPythonらしく書き直すなら同じことかなと。
#Python
居眠りも出来ないので、パソコンに向かって仕事をしている風味でArt-Netのソースコードの見直しです。勢いで書いた関数型のC言語っぽいコードをPythonらしい書き方に直しつつ、贅肉を削っております。
Pythonには群のデータを扱う方法がいくつかあります。Art-NetというかDMX512のパッチマシンを作るにはこられを巧く使うことが大事です。
これらには大きく分けて3つあります。list型、taple型、dictionary型です。これらは似ていますが出来ることが違います。また、どれを使っても出来ることでも内容によって処理速度が違ったりします。特徴をよく理解して使わないと損です。
list型は群に対しても個に対しても計算が出来ます。文字列に対する加工も含まれますが、他の型ではそれが出来ません。
taple型は様々な型のデータを一つに束ねて扱えます。関数の戻り値は基本的にこれだと思っていいでしょう。taple型の使い方がわかるとPythonの便利さが実感出来てコーディングの幅も広がるような気がします。
dictionary型はデータ参照用と言ったらいいでしょうか。キーワードに対して様々な型のデータを関連付けられ、なんといっても抽出が速い。キーワードが規則性のある数値の場合は他の2つもあまり変わらないかもしれませんが、キーワードが規則性を持たない場合はdictionary型が圧倒的に速く便利だと思います。
具体的な違いや用法はその筋の教科書や先達の書き込みに任せますが、PythonがPythonであるところはここなのかもしれません。
RaspberryPiが見た目以上に優秀なハードウェアなのもありますが、Pythonで制御系を書いても遅いとは感じません。
もちろん、C言語とかで書いてコンパイルした方が速いのは間違いありませんが、書いてすぐに実行できるPythonは生産性が高いと思います。
少し遠回りかもしれませんが、C++に書き直すことを前提にPythonで書き、動いたらC++に移植するってのが制御系を作るのにいいかもしれないなぁ~なんて思ったりしてます。コーディングの規則が違うだけで書く内容は凄く似てますので、PythonでスケッチしてC++で清書するのです。勢いで書いたPythonをPythonらしく書き直すなら同じことかなと。
#Python
昨晩、思い立って調べてみたのですが、Pythonで並列処理をする方法には大きく分けて2つあると理解する。ThreadingとMultiprocessingです。
今までに何度も読んでいたサイトばかりですが、何故だか内容が突然理解できるようになりました。たぶん今まではPythonをスクリプト言語だと思っていたからでしょう。Pythonという皮の裏にC言語がある思えばスムーズに理解が進みました。
似たような別ライブラリもありますが、意味合いとしてはこの二つに集約されていると思っていいでしょう。
大雑把に言うなら、Threadingは比較的楽に使えるがCPUスレッドは1つしか使えない。Multiprocessingは複数のCPUスレッドを使えるがプロセスが起動するのに時間がかかり記述も少し難しい。
難しいといっても、プロセス間通信の制約とタイミングくらいなもので、関数自体はThreadingとMultiprocessingはとても似ているので片方を覚えればどちらも使えそう。関数間で通信するQueueは使うライブラリが違うので注意ですが、これも関数が酷似しているのでストレス少ないかも。
Python3.8からは共有メモリというC言語のポインタに近いことが可能になっているので、RaspberryPiのPythonも3.8になることを心待ちにしております。変数の型やデータ長を厳密に管理しなければなりませんが、それさえやっておけばいいので問題無し。デバイスとやり取りする処理では普通にやっていることだし。
#Python
今までに何度も読んでいたサイトばかりですが、何故だか内容が突然理解できるようになりました。たぶん今まではPythonをスクリプト言語だと思っていたからでしょう。Pythonという皮の裏にC言語がある思えばスムーズに理解が進みました。
似たような別ライブラリもありますが、意味合いとしてはこの二つに集約されていると思っていいでしょう。
大雑把に言うなら、Threadingは比較的楽に使えるがCPUスレッドは1つしか使えない。Multiprocessingは複数のCPUスレッドを使えるがプロセスが起動するのに時間がかかり記述も少し難しい。
難しいといっても、プロセス間通信の制約とタイミングくらいなもので、関数自体はThreadingとMultiprocessingはとても似ているので片方を覚えればどちらも使えそう。関数間で通信するQueueは使うライブラリが違うので注意ですが、これも関数が酷似しているのでストレス少ないかも。
Python3.8からは共有メモリというC言語のポインタに近いことが可能になっているので、RaspberryPiのPythonも3.8になることを心待ちにしております。変数の型やデータ長を厳密に管理しなければなりませんが、それさえやっておけばいいので問題無し。デバイスとやり取りする処理では普通にやっていることだし。
#Python
ガラクタ週間が終わり、終日本業のデスクワークでした。
会場図面書いて、照明プランの概要まとめ、見積りというデスクワークの王道メニューです。
嫌いじゃないのですが、ガラクタネタが中途なのでソワソワします。
今やっているArt-Netは卓とデコーダが必要な作業なので、荷物も多いし広いスペースも必要です。しばらくはお休みかな。
明日から現場が続きますが、RaspberryPiだけ持って行って現在のソースをオブジェクト指向っぽく書く練習をしようかなぁ。
そうそう、製作というレベルではありませんが、ピンスポット用の照準器を増産しました。その実態は小型カメラ用の自在雲台を介して短いピカティニーレールをピンに取り付けるクランプです。
細かい部品を買い増しして組み立てるだけなので15分くらいの作業でしたが、なぜ思い立って作ったかと言えば数日後の現場で数年ぶりにピンを振ることになったからです。
鈍った腕でも対応出来そうな演目ですが、お年頃からくる目のコンディションでバインド照準器が使えませんので、ダットサイトなどの目印が遠くに見える照準器に頼らないとダメだと思われます。
このクランプは5-6年前に作った代物です。以前作った物は部下にあげてしまったので、余っていた部品で改めて自分用をこさえたワケです。
#RaspberryPi #Python
会場図面書いて、照明プランの概要まとめ、見積りというデスクワークの王道メニューです。
嫌いじゃないのですが、ガラクタネタが中途なのでソワソワします。
今やっているArt-Netは卓とデコーダが必要な作業なので、荷物も多いし広いスペースも必要です。しばらくはお休みかな。
明日から現場が続きますが、RaspberryPiだけ持って行って現在のソースをオブジェクト指向っぽく書く練習をしようかなぁ。
そうそう、製作というレベルではありませんが、ピンスポット用の照準器を増産しました。その実態は小型カメラ用の自在雲台を介して短いピカティニーレールをピンに取り付けるクランプです。
細かい部品を買い増しして組み立てるだけなので15分くらいの作業でしたが、なぜ思い立って作ったかと言えば数日後の現場で数年ぶりにピンを振ることになったからです。
鈍った腕でも対応出来そうな演目ですが、お年頃からくる目のコンディションでバインド照準器が使えませんので、ダットサイトなどの目印が遠くに見える照準器に頼らないとダメだと思われます。
このクランプは5-6年前に作った代物です。以前作った物は部下にあげてしまったので、余っていた部品で改めて自分用をこさえたワケです。
#RaspberryPi #Python
空き時間が少なかったのですが、Art-Netのエンコードを試してみました。
受信したバイナリをデコードし、パラメータをそのままにエンコードして送信です。単純な動作ですが、これが出来なきゃパッチマシンなど絶対無理というテストです。
卓からの8ユニバースをすべて処理したのですが、負荷の増加は2.5%くらいでした。十分に許容範囲で収まったのは良いことです。
パッチマシンは8in8outくらいを想定していますが、16in16outも可能だったりして。16ユニバース出る卓が無いので試せないし作ってもオーバースペックなので私は不要かな。機能全体を組み込んでから悩むことですが・・・。
今のところ1日1課題。
あとどれくらいの課題があるのかわかりませんが、納期はありませんのでノンビリいきましょう。ここまで出来れば、丁寧にclassライブラリにまとめ上げ、コメントに使い方を明記して後々も使える様にしておきましょう。
そういう意味ではキー操作やモニタ表示もclassライブラリにして汎用性を高めるのがいいですね。
と言いますか、このまま書き増しを続けるとソースコードがグチャグチャになって後で後悔しそうです。
私のメインはPICのアセンブラなのでANSI-Cの関数タイプっぽい書き方をしがちですが、Pythonならオブジェクト指向な書き方をしたいものです。最近、クラス、インスタンス、継承を使う意味と感覚がわかってきましたので、出来るだけそういった書き方をしていこうと思います。
以前は「継承」ってのが感覚的にわからんかったのですが、関数を束ねて新しい関数を作るだけだと簡単に考えればいいみたいです。ただ、関数は実体なのであっちこっちの関数から同じ関数を同時に呼ぶと衝突が起こります。解決には親関数の中で使う関数を親関数にとって専用にすればいいのですが、同じ様な関数を使うだけ書くのは面倒だしやらたとソースが大きくなるので、ひな形であるクラスから実体のインスタンスを作るという発想になったのだと最近ようやく「感覚的に」理解出来ました。
その筋の解説書を読むと「継承はオブジェクト指向という高貴な峰の頂」みたいな奇妙に美化した記述が多いのですが、その実態は「楽して俺様関数書きてぇ〜」って俗っぽい発想でした。美化した手段を書くだけで目的を書かない解説書が多いので感覚的にわからんかったのです。
#Python #[Art-Net]
受信したバイナリをデコードし、パラメータをそのままにエンコードして送信です。単純な動作ですが、これが出来なきゃパッチマシンなど絶対無理というテストです。
卓からの8ユニバースをすべて処理したのですが、負荷の増加は2.5%くらいでした。十分に許容範囲で収まったのは良いことです。
パッチマシンは8in8outくらいを想定していますが、16in16outも可能だったりして。16ユニバース出る卓が無いので試せないし作ってもオーバースペックなので私は不要かな。機能全体を組み込んでから悩むことですが・・・。
今のところ1日1課題。
あとどれくらいの課題があるのかわかりませんが、納期はありませんのでノンビリいきましょう。ここまで出来れば、丁寧にclassライブラリにまとめ上げ、コメントに使い方を明記して後々も使える様にしておきましょう。
そういう意味ではキー操作やモニタ表示もclassライブラリにして汎用性を高めるのがいいですね。
と言いますか、このまま書き増しを続けるとソースコードがグチャグチャになって後で後悔しそうです。
私のメインはPICのアセンブラなのでANSI-Cの関数タイプっぽい書き方をしがちですが、Pythonならオブジェクト指向な書き方をしたいものです。最近、クラス、インスタンス、継承を使う意味と感覚がわかってきましたので、出来るだけそういった書き方をしていこうと思います。
以前は「継承」ってのが感覚的にわからんかったのですが、関数を束ねて新しい関数を作るだけだと簡単に考えればいいみたいです。ただ、関数は実体なのであっちこっちの関数から同じ関数を同時に呼ぶと衝突が起こります。解決には親関数の中で使う関数を親関数にとって専用にすればいいのですが、同じ様な関数を使うだけ書くのは面倒だしやらたとソースが大きくなるので、ひな形であるクラスから実体のインスタンスを作るという発想になったのだと最近ようやく「感覚的に」理解出来ました。
その筋の解説書を読むと「継承はオブジェクト指向という高貴な峰の頂」みたいな奇妙に美化した記述が多いのですが、その実態は「楽して俺様関数書きてぇ〜」って俗っぽい発想でした。美化した手段を書くだけで目的を書かない解説書が多いので感覚的にわからんかったのです。
#Python #[Art-Net]
本業もボチボチ忙しくなってガラクタ週間も終わりを迎えようとしています。
現場と打ち合わせの合間にArt-Netです。
受信したバイナリをそのままの送信出来ないようでは先には進めませんが送信できない問題。
解決はしましたが、正規マニュアルや先達の書き込みに「これはちがう」とある設定で動いてしまいました。
基本環境:RaspberryPi4 Rasbian_buster Python3.7.3
ネットワークインターフェース:内臓LANポート(eth0)、USB-LANアダプタ(eth1)
IPアドレス:eth0もeth1もArt-Net用に設定済み。
試験環境:MAdot2でArt-Netを送出、RaspberryPiを経由、中華電機のArt-Netデコーダで受信、レガシーDMXをDoctorMXでモニタ。
処理内容:eth0で受信したArt-Netのバイナリをeth1で送信するだけ(これが出来なきゃ始まらない)。
-----
import socket
def artnet_rx_tx():
""" 基本パラメータセット """
RECV_HOST_NAME = ''
SENDTO_HOST_NAME = '255.255.255.255'
PORT = 6454
""" socket受信の設定 """
artnet_rx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDPによるソケットを宣言(受信で使う)
artnet_rx_sock.setsockopt(socket.SOL_SOCKET, 25, str("eth0" + '\0').encode('utf-8')) #ソケットとNICを関連付け
artnet_rx_sock.bind((RECV_HOST_NAME, PORT)) #送信元とポートをソケットに関連付け この場合はどこからの送信でも受けるって意味になる
""" socket送信の設定 """
artnet_tx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDPによるソケットを宣言(送信で使う)
artnet_tx_sock.setsockopt(socket.SOL_SOCKET, 25, str("eth1" + '\0').encode('utf-8')) #ソケットとNICを関連付け
artnet_tx_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #ソケットをブロードキャストとして使う宣言
""" 中継 """
for i in range(800): #繰り返し
artnet_rx_bytes, addr = artnet_rx_sock.recvfrom(1024) #受信処理
if len(artnet_rx_bytes) > 18: #受信データ長が最低長以上かを確認 下行とandで一文にしても意味は同じですがヘッダー長を下回った時にエラーになる
if artnet_rx_bytes[0:12] == b'Art-Net\x00\x00\x50\x00\x0e': #DMXの値データだけを選別 ヘッダーチェック
artnet_tx_sock.sendto(artnet_rx_bytes, (SENDTO_HOST_NAME, PORT)) #送信処理 ここがわからんで時間を喰う
""" 終了操作 """
artnet_rx_sock.close() #ソケットの仕舞い
artnet_tx_sock.close() #ソケットの仕舞い
※ 行頭の空白と#は全角で書いていますので、このままコピペするとエラーになります。
-----
for文による繰り返しで800回中継を行うテストソースです。
ポイントはBroadcastの送信先を指示する「SENDTO_HOST_NAME」です。socket.sendtoのパラメータです。「RECV_HOST_NAME」と同様に空白データを割り付けるベシとされるのが一般的ですが動きません。Broadcastアドレスを示す古い方法の'255.255.255.255'にしたところ稼働したという話です。
'2.255.255.255'や'10.255.255.255'でも稼働しましたが、'255.255.255.255'はゾーンの末尾アドレスを示すマジックナンバーらしく汎用性が高いと思われます。
動けばいいのですが、かなりの時間を喰ってしまい課題の残りが明日以降になりました。
ここまで出来ればパッチマップによる入れ替え処理を作ります。
壮大な繰り返し処理となりますので、どれだけ簡素に出来るかがカギになります。
#Python #[Art-Net]
現場と打ち合わせの合間にArt-Netです。
受信したバイナリをそのままの送信出来ないようでは先には進めませんが送信できない問題。
解決はしましたが、正規マニュアルや先達の書き込みに「これはちがう」とある設定で動いてしまいました。
基本環境:RaspberryPi4 Rasbian_buster Python3.7.3
ネットワークインターフェース:内臓LANポート(eth0)、USB-LANアダプタ(eth1)
IPアドレス:eth0もeth1もArt-Net用に設定済み。
試験環境:MAdot2でArt-Netを送出、RaspberryPiを経由、中華電機のArt-Netデコーダで受信、レガシーDMXをDoctorMXでモニタ。
処理内容:eth0で受信したArt-Netのバイナリをeth1で送信するだけ(これが出来なきゃ始まらない)。
-----
import socket
def artnet_rx_tx():
""" 基本パラメータセット """
RECV_HOST_NAME = ''
SENDTO_HOST_NAME = '255.255.255.255'
PORT = 6454
""" socket受信の設定 """
artnet_rx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDPによるソケットを宣言(受信で使う)
artnet_rx_sock.setsockopt(socket.SOL_SOCKET, 25, str("eth0" + '\0').encode('utf-8')) #ソケットとNICを関連付け
artnet_rx_sock.bind((RECV_HOST_NAME, PORT)) #送信元とポートをソケットに関連付け この場合はどこからの送信でも受けるって意味になる
""" socket送信の設定 """
artnet_tx_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDPによるソケットを宣言(送信で使う)
artnet_tx_sock.setsockopt(socket.SOL_SOCKET, 25, str("eth1" + '\0').encode('utf-8')) #ソケットとNICを関連付け
artnet_tx_sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #ソケットをブロードキャストとして使う宣言
""" 中継 """
for i in range(800): #繰り返し
artnet_rx_bytes, addr = artnet_rx_sock.recvfrom(1024) #受信処理
if len(artnet_rx_bytes) > 18: #受信データ長が最低長以上かを確認 下行とandで一文にしても意味は同じですがヘッダー長を下回った時にエラーになる
if artnet_rx_bytes[0:12] == b'Art-Net\x00\x00\x50\x00\x0e': #DMXの値データだけを選別 ヘッダーチェック
artnet_tx_sock.sendto(artnet_rx_bytes, (SENDTO_HOST_NAME, PORT)) #送信処理 ここがわからんで時間を喰う
""" 終了操作 """
artnet_rx_sock.close() #ソケットの仕舞い
artnet_tx_sock.close() #ソケットの仕舞い
※ 行頭の空白と#は全角で書いていますので、このままコピペするとエラーになります。
-----
for文による繰り返しで800回中継を行うテストソースです。
ポイントはBroadcastの送信先を指示する「SENDTO_HOST_NAME」です。socket.sendtoのパラメータです。「RECV_HOST_NAME」と同様に空白データを割り付けるベシとされるのが一般的ですが動きません。Broadcastアドレスを示す古い方法の'255.255.255.255'にしたところ稼働したという話です。
'2.255.255.255'や'10.255.255.255'でも稼働しましたが、'255.255.255.255'はゾーンの末尾アドレスを示すマジックナンバーらしく汎用性が高いと思われます。
動けばいいのですが、かなりの時間を喰ってしまい課題の残りが明日以降になりました。
ここまで出来ればパッチマップによる入れ替え処理を作ります。
壮大な繰り返し処理となりますので、どれだけ簡素に出来るかがカギになります。
#Python #[Art-Net]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131