2022年2月15日の投稿[1件]
本業もボチボチ忙しくなってガラクタ週間も終わりを迎えようとしています。
現場と打ち合わせの合間に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]