-
Notifications
You must be signed in to change notification settings - Fork 24
Technical details
This program was created by looking at network requests and preset files made by Dante Controller. Parsing the binary data from the network requests and their responses required some effort. Not all of the commands or their arguments have been explored yet, but all known commands will be documented here. The official Dante API for embedded devices isn't public information, so most of this information is guesswork and will likely be wrong or unreliable.
Right now, I'm implementing this in python as an excuse to learn more about the language, but eventually this will be ported to others. The most likely second language is going to be JavaScript (node).
The initial efforts for this project were originally documented on a gearspace discussion.
Each device can be found using mDNS and filtering the service type to one of the following:
- _netaudio-cmc._udp
- _netaudio-dbc._udp
- _netaudio-arc._udp
- _netaudio-chan._udp
Most of these describe the device, but _netaudio-chan._udp
describes individual channels. It isn't present on all hardware. The ports used by each service are described here.
Some commmon examples of ports used are these:
- 24440 (Audio control, VIA)
- 24455 (Audio control, VIA)
- 4440 (Audio control)
- 4455 (Audio control)
- 8800 (Control & Monitoring)
- 8700 (Device settings such as sample rate, encoding, level control)
The ports for routing are the audio control ones (_netaudio-arc._udp
). Port 8700 isn't advertised as a mNDS service.
Using openbsd-netcat, this command will reset the device name. Get the port from the _netaudio-arc._udp
service first.
echo '27ff000affff10010000' | xxd -r -p | nc -N -w1 -u 192.168.1.42 4440 | xxd
00000000: 27ff 000a ffff 1001 0001 ')........
Position | Example value | Purpose |
---|---|---|
0:1 | 27 | Fixed value. |
1:2 | 29 | Some kind of sequence ID or program identifier. The same value will be returned in the reply. |
2:4 | 000a | The length of the data being sent or returned in bytes. It's important to get this correct. |
4:6 | ffff | Another sequence ID. This one is incremented for every request by Dante Controller. |
6:8 | 1001 | Unique command ID. |
8: | 0000 | Command arguments. Can be any length. The actual arguments begin after a "0000" separator. |
Dante Controller doesn't actually have a feature to reset the device name besides fully resetting the device. This was achived by sending the command to change the device name but without any value.
The service type is _netaudio-arc._udp
Position | Hex value | Text value | Purpose |
---|---|---|---|
6:8 | 1001 | Command ID | |
10:-1 | 41 | A | Device name |
The response is always the same:
27ff000affff10010001
Without arguments, the device name will be reset:
27ff000affff10010000
The device name can be up to 31 characters long. If a name is given that is over the maximum length it will still be set, but the result will be truncated.
a
27ff000bffff100100004100
abcdefghijklmnopqrstuvwxyxABCDE
27ff0028ffff10010000414141414141414141414141414141414141414141414141414141414100
The service type is _netaudio-arc._udp
Position | Hex value | Dec value | Purpose |
---|---|---|---|
6:8 | 1101 | 4353 | Command ID |
32:36 | 0f4240 | 1000000 | Latency in nanoseconds |
36:40 | 0f4240 | 1000000 | Latency in nanoseconds, again |
The response is nearly the same as the reqest, just shorter.
Position | Hex value | Dec value | Purpose |
---|---|---|---|
6:8 | 1101 | 4353 | Command ID |
24:28 | 0f4240 | 1000000 | Latency in nanoseconds |
28:32 | 0f4240 | 1000000 | Latency in nanoseconds, again |
Setting the latency to 1ms:
27ff0028ffff1101000005038205002002110010830100248219830183028306000f4240000f4240
00000000: 27ff 0020 ffff 1101 0001 0303 8205 0018 '.. ............
00000010: 0211 0010 8301 001c 000f 4240 000f 4240 ..........B@..B@
5ms:
27ff0028ffff1101000005038205002002110010830100248219830183028306004c4b40004c4b40
00000000: 27ff 0020 ffff 1101 0001 0303 8205 0018 '.. ............
00000010: 0211 0010 8301 001c 004c 4b40 004c 4b40 .........LK@.LK@
This request is done on port 8700. Possible values are:
- 44100
- 48000
- 88200
- 96000
- 176400
- 192000
Position | Hex value | Dec value | Purpose |
---|---|---|---|
0:36 | Fixed string for this request; not really important | ||
36:40 | 02ee00 | 192000 | Sample rate in Hz |
There is no response.
48kHz
ffff002803d40000525400c5c2710000417564696e6174650727008100000064000000010000bb80
192kHz
ffff002803d40000525400c5c2710000417564696e6174650727008100000064000000010002ee00
This command returns both the Tx and Rx channel counts, assuming the device is configured for a 48K sample rate. This can't be relied upon for the actual number of useable channels, as some devices limit the channels to less than the hardware supports. For example, the Shure AD4D is a wireless receiver that uses a Dante Brooklyn II, which supports 64 channels yet it is only using two Tx channels and one Rx channel.
The service type is _netaudio-arc._udp
Position | Example value | Purpose |
---|---|---|
6:8 | 1000 | Command ID |
The response data contains additional values that don't have a clear purpose yet.
Position | Hex value | Dec value | Purpose |
---|---|---|---|
6:8 | 1000 | 4096 | Command ID |
13:14 | 0080 | 128 | Rx channel count (16-bit Big Endian) |
15:16 | 0040 | 64 | Tx channel count as (16-bit Big Endian) |
27ff000affff10000000
0 Rx / 2 Tx
00000000: 27ff 002c ffff 1000 0001 05f9 0002 0000 '..,............
00000010: 0000 0002 0000 0002 0000 0002 0001 0001 ................
00000020: 0000 0000 0000 0000 0000 0000 ............
2 Rx / 0 Tx
00000000: 27ff 002c ffff 1000 0001 05f9 0000 0002 '..,............
00000010: 0000 0000 0008 0000 0002 0000 0001 0001 ................
00000020: 0000 0000 0000 0000 0000 0000 ............
128 Rx / 128 Tx
00000000: 27ff 002c ffff 1000 0001 07f9 0080 0080 '..,............
00000010: 0026 0008 0010 0020 0020 0100 0002 0002 .&..... . ......
00000020: 0000 0000 0000 0000 0000 0000 ............
1 Rx / 2 Tx out of 64 Rx / 64 Tx
00000000: 27ff 002c ffff 1000 0001 0ff9 0040 0001 '..,.........@..
00000010: 0000 0040 0040 0010 0010 0080 0002 0001 ...@.@..........
00000020: 0000 0000 0000 0000 0000 0000 ............