前言
LWIP的移植可以参考上篇文章 《HC32F4A0 lwip移植 - USTHzhanglu - 博客园 (cnblogs.com)》
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会自动重启,