Haukcode.ArtNet 5.0.150

dotnet add package Haukcode.ArtNet --version 5.0.150
                    
NuGet\Install-Package Haukcode.ArtNet -Version 5.0.150
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Haukcode.ArtNet" Version="5.0.150" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Haukcode.ArtNet" Version="5.0.150" />
                    
Directory.Packages.props
<PackageReference Include="Haukcode.ArtNet" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Haukcode.ArtNet --version 5.0.150
                    
#r "nuget: Haukcode.ArtNet, 5.0.150"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Haukcode.ArtNet@5.0.150
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Haukcode.ArtNet&version=5.0.150
                    
Install as a Cake Addin
#tool nuget:?package=Haukcode.ArtNet&version=5.0.150
                    
Install as a Cake Tool

Haukcode.ArtNet

A high-performance ArtNet library for .NET (8.0+) enabling DMX512 lighting control over IP networks.

What is ArtNet?

Art-Net is a royalty-free protocol for transmitting DMX512 lighting control data over UDP/IP networks. It's widely used in professional entertainment, architectural, and theatrical lighting.

Features

  • ✅ DMX transmission and reception
  • ✅ Multiple universe support (up to 32,768 universes)
  • ✅ Device discovery (ArtPoll)
  • ✅ Frame synchronization (ArtSync)
  • ✅ RDM support (Remote Device Management) - separate package, with request/response matching
  • ✅ ArtTrigger for show control
  • ✅ High-performance UDP communication
  • ✅ Cross-platform (.NET 8.0+)

Standards

Checked against the published documents: every packet Art-Net 4 (rev 1.4dp) defines a layout for, and every PID in ANSI E1.20-2025 (RDM), E1.37-1, E1.37-2, E1.37-7 and the RDM PIDs of E1.33. See the compliance table for details.

Quick Start

Installation

dotnet add package Haukcode.ArtNet

For RDM support:

dotnet add package Haukcode.ArtNet.Rdm

Basic Usage

using System.Net;
using Haukcode.ArtNet;

var localIp = IPAddress.Parse("192.168.1.100");
var subnetMask = IPAddress.Parse("255.255.255.0");

// Create client
using var client = new ArtNetClient(localIp, subnetMask);

// Send DMX data to a node (Art-Net 4 doesn't allow DMX to be broadcast)
var dmxData = new byte[512];
dmxData[0] = 255;  // Channel 1 at full
await client.SendDmxData(IPAddress.Parse("192.168.1.50"), universeId: 1, dmxData);

Receiving DMX

using System.Threading.Channels;
using Haukcode.ArtNet.Packets;

var channel = Channel.CreateUnbounded<ReceiveDataPacket>();

using var client = new ArtNetClient(
    localIp, subnetMask,
    channelWriter: async (p) => await channel.Writer.WriteAsync(p));

await foreach (var packet in channel.Reader.ReadAllAsync())
{
    if (packet.Packet is ArtNetDmxPacket dmx)
    {
        Console.WriteLine($"Universe {dmx.Universe + 1}: {dmx.DmxData[0]}");
    }
}

Device Discovery

// Send ArtPoll to discover devices
await client.QueuePacketForSending(null, new ArtPollPacket());

Frame Synchronization

// Send data to multiple universes
var node = IPAddress.Parse("192.168.1.50");
await client.SendDmxData(node, 1, dmxData1);
await client.SendDmxData(node, 2, dmxData2);

// Sync all outputs (always broadcast)
await client.SendSync();

Key Methods

// Send DMX data (address must be a node unless AllowDmxBroadcast is set)
Task SendDmxData(IPAddress? address, ushort universeId,
                 ReadOnlyMemory<byte> dmxData, bool important = false)

// Send sync packet (broadcast)
Task SendSync()

// Send any packet
Task QueuePacketForSending(IPAddress? destination,
                          ArtNetPacket packet, bool important = false)

Supported Packets

  • ArtPoll / ArtPollReply - Device discovery
  • ArtDmx, ArtNzs / ArtVlc - DMX data
  • ArtSync - Frame synchronization
  • ArtTrigger, ArtTimeCode, ArtCommand - Show control
  • ArtAddress, ArtInput, ArtIpProg - Node configuration
  • ArtDataRequest / ArtDataReply, ArtDiagData - Product data and diagnostics
  • ArtTodRequest / ArtTodData / ArtTodControl - RDM device discovery
  • ArtRdm / ArtRdmSub - RDM commands (requires RDM package)
  • ArtFirmwareMaster / ArtFirmwareReply - Firmware upload

Platform Support

  • .NET 8.0+, 9.0+, 10.0+
  • Windows, Linux, macOS

