mDNS 介绍及代码示例
mDNS(Multicast DNS)是一种网络协议,用于在没有 DNS 服务器的情况下,在点对点网络上发布和解析服务。它是基于 DNS 协议的,并且使用 IP 多播提供服务发现。
在许多情况下,设备需要在不依赖 DNS 服务器的情况下相互发现和通信。例如,当两个在同一局域网(LAN)上的设备需要通信时,可以使用 mDNS 来发现彼此的服务和主机名。
以下是一个使用 Python 的 mDNS 库 zeroconf
来注册和解析服务的简单例子:
注册服务:
from zeroconf import Zeroconf, ServiceInfo
class MyService:
def __init__(self, name):
self.name = name
def _register(self, zeroconf: Zeroconf):
service_info = ServiceInfo(
"_myservice._tcp.local.",
f"{self.name}._myservice._tcp.local.",
addresses=[b"127.0.0.1"], # 注意:这里应该是设备的 IP 地址
port=5678,
properties={b"prop1": b"value1", b"prop2": b"value2"},
weight=0,
priority=100,
server="myserver.local."
)
zeroconf.register_service(service_info)
service = MyService("mydevice")
zeroconf = Zeroconf()
service._register(zeroconf)
解析服务:
from zeroconf import Zeroconf
class MyServiceBrowser:
def __init__(self, zeroconf: Zeroconf, type_: str):
self.zeroconf = zeroconf
self.browser = zeroconf.browse_services(type_, self)
def add_service(self, zeroconf, type_, name):
print(f"Service {name} added, visiting.")
zeroconf.resolve_service(type_, name, handlers=[self])
def remove_service(self, zeroconf, type_, name):
print(f"Service {name} removed.")
def update_service(self, zeroconf, type_, name):
print(f"Service {name} updated, visiting.")
zeroconf.resolve_service(type_, name, handlers=[self])
def resolve_service(self, zeroconf, type_, name):
print(f"Resolving {name}")
zeroconf = Zeroconf()
browser = MyServiceBrowser(zeroconf, "_myservice._tcp.local.")
# 运行一段时间后停止浏览
import time
time.sleep(10)
zeroconf.close()
这个例子展示了如何注册一个服务和如何浏览和解析服务。在实际应用中,你需要根据自己的需求来定义服务类型和处理服务的方法。
评论已关闭