Skip to content

Technical details

Christopher Ritsen edited this page Feb 8, 2022 · 65 revisions

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.

mDNS services and ports

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.

Dante Controller presets

General request/response format

Sending a command

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.

Receivers

Paging results

Add/remove channel subscriptions

Transmitters

Disabled channels

Paging results

Friendly channel names

Device controls

Settings

Device name

Request

The service type is _netaudio-arc._udp

Position Hex value Text value Purpose
6:8 1001 Command ID
10:-1 41 A Device name

Response

The response is always the same:

27ff000affff10010001

Examples

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

Channel name

Encoding

Gain level

Latency

Request

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

Response

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

Examples

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@

Sample rate

Request

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

Response

There is no response.

Examples

48kHz
ffff002803d40000525400c5c2710000417564696e6174650727008100000064000000010000bb80

192kHz
ffff002803d40000525400c5c2710000417564696e6174650727008100000064000000010002ee00

Reboot device

Device information

Channel count

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.

Request

The service type is _netaudio-arc._udp

Position Example value Purpose
6:8 1000 Command ID

Response

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)

Examples

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            ............