#mdns #networking #async #no-alloc #responder #multicast #edge

no-std edge-mdns

Async + no_std + no-alloc implementation of an mDNS responder

3 releases (breaking)

0.2.0 Feb 1, 2024
0.1.0 Jan 27, 2024
0.0.0 Nov 22, 2023

#1962 in Embedded development

Download history 9/week @ 2024-01-25 16/week @ 2024-02-01 12/week @ 2024-02-15 26/week @ 2024-02-22 9/week @ 2024-02-29 1/week @ 2024-03-07 2/week @ 2024-03-14 30/week @ 2024-03-28 30/week @ 2024-04-04

60 downloads per month
Used in edge-net

MIT/Apache

31KB
723 lines

edge-mdns

CI crates.io Documentation

Async + no_std + no-alloc implementation of an mDNS responder.

The implementation is based on the splendid domain library.

For other protocols, look at the edge-net aggregator crate documentation.

Example

use embedded_nal_async::{Ipv4Addr, UdpStack};
use embedded_nal_async_xtra::Multicast;

use edge_mdns::io::{self, MdnsIoError, MdnsRunBuffers, UdpSplitBuffer, DEFAULT_SOCKET};
use edge_mdns::Host;

use log::*;

// Change this to the IP address of the machine where you'll run this example
const OUR_IP: Ipv4Addr = Ipv4Addr::new(127, 0, 0, 1);

const OUR_NAME: &str = "mypc";

fn main() {
    env_logger::init_from_env(
        env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
    );

    let stack = edge_std_nal_async::Stack::new();

    let mut udp_buffer = UdpSplitBuffer::new();
    let mut buffers = MdnsRunBuffers::new();

    futures_lite::future::block_on(run(&stack, &mut udp_buffer, &mut buffers, OUR_NAME, OUR_IP))
        .unwrap();
}

async fn run<T: UdpStack>(
    stack: &T,
    udp_buffer: &mut UdpSplitBuffer,
    buffers: &mut MdnsRunBuffers,
    our_name: &str,
    our_ip: Ipv4Addr,
) -> Result<(), MdnsIoError<T::Error>>
where
    T: UdpStack,
    <T as UdpStack>::UniquelyBound: Multicast<Error = T::Error>,
{
    info!("About to run an mDNS responder for our PC. It will be addressable using {our_name}.local, so try to `ping {our_name}.local`.");

    let host = Host {
        id: 0,
        hostname: our_name,
        ip: our_ip.octets(),
        ipv6: None,
    };

    io::run(
        &host,
        Some(0),
        [],
        stack,
        DEFAULT_SOCKET,
        udp_buffer,
        buffers,
    )
    .await
}

Dependencies

~3.5MB
~69K SLoC