# Minimal mDNS example

This example demonstrates the multicast DNS (mDNS) protocol functionality in
Matter.

## Example server

The file `server.cpp` contains an example of a mdns server that can listen on
both IPv4 and IPv6 interfaces or mDNS queries.

To run, you can use:

```sh
./out/minimal_mdns/minimal-mdns-server -4
```

which will listen on both IPv4 and IPv6 addresses, on port 5353.

See

```sh
./out/minimal_mdns/minimal-mdns-server --help
```

for supported options.

The server will print out any queries as well as any advertisements it sees on
the network while running.

## Example client

The file `client.cpp` contains an example of a mdns client. By default it
queries for **\_services.\_dns-sd.\_udp.local** (DNS-SD list services) and uses
unicast queries.

Example run:

```sh
./out/minimal_mdns/minimal-mdns-client -4
```

which is likely to list a lot of answers.

You can customize the queries run:

```sh
/out/minimal_mdns/minimal-mdns-client -4 -q chip-mdns-demo._matter._tcp.local
```

see

```sh
./out/minimal_mdns/minimal-mdns-client --help
```

for full command line details.

## Example advertiser

This example uses the chip built-in advertiser, implemented in the file
`advertiser.cpp`.

Example runs:

```sh
./out/minimal_mdns/mdns-advertiser -4 -m operational
```

```sh
./out/minimal_mdns/mdns-advertiser -4 -m commissionable-node --vendor-id 123 --product-id 456
```

```sh
./out/minimal_mdns/mdns-advertiser -4 -m commissioner --vendor-id 123 --product-id 456 --device-type 35
```

see

```sh
./out/minimal_mdns/mdns-advertiser --help
```

for full command line details.

## Testing with dns-sd

If you have a mac computer (or are able to install dns-sd via opkg), here are
some helpful examples on usage. More details are available in the CHIP spec on
discovery.

### Advertising to test client listings

#### Simulated uncommissioned node

```sh
dns-sd -R DD200C20D25AE5F7 _matterc._udp,S52,L840,V123 . 11111 D=840 VP=123+456
```

Will create the following records

```
_matterc._udp.local.                   PTR   DD200C20D25AE5F7._matterc._udp.local.
S52._sub._matterc._udp.local.          PTR   DD200C20D25AE5F7._matterc._udp.local.
L840._sub._matterc._udp.local.         PTR   DD200C20D25AE5F7._matterc._udp.local.
V123._sub._matterc._udp.local.         PTR   DD200C20D25AE5F7._matterc._udp.local.
DD200C20D25AE5F7._matterc._udp.local.  TXT   "D=840" "VP=123+456"
DD200C20D25AE5F7._matterc._udp.local.  SRV   0 0 11111 B75AFB458ECD.local.
B75AFB458ECD.local.                  AAAA  ba2a:b311:742e:b44c:f515:576f:9783:3f30
```

#### Simulated commissioning node

```sh
dns-sd -R DD200C20D25AE5F7 _matterd._udp,S52,L840,V123 . 11111 D=840 VP=123+456 PH=3
```

Will create the following records:

```
_matterd._udp.local.                   PTR   DD200C20D25AE5F7._matterd._udp.local.
S52._sub._matterd._udp.local.          PTR   DD200C20D25AE5F7._matterd._udp.local.
V123._sub._matterd._udp.local.         PTR   DD200C20D25AE5F7._matterd._udp.local.
D840._sub._matterd._udp.local.         PTR   DD200C20D25AE5F7._matterd._udp.local.
DD200C20D25AE5F7._matterd._udp.local.  TXT   "D=840" "VP=123+456" "PH=3"
DD200C20D25AE5F7._matterd._udp.local.  SRV   0 0 11111 B75AFB458ECD.local.
B75AFB458ECD.local.                    AAAA  ba2a:b311:742e:b44c:f515:576f:9783:3f30
```

#### Simulated commissioned node

```sh
dns-sd -R 2906C908D115D362-8FC7772401CD0696 _matter._tcp . 22222
```

### Discovery commands

Nodes:

```sh
dns-sd -B _matterc._udp         # Nodes awaiting commissioning
dns-sd -B _matterc._udp,S52     # Nodes awaiting commissioning with short discriminator 52
dns-sd -B _matterc._udp,L840    # Nodes awaiting commissioning with long discriminator 840
dns-sd -B _matterc._udp,V123    # Nodes awaiting commissioning with vendor id 123

dns-sd -B _matterd._udp         # Commissionable nodes
dns-sd -B _matterd._udp,S52     # Commissionable nodes with short discriminator 52
dns-sd -B _matterd._udp,L840    # Commissionable nodes with long discriminator 840
dns-sd -B _matterd._udp,V123    # Commissionable nodes with vendor id 123
```

IP Address:

```sh
dns-sd -L 2906C908D115D362-8FC7772401CD0696 _matter._tcp  # find server address
dns-sd -Gv6 B75AFB458ECD.local                            # get IPv6 address
```
