[i=s] 本帖最后由 WildboarG 于 2026-4-16 18:44 编辑 [/i]
mDNS浏览器(mDNS_Browser)
mDNS浏览器是一种用于发现和查看局域网内mDNS(Multicast DNS)设备与服务的工具。
它通过监听局域网中的mDNS广播报文,自动列出当前网络中已发布的主机名(如 xxx.local)及其对应的服务类型(如HTTP、SSH等),无需扫描IP地址或依赖中心化DNS服务器。
主要用途:
- 查看局域网内支持mDNS的设备
- 验证设备或服务是否正确发布mDNS信息
- 在未知IP地址的情况下快速定位设备
特点:
- 工作于局域网内
- 基于UDP5353组播通信
- 被动监听,不主动扫描网络
WB2实现mDNS浏览器
上篇帖子介绍了设备快速发现,如何让自身的服务快速被别人发现,我们可以借助工具看到服务的发布。但没有在lwip的mdns_server.h`中看到如何实现浏览器(也就是如何探测别人的提供的服务)。我们的目标是主动发现别人的服务,解析别人TXT中的api,然后自动注册为工具,借助小安AI来语音调用局域网下各个工具(例如:开关灯,空调设置,警戒助手的启用与关闭)。
封装了可以快速实现Mdns浏览器的库

感兴趣的给点点🌟
使用
git clone https://github.com/WildboarG/mdns_browser.git
- 只关注
mdns_bor.c 和 mdns_bro.h文件
- 复制上述两个文件到你的项目根目录
- 在获取wifi IP后
新建任务 来实现服务发现
- 需要自己实现回调函数,和调用启动
- 实例demo
/* 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)自动发布记录和烧录上述代码的 browser demo

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