Haukcode.ArtNet
5.0.150
dotnet add package Haukcode.ArtNet --version 5.0.150
NuGet\Install-Package Haukcode.ArtNet -Version 5.0.150
<PackageReference Include="Haukcode.ArtNet" Version="5.0.150" />
<PackageVersion Include="Haukcode.ArtNet" Version="5.0.150" />
<PackageReference Include="Haukcode.ArtNet" />
paket add Haukcode.ArtNet --version 5.0.150
#r "nuget: Haukcode.ArtNet, 5.0.150"
#:package Haukcode.ArtNet@5.0.150
#addin nuget:?package=Haukcode.ArtNet&version=5.0.150
#tool nuget:?package=Haukcode.ArtNet&version=5.0.150
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 discoveryArtDmx,ArtNzs/ArtVlc- DMX dataArtSync- Frame synchronizationArtTrigger,ArtTimeCode,ArtCommand- Show controlArtAddress,ArtInput,ArtIpProg- Node configurationArtDataRequest/ArtDataReply,ArtDiagData- Product data and diagnosticsArtTodRequest/ArtTodData/ArtTodControl- RDM device discoveryArtRdm/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 | Versions 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. |
-
net10.0
- Haukcode.HighPerfComm (>= 1.0.53)
- Haukcode.Network (>= 1.0.29)
-
net8.0
- Haukcode.HighPerfComm (>= 1.0.53)
- Haukcode.Network (>= 1.0.29)
-
net9.0
- Haukcode.HighPerfComm (>= 1.0.53)
- Haukcode.Network (>= 1.0.29)
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 |
# 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