Skip to content

Add documentation of MDNS #197

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -801,6 +801,13 @@ theme = "doc-theme"
parent = "firmwareapi@pycom@network"
weight = 60

[[menu.main]]
name = "MDNS"
url = "/firmwareapi/pycom/network/mdns/"
identifier = "firmwareapi@pycom@network@mdns"
parent = "firmwareapi@pycom@network"
weight = 70

[[menu.main]]
name = "AES"
url = "/firmwareapi/pycom/aes/"
Expand Down
148 changes: 148 additions & 0 deletions content/firmwareapi/pycom/network/mdns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
---
title: "MDNS"
aliases:
- firmwareapi/pycom/network/mdns.html
- firmwareapi/pycom/network/mdns.md
- chapter/firmwareapi/pycom/network/mdns
---
This class provides an interface to use the MDNS functionality.

## Quick Usage Example

Example for advertising own services:

```python
import time
from network import MDNS
# As a first step connection to network should be estbalished, e.g. via WLAN

# Initialize the MDNS module
MDNS.init()
# Set the hostname and instance name of this device
MDNS.set_name(hostname = "my_hostname", instance_name = "my_instance")
# Add a TCP service to advertise
MDNS.add_service("_http", MDNS.PROTO_TCP, 80)
# Add an UDP service to advertise
MDNS.add_service("_myservice", MDNS.PROTO_UDP, 1234, txt= (("board","esp32"),("u","user"),("p","password")))

# Give the other devices time to discover the services offered
time.sleep(60)

# Remove a service, it will no longer be advertised
MDNS.remove_service("_http", MDNS.PROTO_TCP)

```

Example for querying:

```python
import time
from network import MDNS
# As a first step connection to network should be estbalished, e.g. via WLAN

# Initialize the MDNS module
MDNS.init()

# Perform a query for 2000 ms
q = MDNS.query(2000, "_http", MDNS.PROTO_TCP)

# Print out the query's result
if q is not None:
for elem in q:
print(elem.instance_name())
print(elem.hostname())
print(elem.addr())
print(elem.port())
print(elem.txt())

```

## Constructor

### class network.MDNS()

Initializes the MDNS module.

## Methods

#### MDNS.deinit()

Deinitializes the MDNS module and removes all registered services.

#### MDNS.set_name(\*, hostname=None, instance_name=None)

Sets the hostname and instance name of the device that is going to be advertised.

The arguments are:

* `hostname` is the hostname to set
* `instance_name` is the instance name to set

#### MDNS.add_service(service_type, proto, port, \*, txt)

Adds a service to the MDNS module which will be advertised.

The arguments are:

* `service_type` is the type of the offered service, e.g.: _http, _ftp or can be custom service
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The formatting here seems slightly different - will it upload well?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked and the content of the mdns.md is exactly the same as what we have on the publish-development branch. Is that a problem?

* `proto` is the Layer 4 protocol (TCP or UDP), can be `MDNS.PROTO_TCP` or `MDNS.PROTO_UDP`
* `port` is the port number
* `txt` is the TXT entries to be placed into the advertisement. The TXT entry is a (key, value) tuple and several TXT entries can be included in an advertisement. In that case, 'txt' must be given as a list of tuples.

#### MDNS.remove_service(service_type, proto)

Removes a service from the MDNS module so it will not be advertised anymore.

The arguments are:

* `service_type` is the type of the service, e.g.: _http, _ftp or can be custom service
* `proto` is the Layer 4 protocol (TCP or UDP), can be `MDNS.PROTO_TCP` or `MDNS.PROTO_UDP`

#### MDNS.query(timeout, service_type, proto, \*, instance_name=None)

Performs a query with the given parameters.

The arguments are:

* `timeout` is the timeout value in milliseconds to wait to receive the results
* `service_type` is the type of the service to be queried, e.g.: _http, _ftp or can be custom service
* `proto` is the Layer 4 protocol (TCP or UDP), can be `MDNS.PROTO_TCP` or `MDNS.PROTO_UDP`
* `instance_name` is the instance name of the service to be queried

If the service is found then the function returns with a list of `MDNS_Query` objects.

## MDNS_Query class

The `MDNS_Query` aggregates all of the properties of a successful query session entry:

* `hostname` is the hostname of the host advertising the service
* `instance_name` is the instance_name of the service
* `addr` is the IPv4 address belonging to the service
* `port` is the port number belonging to the service
* `txt` is the TXT entries from the advertisement. The TXT entry is a (key, value) tuple, and several TXT entries can be included in an advertisement.

#### MDNS_Query.hostname()

Returns with the hostname of the queried service.

#### MDNS_Query.instance_name()

Returns with the instance name of the queried service.

#### MDNS_Query.addr()

Returns with the IPv4 address of the queried service.

#### MDNS_Query.port()

Returns with the port of the queried service.

#### MDNS_Query.txt()

Returns with the TXT entries of the queried service.

## Constants

* TCP and UDP protocol types: `MDNS.PROTO_TCP`, `MDNS.PROTO_UDP`