Documentation & Examples

📖 Full Documentation: https://github.com/HakanL/Haukcode.ArtNet

🔧 Sample Code: Included in the GitHub repository

Resources

License

MIT License - Copyright (c) 2018-2024 Hakan Lindestaf

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
5.0.150 72 10/21/2026
5.0.149 64 10/21/2026
5.0.148 78 10/20/2026
5.0.147 73 10/20/2026
5.0.146 71 10/20/2026
5.0.145 73 10/20/2026
5.0.144 77 10/20/2026
5.0.143 76 10/20/2026
5.0.140 69 10/20/2026
5.0.139 71 10/20/2026
5.0.138 72 10/20/2026
5.0.137 84 10/20/2026
5.0.136 77 10/20/2026
5.0.135 74 10/20/2026
5.0.134 74 10/20/2026
5.0.133 77 10/20/2026
5.0.132 75 10/20/2026
5.0.131 71 10/20/2026
5.0.130 71 10/20/2026
5.0.129 70 10/20/2026
Loading failed

# Changelog

The package version is major.minor from version.json plus the CI run number, so
every push to main publishes a new patch version. Breaking changes bump the
major version.

## 5.0 (2026-10-20) - breaking

Standards compliance pass against Art-Net 4 and ANSI E1.20-2025.

- Breaking: fields that Art-Net 4 and E1.20 / E1.37-7 define as unsigned are
 now ushort/uint, so values with the top bit set no longer read back negative
 (for example ArtPollReplyPacket.Oem, EstaCode and FirmwareVersion,
 ArtNetDmxPacket.Universe, ArtTriggerPacket.OemCode, RDM parameter IDs,
 sub-devices and sensor values). ArtNetUnknownPacket takes ArtNetOpCodes.
- Wire fixes: Art-Net packet layouts and length validation, RDM packets that
 sent or parsed the wrong parameter data, RDM response type and Port ID read
 from the header, NACK reason length, ArtSync Aux byte order.
- ArtNetClient follows the Art-Net 4 transmit rules and fixes sequence
 wrap-around, the loopback filter and destination handling.
- Added the remaining Art-Net 4 packets, ArtPoll targeted mode and the newer
 ArtPollReply fields.
- RDM: request workflow and direct-line discovery, a DISC_UNIQUE_BRANCH
 encoder/decoder, typed packets for the E1.20-2025 PIDs, E1.20-2025 sensor
 types and units, the E1.37-2 IPv4/DNS PIDs, the remaining E1.33 PIDs and the
 published E1.37-7 and E1.33 gateway PIDs. All RDM packet types are
 registered in RdmPacketFactory.
- RDM robustness: length limits, malformed replies and checksum validation.
- Timecode generator sample: restart and drift fixes.
- The package targets net10.0 and embeds its PDB with SourceLink, so the
 debugger can step into the library source (5.0.149 and later).

## 4.0 (2026-06-02) - breaking

- RDM correctness: SET NACKs are no longer parsed as successful replies, and
 the ProductCategories Control block, SlotIds.ColorSemaphore and
 PowerState.Normal values match E1.20.
- Sensor definition and sensor value replies parse to typed packets.
- Breaking: misspelled identifiers renamed (for example SensoreValue to
 SensorValue, IdentifyModes.Quit to Quiet, Colour* to Color*), and RDM PIDs
 moved to namespaces matching their category.
- Added net10.0.

Later 4.0.x releases:

- Typed ArtTimeCode packet (OpTimeCode 0x9700) and a timecode generator sample.
- Tolerates ArtSync packets without the spare Aux bytes and truncated legacy
 ArtPollReply packets.
- Kernel receive timestamps on Linux (KernelReceiveTimestampsObserved).
- Performance: no per-packet allocations on the send and receive paths,
 sending sharded by universe, zero-copy DMX data on parse.
- SendFromListenSocketAsync.

## 3.0 (2025-04-24) - breaking

- RDM split into its own assembly, Haukcode.ArtNet.Rdm, shipped in this
 package.

Later 3.0.x releases: .NET 10 support, a send-immediately method, and a check
for DMX4ALL custom packets.

## 2.0 (2024-12-12) - breaking

- Rewritten on the Haukcode.HighPerfComm library.
- Later 2.0.x releases: .NET 8 support, binding fix, OpReply data length fix.

## 1.x

- 1.2.2 - Bug fixes
- 1.1.0 - Implemented ArtSync
- 1.0.18 - Fixed bug in RdmPacketFactory
- 1.0.17 - Fixed bug in ArtNetReplyPacket
- 1.0.0 - Initial release