🗐 電装工芸日記 - 舞台照明機器の製作とか -

能登半島地震で被災された方々にお見舞い申し上げます。

or 管理画面へ

No.131

Icon of admin
 Art-Netの受信データをデコードする処理を書いてみました。
 製作環境はRspberryPi4、Rasbian_buster、Python 3.7.3です。
------

import numpy as np

class coding:
 def decode(self, artnet_packet):
  """ Art-Netのbyte列を要素に分解する """
  id = artnet_packet[0:8]
  opcode = int.from_bytes(artnet_packet[8:10], 'little')
  prover = int.from_bytes(artnet_packet[10:12], 'big')
  sequence = int.from_bytes(artnet_packet[12:13], 'little')
  physical = int.from_bytes(artnet_packet[13:14], 'little')
  subuni = int.from_bytes(artnet_packet[14:15], 'little')
  sub = subuni // 16
  uni = subuni % 16
  net = int.from_bytes(artnet_packet[15:16], 'little')
  length = int.from_bytes(artnet_packet[16:18], 'big')
  data = np.frombuffer(artnet_packet, dtype=np.uint8, count=length, offset=18)
  return (id, opcode, prover, sequence, physical, net, sub, uni, length, data)

if __name__ == '__main__':
 an = coding()
 id, opcode, prover, sequence, physical, net, sub, uni, length, data_uint8 = an.decode(test_artnet_packet)

※ 行頭の空白には全角を使っています。
------
 test_artnet_packetに受信データを入れ、codingのインスタンスanでdecodeを呼び出します。
 書いてみたら案外スッキリした物になったので記念に掲載しました。

 socketで受信するのはバイナリデータ(Pythonで言うところのバイト列)ですが、これを一発でnumpy.arrayに変換してくれるnumpy.frombufferは便利です。
 int.from_bytesもバイト列をエンディアン指定でint数に一発変換してくれて便利です。
 私はPICマイコンと協調させて使うことが多いので、こういった機能があると助かります。

 上記ですとdataの戻り値がnumpy.uint8ですが、計算するためにはnumpy.uint16の方が良いと思います。
 data_uint16 = data.astype(np.uint16)
 とかで型変換するといいかもしれません。

#Python #[Art-Net]

■当面の課題

花粉症シーズンも一段落したようで重傷者にも笑顔が戻ってきました。私は原始人なので花粉が酷い日でも鼻の中が埃っぽいなぁくらいにしか感じませんけど。
気温の変化が激しいようですので、みなさま健康管理には注意してください。

編集

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2022年2月
12345
6789101112
13141516171819
20212223242526
2728

■カテゴリ:

■最近の投稿:

最終更新日時:
2024年5月10日(金) 06時55分20秒