Here all 512 channels are set to full (ff). The length of the Data Field therefore is 512 or 0x0200. This number is also present in bytes 003a and 003b (the ones before all the ff's), high byte first. This is according to spec.
our packet
Now, let's send a packet with artnet_protocol:
[dependencies]
artnet_protocol = "0.2.0"
use artnet_protocol::*;
use std::net::*;
fn main() {
let long_artnet_protocol_packet = ArtCommand::Output(Output {
length: 512,
data: vec![0xff; 512],
..Output::default()
});
let socket = UdpSocket::bind(("0.0.0.0", 6454)).unwrap();
let broadcast_addr = ("192.168.1.255", 6454)
.to_socket_addrs()
.unwrap()
.next()
.unwrap();
socket.set_broadcast(true).unwrap();
let bytes = long_artnet_protocol_packet.into_buffer().unwrap();
socket.send_to(&bytes, &broadcast_addr).unwrap();
}
You can see that bytes 003a and 003b are flipped compared to the reference packet. The Wireshark Art-Net Protocol therefore interprets the DMX channels as FL FL - only 2 channels at full instead of 512.
Reproduction
Reference packet
A typical ArtDMX packet sent from DMX-Workshop and captured with Wireshark:
Here all 512 channels are set to full (ff). The length of the Data Field therefore is 512 or 0x0200. This number is also present in bytes 003a and 003b (the ones before all the ff's), high byte first. This is according to spec.
our packet
Now, let's send a packet with
artnet_protocol
:Wireshark now captures this packet:
You can see that bytes 003a and 003b are flipped compared to the reference packet. The Wireshark Art-Net Protocol therefore interprets the DMX channels as
FL FL
- only 2 channels at full instead of 512.The bytes of the length field should be flipped.
Point of failure
The error occurs here: https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/command/mod.rs#L145 but there, only extension happens. The erroneous data seems to be created in https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/command/mod.rs#L136 which again calls https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/command/mod.rs#L220 which again calls https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/macros.rs#L21-L31 where into_buffer for u16 is defined in https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/convert.rs#L113 for which the macro is defined in https://github.com/Trangar/artnet_protocol/blob/ff48ddefac34c4be7711c3f1e731a9f17796d1ce/src/convert.rs#L98-L102 which means that all u16's are converted as little endian.
This is right for converting from
subnet
to the ArtDmx fields SubUni and Net. But the length fields require big endian order.