发帖
9 1 2

[WB2] 实现自动发现局域网下的设备

WildboarG
论坛元老

37

主题

256

回帖

8177

积分

论坛元老

积分
8177
Ai-WB2系列 18498 9 2025-12-21 22:37:24
[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.cmdns_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();
    }
    

效果


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

    2025-12-21_19:52:55.png

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

2025-12-21_19:52:43.png

──── 1人觉得很赞 ────

使用道具 举报

适合批量自动化呀
2025-12-22 16:05:05
dzy7455339 发表于 2025-12-22 15:22
适合批量自动化呀

就是为了当有新设备加入网络可以自动感知,可以做一个自定义的家庭控制中枢
2025-12-22 22:36:37
这个有点牛😎
2025-12-25 08:34:04
这个只适合WB2吗?涂鸦、小米。天猫设备可以吗
2025-12-25 08:56:23
djy876 发表于 2025-12-25 08:34
这个只适合WB2吗?涂鸦、小米。天猫设备可以吗

能识别到他们的存在,但是控制这些设备需要可能需要你抓包看具体发了啥
2025-12-25 09:04:25
djy876 发表于 2025-12-25 08:34
这个只适合WB2吗?涂鸦、小米。天猫设备可以吗

这些厂商不会把api写在txt记录里,所以你可能要预先写好调用的api,然后识别到之后调用
2025-12-26 16:49:26
WildboarG 发表于 2025-12-25 08:56
能识别到他们的存在,但是控制这些设备需要可能需要你抓包看具体发了啥 ...

有抓包教程吗?不会抓包
2025-12-26 16:54:41
WildboarG 发表于 2025-12-25 09:04
这些厂商不会把api写在txt记录里,所以你可能要预先写好调用的api,然后识别到之后调用 ...

家里好多智能设备,都分别有自己 的APP,但是接入不到HA里
2026-1-21 16:58:54
djy876 发表于 2025-12-26 16:49
有抓包教程吗?不会抓包

wireshark 自己研究研究吧
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 30873 个
  • 话题数: 44830 篇