Skip to content

由 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

感兴趣的给点点🌟

使用


  • 拉库文件到当前目录

git clone https://github.com/WildboarG/mdns_browser.git

  • 只关注 mdns_bor.cmdns_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();
}

效果


  1. 我局域网下有两个WB2,一个是http模拟灯(mywb2light.local)自动发布记录和烧录上述代码的 browser demo

  2. 烧录启动后,browser发现局域网下mylight服务,并解析出他的txt中的api.

Released under the MIT License. Build Time 2026-09-11 14:52:23