由 WildboarG 贡献,Ai-Thinker 进行整理
[WB2] 实现自动发现局域网下的设备
mDNS浏览器(mDNS_Browser)
mDNS浏览器是一种用于发现和查看局域网内mDNS(Multicast DNS)设备与服务的工具。
它通过监听局域网中的mDNS广播报文,自动列出当前网络中已发布的主机名(如 xxx.local)及其对应的服务类型(如HTTP、SSH等),无需扫描IP地址或依赖中心化DNS服务器。
主要用途:
- 查看局域网内支持mDNS的设备
- 验证设备或服务是否正确发布mDNS信息
- 在未知IP地址的情况下快速定位设备
特点:
- 工作于局域网内
- 基于UDP5353组播通信
- 被动监听,不主动扫描网络
WB2实现mDNS浏览器
封装了可以快速实现Mdns浏览器的库
https://github.com/WildboarG/mdns_browser
感兴趣的给点点🌟
使用
- 拉库文件到当前目录
- 只关注
mdns_bor.c和mdns_bro.h文件 - 复制上述两个文件到你的项目根目录
- 在获取wifi IP后
新建任务来实现服务发现 - 需要自己实现回调函数,和调用启动
- 实例demo
📜 点击展开完整代码
c
/* mdns_bro_demo.c
* 简单演示如何使用 mdns_bro 库:
* - 注册回调接收新增/更新/删除事件
* - 设置要监听的服务类型(示例:_http._tcp.local)
* - 启动/停止 mdns 浏览器
*
* 将 `mdns_bro_demo_init()` 在设备获得 IP 后调用(例如在 wifi GOT_IP 回调中)。
*/
#
include
<stdio.h>
#
include
<string.h>
#
include
"mdns_bro.h"
#
include
<lwip/ip_addr.h>
#
include
<lwip/inet.h>
static
void
mdns_demo_cb
(
const
struct
mdns_service_info *info,
mdns_event_t
ev,
void
*user_data)
{
(
void
)user_data;
const
char
*evs = (ev == MDNS_EVENT_ADDED) ?
"ADDED"
: (ev == MDNS_EVENT_UPDATED) ?
"UPDATED"
:
"REMOVED"
;
char
ipbuf[
64
] = {
0
};
if
(ipaddr_ntoa_r(&info->ip, ipbuf,
sizeof
(ipbuf)) ==
NULL
) {
strncpy
(ipbuf,
"0.0.0.0"
,
sizeof
(ipbuf)
-1
);
}
printf
(
"[mdns_demo] %s: instance='%s' host='%s' ip=%s port=%u txt='%s' expires_ms=%u\n"
,
evs,
info->instance[
0
] ? info->instance :
"-"
,
info->hostname[
0
] ? info->hostname :
"-"
,
ipbuf,
(
unsigned
)info->port,
info->txt[
0
] ? info->txt :
"-"
,
(
unsigned
)info->expires_ms);
}
/* Call this after network is up (GOT_IP). */
void
mdns_bro_demo_init
(
void
)
{
mdns_bro_init();
mdns_bro_register_callback(mdns_demo_cb,
NULL
);
/* 默认监听 HTTP 服务;如果需要其他服务可调用 mdns_bro_set_service_type() */
mdns_bro_set_service_type(
"_http._tcp.local"
);
mdns_bro_set_ttl_cap(
300
);
/* 可选:限制 TTL 最大值 */
mdns_bro_set_update_debounce(
30
*
1000
);
mdns_bro_start();
}
/* 可选:在关闭网络或停止发现时调用 */
void
mdns_bro_demo_stop
(
void
)
{
mdns_bro_stop();
}效果
我局域网下有两个WB2,一个是http模拟灯(mywb2light.local)自动发布记录和烧录上述代码的
browserdemo
烧录启动后,browser发现局域网下mylight服务,并解析出他的txt中的api.


