
Matter 最小 mDNS 示例全解析用 minimal-mdns 调试设备发现与配网广播【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip本指南以 connectedhomeipMatter SDK仓库中的examples/minimal-mdns示例为主体系统讲解 Matter 内置的最小化多播 DNSmDNS协议栈的三种典型用法监听网络中 mDNS 查询/应答的服务端、主动发送查询的客户端、以及基于芯片内建广告器对外广播 Matter 服务的广告器。读完本文你将掌握 minimal-mdns 四个可执行程序的完整命令行参数、Matter 服务命名_matter/_matterc/_matterd的底层含义并能够使用dns-sd工具独立复现 Matter 配网发现commissioning discovery与操作发现operational discovery的完整报文交互。从 Matter 发现机制说起mDNS 扮演的角色Matter原 Project CHIP设备的配网与日常发现依赖 mDNSRFC 6762多播 DNS在局域网内广播和查询服务。仓库中 ServiceNaming.h 定义了全部关键服务名常量_matter._tcp操作发现operational discovery已加入 fabric 的节点用它公布自己的压缩 fabric ID 与节点 ID_matterc._udp可配网节点commissionable node等待被配网的设备用它公布判别器discriminator、厂商/产品 ID 等_matterd._udp委员commissioner执行配网的管理者角色用它公布自身_sub子类型subtype分隔符用于按判别器、厂商 ID 等维度组织 PTR 记录如S52._sub._matterc._udp.locallocalmDNS 的本地域名后缀。所有 mDNS 多播报文默认发往 UDP 端口 5353这一点在 minimal_mdns 实现 ResponseSender.cpp 中以kMdnsStandardPort 5353明确固定。examples/minimal-mdns这个示例就是用来贴身观察这套协议的它把协议栈的监听、查询、应答、广播四个侧面拆成独立的小程序便于调试、测试与学习。构建示例如何得到 out/minimal_mdns 下的二进制示例目录通过 args.gni 中的chip_mdns minimal显式选中 minimal 版 mDNS 协议栈实现BUILD.gn 定义了 4 个可执行目标与 1 个公共静态库目标源文件说明minimal-mdns-serverserver.cppmDNS 监听/应答服务端minimal-mdns-clientclient.cppmDNS 查询客户端mdns-advertiseradvertiser.cpp使用芯片内建广告器广播服务minimal-mdns-testertester.cpp构造并广播测试应答包minimal-mdns-example-commonPacketReporter.cpp报文内容打印公共库所有可执行文件的output_dir均指向root_out_dir这就是 README 中二进制位于out/minimal_mdns/下的原因。参考仓库根目录 gn_build.sh 所示的 GN/Ninja 构建模式先source scripts/activate.sh激活环境再gn gen生成构建目录最后ninja -C编译可按需生成该目录下的 4 个工具。示例服务端 minimal-mdns-server监听并应答 mDNS 查询server.cpp实现了一个可同时在 IPv4 与 IPv6 接口上监听 mDNS 查询的服务端。最基本的运行方式./out/minimal_mdns/minimal-mdns-server -4该命令会在IPv4 和 IPv6 地址上同时监听5353 端口即标准 mDNS 端口。不加-4时默认仅监听 IPv6启动后会打印当前监听端口与协议族Running on port 5353 using IPv4 AND IPv6...支持的命令行选项运行./out/minimal_mdns/minimal-mdns-server --help可查看全部选项。结合 server.cpp 的参数定义完整选项如下短选项长选项参数默认值说明-p--listen-portnumber5353监听端口号-4--enable-ip-v4无关闭启用 IPv4 监听否则仅 IPv6-i--instance-namenamechip-mdns-demo对外广播的实例名-t--trace-todest无追踪目标由命令行追踪框架支持服务端应答了什么responder 组合服务端内部用mdns::Minimal::Server1010 个端点上限与QueryResponder16最多 16 条应答记录组织应答逻辑见 server.cpp并通过responder组件回答不同类型的 DNS 记录PTR responder回答_matter._tcp.local、_matterc._udp.local服务发现查询并额外注册了S52、V123、L840三个判别器/厂商子类型 PTR 记录SRV responder指向chip-mdns-demo实例的服务端口CHIP_PORTTXT responder公布 TXT 记录源码中默认填入D0840yes、VP123456、PH3、OTHSome text here...IPv4/IPv6 responder应答 A/AAAA 地址记录IPv4 应答仅在-4开启时注册。运行时服务端会把网络上收到的每一条查询与应答都打印出来包括来源地址、来源端口、到达的网络接口名称再经PacketReporter逐条解析出包内的 QUERY/RESOURCE 记录类型、类、TTL、SRV 端口、A/AAAA 地址、TXT 键值等详见 PacketReporter.cpp是观察网络中其他 mDNS 设备的绝佳工具。示例客户端 minimal-mdns-client发起定制查询client.cpp实现一个可自定义查询内容的 mDNS 客户端。默认情况下它查询_services._dns-sd._udp.localDNS-SD 服务列表并使用单播应答unicast query即要求应答方通过单播直接回复./out/minimal_mdns/minimal-mdns-client在正常的局域网中这通常会列出大量应答记录打印每个应答的来源与完整资源记录。可以通过-q指定任意查询名./out/minimal_mdns/minimal-mdns-client -q chip-mdns-demo._matter._tcp.local支持的命令行选项结合 client.cpp 的选项定义完整参数如下短选项长选项参数默认值说明-q--queryname_services._dns-sd._udp.local要查询的名称-t--typeANY/PTR/A/AAAA/SRV/TXTANY查询的记录类型无--query-portnumber5353多播查询发送端口无--listen-portnumber5388本地监听应答的端口无--timeout-msnumber500等待应答的超时时间毫秒无--multicast-reply无关闭默认请求单播应答不请求单播应答改为多播应答-t冲突见上--trace-todest无追踪目标客户端发送逻辑见 client.cpp将查询名按.拆分为 QName 标签序列QuerySplitter用mdns::Minimal::QueryBuilder构造携带IN类、指定类型与请求单播应答标志的查询包随后经Server::BroadcastUnicastQuery请求单播应答时或Server::BroadcastSend多播应答时发出并在--timeout-ms超时后自动关闭所有 socket 退出。例如只查 IPv6 地址记录./out/minimal_mdns/minimal-mdns-client -t AAAA -q chip-mdns-demo._matter._tcp.local示例广告器 mdns-advertiser用芯片内建广告器广播 Matter 服务与前两个工具不同advertiser.cpp不再手工拼装报文而是直接调用 Matter 芯片内建的ServiceAdvertiser即chip::Dnssd::ServiceAdvertiser::Instance()见 advertiser.cpp以标准 Matter 广告参数对外广播服务。它支持四种广告模式通过-m/--advertising-mode选择。README 给出的三种典型运行示例# 广播一个可配网节点commissionable node ./out/minimal_mdns/mdns-advertiser -4 -m commissionable-node # 广播一个可配网节点并指定厂商/产品 ID ./out/minimal_mdns/mdns-advertiser -4 -m commissionable-node --vendor-id 123 --product-id 456 # 广播一个委员commissioner指定厂商/产品 ID 与设备类型 ./out/minimal_mdns/mdns-advertiser -4 -m commissioner --vendor-id 123 --product-id 456 --device-type 35支持的命令行选项运行./out/minimal_mdns/mdns-advertiser --help可查看全部细节。汇总 advertiser.cpp 的选项定义短选项长选项参数默认值说明-4--enable-ip-v4无关闭同时广播 IPv4 地址-m--advertising-modeoperational/operational-multi-admin/commissionable-node/commissionercommissionable-node广告模式-s--short-discriminatorvalue52短判别器可配网/委员-l--long-discriminatorvalue840长判别器可配网/委员无--vendor-idvalue无厂商 ID可配网/委员-p--product-idvalue无产品 ID可配网/委员无--commissioning-mode0/1/20配网模式0disabled1basic2enhanced无--device-typevalue无设备类型 ID可配网/委员无--device-namevalue无设备名称无--rotating-idvalue无轮转设备 IDrotating device id无--pairing-instructionvalue无配对指令pairing instruction无--pairing-hintvalue无配对提示pairing hint-f--fabric-idhex12345压缩 fabric ID操作模式-n--node-idhex6789节点 ID操作模式-t--trace-todest无追踪目标四种广告模式的行为差异源码中四种模式分别走不同的参数装配路径operational用OperationalAdvertisingParameters广播_matter._tcp服务PeerId 由--fabric-id与--node-id组合而成operational-multi-admin连续广播三次操作服务端口依次为CHIP_PORT、CHIP_PORT1、CHIP_PORT2fabric ID 与节点 ID 也依次递增——用于模拟一个节点同时加入多个 fabric 的多管理员场景commissionable-node用CommissionAdvertisingParameters广播_matterc._udp可携带短/长判别器、厂商/产品 ID、配网模式、设备类型、配对指令与配对提示等 TXT 信息commissioner同样是CommissionAdvertisingParameters但通过SetCommissionAdvertiseMode(CommssionAdvertiseMode::kCommissioner)将广告声明为委员对应_matterd._udp。用 dns-sd 测试发现流程macOS 自带dns-sd命令行工具部分 Linux 发行版可通过opkg等安装它能独立完成广告与发现与 minimal-mdns 示例配合可形成完整的测试闭环。以下是 README 中整理并可直接复用的用法更多细节可参考 Matter 规范中关于 discovery发现的章节。广告模拟设备供客户端查询模拟未配网节点uncommissioned nodedns-sd -R DD200C20D25AE5F7 _matterc._udp,S52,L840,V123 . 11111 D840 VP123456将产生如下记录可被上述minimal-mdns-client直接查到_matterc._udp.local. PTR DD200C20D25AE5F7._matterc._udp.local. S52._sub._matterc._udp.local. PTR DD200C20D25AE5F7._matterc._udp.local. L840._sub._matterc._udp.local. PTR DD200C20D25AE5F7._matterc._udp.local. V123._sub._matterc._udp.local. PTR DD200C20D25AE5F7._matterc._udp.local. DD200C20D25AE5F7._matterc._udp.local. TXT D840 VP123456 DD200C20D25AE5F7._matterc._udp.local. SRV 0 0 11111 B75AFB458ECD.local. B75AFB458ECD.local. AAAA ba2a:b311:742e:b44c:f515:576f:9783:3f30模拟配网中的节点commissioning nodedns-sd -R DD200C20D25AE5F7 _matterd._udp,S52,L840,V123 . 11111 D840 VP123456 PH3将产生如下记录_matterd._udp.local. PTR DD200C20D25AE5F7._matterd._udp.local. S52._sub._matterd._udp.local. PTR DD200C20D25AE5F7._matterd._udp.local. V123._sub._matterd._udp.local. PTR DD200C20D25AE5F7._matterd._udp.local. D840._sub._matterd._udp.local. PTR DD200C20D25AE5F7._matterd._udp.local. DD200C20D25AE5F7._matterd._udp.local. TXT D840 VP123456 PH3 DD200C20D25AE5F7._matterd._udp.local. SRV 0 0 11111 B75AFB458ECD.local. B75AFB458ECD.local. AAAA ba2a:b311:742e:b44c:f515:576f:9783:3f30模拟已配网节点commissioned nodedns-sd -R 2906C908D115D362-8FC7772401CD0696 _matter._tcp . 22222注意操作服务的实例名格式为压缩FabricID-节点ID如2906C908D115D362-8FC7772401CD0696这正是 ServiceNaming.h 中操作实例名长度上限按实例名 _matter._tcp.local计算的原因。发现查询网络上的 Matter 服务按节点查询browsedns-sd -B _matterc._udp # 等待配网的节点 dns-sd -B _matterc._udp,S52 # 短判别器为 52 的待配网节点 dns-sd -B _matterc._udp,L840 # 长判别器为 840 的待配网节点 dns-sd -B _matterc._udp,V123 # 厂商 ID 为 123 的待配网节点 dns-sd -B _matterd._udp # 可配网节点委员可见的设备 dns-sd -B _matterd._udp,S52 # 短判别器为 52 的可配网节点 dns-sd -B _matterd._udp,L840 # 长判别器为 840 的可配网节点 dns-sd -B _matterd._udp,V123 # 厂商 ID 为 123 的可配网节点查询 IP 地址lookup / getaddrdns-sd -L 2906C908D115D362-8FC7772401CD0696 _matter._tcp # 查找服务器地址 dns-sd -Gv6 B75AFB458ECD.local # 获取 IPv6 地址-B的子类型过滤S52/L840/V123与上面的_subPTR 记录一一对应广告方为每个判别器/厂商 ID 生成一条子类型 PTR查询方按子类型 browse 即可在不解析 SRV/TXT 的情况下快速筛选出匹配的设备这也是 Matter 配网时按判别器找设备的底层实现机制。附加调试工具 minimal-mdns-tester除 README 重点介绍的三个程序外tester.cpp 还提供了一个收发测试工具它用ResponseBuilder手工构造一个携带 PTR SRV 记录服务_matter._tcp.local、端口 5540、缓存刷新标志的应答包并向 5353 端口多播发送见 tester.cpp。运行它可验证局域网内其他 mDNS 监听方如minimal-mdns-server能否正确解析 Matter 操作服务的 SRV 应答参数包括--listen-port、-t --type SRV、--timeout-ms与--trace-to。小结examples/minimal-mdns是理解 Matter 网络发现层的最佳切入示例minimal-mdns-server让你看见网络中的所有 mDNS 流量minimal-mdns-client让你提出任意定制查询mdns-advertiser让你发布标准 Matter 服务minimal-mdns-tester则用于构造异常/特定报文做协议健壮性测试。配合 macOS/Linux 的dns-sd工具你可以不依赖任何真实 Matter 设备即可完整演练从待配网设备广播_matterc到委员按判别器发现并配网再到已配网节点通过_matter被日常发现的全过程为深入阅读 src/lib/dnssd/minimal_mdns 协议栈源码打下实践基础。【免费下载链接】connectedhomeipMatter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for consumers, guided by the Connectivity Standards Alliance.项目地址: https://gitcode.com/GitHub_Trending/co/connectedhomeip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考