前言
LWIP的移植可以参考上篇文章 《HC32F4A0 lwip移植 - USTHzhanglu - 》

MDNS官方使用文档lwIP: MDNS (nongnu.org)

参数

MCU型号 HC32F4A0PIHB
库版本 HC32F4A0_DDL_Rev2.0.0
LWIP版本 lwip-STABLE-2_2_0_RC1
PHY型号 YT8512
MDK版本 5.37
PHY接口 RMII
IP IPv4

导入库
Lwip自带的example中有mdns的使用,包含到自己的库里即可。

PS D:\lwip-STABLE-2_2_0_RC1\contrib\examples\mdns> tree .\ /f
D:\LWIP-STABLE-2_2_0_RC1\CONTRIB\EXAMPLES\MDNS
    mdns_example.c
    mdns_example.h

对于2.2.0的lwip,需要在project中引入以下三个文件

PS D:\lwip-STABLE-2_2_0_RC1\src\apps\mdns> tree .\ /f
D:\LWIP-STABLE-2_2_0_RC1\SRC\APPS\MDNS
    mdns.c
    mdns_domain.c
    mdns_out.c

配置项
mdns依赖于IGMP协议,因此要在lwopts.h中使能相关宏定义

/* ---------- mdns options ---------- */ 
#define LWIP_MDNS_RESPONDER             1 //使能 MDNS
#define LWIP_IGMP                       1 //MDNS依赖项
#define LWIP_NUM_NETIF_CLIENT_DATA      1 //MDNS 至少需要1个,如果已经定义,则在以前的基础上+1

在网卡初始化时开启IGMP,不开启IGMP的话,MDNS无法广播出去。

/* Set netif link flag */
 netif->flags |= NETIF_FLAG_IGMP;

启用MDNS
mdns_example.c 已经写好了基本的使用项

#include "lwip/apps/mdns.h"
#include "mdns_example.h"

#if LWIP_MDNS_RESPONDER
static void
srv_txt(struct mdns_service *service, void *txt_userdata)
{
  err_t res;
  LWIP_UNUSED_ARG(txt_userdata);

  res = mdns_resp_add_service_txtitem(service, "path=/", 6);
  LWIP_ERROR("mdns add service txt failed\n", (res == ERR_OK), return);
}
#endif

#if LWIP_MDNS_RESPONDER
static void
mdns_example_report(struct netif* netif, u8_t result, s8_t service)
{
  LWIP_PLATFORM_DIAG(("mdns status[netif %d][service %d]: %d\n", netif->num, service, result));
}
#endif

void
mdns_example_init(void)
{
#if LWIP_MDNS_RESPONDER
  mdns_resp_register_name_result_cb(mdns_example_report);
  mdns_resp_init();
  mdns_resp_add_netif(netif_default, "lwip");
  mdns_resp_add_service(netif_default, "myweb", "_udp", DNSSD_PROTO_UDP, 80, srv_txt, NULL);
  mdns_resp_announce(netif_default);
#endif
}

通过调用mdns_example_init,即可使能MDNS服务。

测试
由于windows上没找到一个好用的MDNS测试工具,因此只能用PING或者wireshark抓包进行测试MDNS是否成功。

PING

ping lwip.local

Pinging lwip.local [192.168.1.20] with 32 bytes of data:
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255
Reply from 192.168.1.20: bytes=32 time<1ms TTL=255

Ping statistics for 192.168.1.20:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

可以看到,域名和IP绑定成功。

如果IP发生变化,则需要重新调用mdns_resp_announce函数进行广播;

如果连接发生变化,则需要调用mdns_resp_restart()重新启动mdns。

如果定义了LWIP_NETIF_EXT_STATUS_CALLBACK,则不需要手动调用,LWIP会自动重启,