1.MDNS
mdns即组播DNS(Multicast DNS)。以下是关于它的一些重要信息:
基本定义与作用:
- 在计算机网络中,mdns主要用于在没有本地名称服务器的小型网络中将主机名解析为IP地址,实现局域网内的主机相互发现和通信。它是一种零配置服务,使用与单播域名系统(DNS)基本相同的编程接口、数据包格式和操作语义。
工作原理:
- 当mdns客户端需要解析主机名时,它会发送一个IP多播查询消息,要求具有该名称的主机标识自己。目标机器会多播包含其IP地址的消息,子网中的其他计算机可以使用该信息来更新其mdns高速缓存。任何主机都可以通过发送生存时间(TTL)等于零的响应数据包来放弃其对名称的声明。
协议相关信息:
- mdns协议发布为RFC6762,使用IP多播用户数据报协议(UDP)数据包。其使用的IP地址通常是224.0.0.251(IPv4)或[ff02::fb](IPv6),端口为5353。
应用场景:
- 设备发现与连接:在智能家居系统中,各种智能设备可以通过mdns相互发现和连接,用户无需手动配置每个设备的IP地址等信息,方便设备之间的通信和协同工作。例如,智能音箱发现并连接到同一局域网内的智能电视,实现投屏等功能。
- 移动应用场景:在一些移动应用中,当多个移动设备处于同一局域网时,如会议室、教室等场景,应用可以利用mdns技术快速发现其他设备并进行文件共享、互动等操作。
- 网络打印服务:在一些办公网络环境中,打印机可以通过mdns发布自己的服务,用户的电脑可以快速发现并连接到局域网内的打印机,无需进行复杂的打印机配置。 常见的实现mdns的软件包有苹果的Bonjour和开源的Avahi等。许多操作系统和设备都支持mdns,如苹果的设备(电脑、笔记本、iPhone、iPad等)、大部分Linux设备等。在一些情况下,即使设备本身的操作系统可能不支持,但安装了特定的软件(如Windows设备安装了iTunes)后也可以使用mdns服务。
我开发的扫描、配置的工具,使用python中的zeroconf框架开发的。Zeroconf(零配置网络)是一种用于在本地网络中自动发现设备和服务的技术,它通常包括使用 mDNS(多播 DNS)和 DNS-SD(DNS 服务发现)等协议。
import zeroconf
# 创建一个 Zeroconf 实例
zeroconf_instance = zeroconf.Zeroconf()
# 扫描服务
services = {}
def service_resolver_callback(zeroconf, service_type, name, state_change):
if state_change is zeroconf.ServiceStateChange.Added:
info = zeroconf.get_service_info(service_type, name)
if info:
services[name] = info
print(f"发现服务:{name}, 类型:{service_type}, 地址:{info.parsed_addresses()[0]}, 端口:{info.port}")
zeroconf_instance.add_service_listener("_http._tcp.local.", service_resolver_callback)
try:
while True:
pass
except KeyboardInterrupt:
pass
# 关闭 Zeroconf 实例
zeroconf_instance.close()
要发送配置,具体的实现方式取决于你的配置内容和目标服务。一般来说,可以通过与目标服务建立连接(如果服务支持)并发送特定的命令或数据来实现配置的发送。
请注意,在实际应用中,你可能需要根据具体的需求进行更多的错误处理和功能扩展。同时,确保在使用完zeroconf实例后正确地关闭它,以释放资源。
2.TFTP
TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议,通常用于在网络设备之间传输小文件。它采用UDP作为传输层协议,因此不提供错误恢复或连接管理,适用于无需复杂控制的环境。TFTP常用于网络引导、固件升级以及其他低开销文件传输场景。
https://pjo2.github.io/tftpd64/ 下载地址
import tftpy
# 创建 TFTP 客户端实例
client = tftpy.TftpClient('127.0.0.1', 69)
# 从服务器下载文件
try:
client.download('remote_filename', 'local_filename')
print("文件下载成功")
except Exception as e:
print(f"下载文件时出现错误:{e}")
# 向服务器上传文件
try:
client.upload('local_filename', 'remote_filename')
print("文件上传成功")
except Exception as e:
print(f"上传文件时出现错误:{e}")
我主要使用python 中的tftpy发送固件文件来做升级,代码示例如下: