工作中用到的物联网协议,mdns + tftp 含python代码

1.MDNS

mdns即组播DNS(Multicast DNS)。以下是关于它的一些重要信息:

  1. 基本定义与作用

    • 在计算机网络中,mdns主要用于在没有本地名称服务器的小型网络中将主机名解析为IP地址,实现局域网内的主机相互发现和通信。它是一种零配置服务,使用与单播域名系统(DNS)基本相同的编程接口、数据包格式和操作语义。
  2. 工作原理

    • 当mdns客户端需要解析主机名时,它会发送一个IP多播查询消息,要求具有该名称的主机标识自己。目标机器会多播包含其IP地址的消息,子网中的其他计算机可以使用该信息来更新其mdns高速缓存。任何主机都可以通过发送生存时间(TTL)等于零的响应数据包来放弃其对名称的声明。
  3. 协议相关信息

    • mdns协议发布为RFC6762,使用IP多播用户数据报协议(UDP)数据包。其使用的IP地址通常是224.0.0.251(IPv4)或[ff02::fb](IPv6),端口为5353。
  4. 应用场景

    • 设备发现与连接:在智能家居系统中,各种智能设备可以通过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/ 下载地址

eef4d9c850286133c7a5211ffa351e61.jpeg

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发送固件文件来做升级,代码示例如下:

以下是一个使用Android NSD框架实现mDNS协议的示例代码,该代码可以用于在Android设备上发现其他支持mDNS的设备和服务: ```java // 初始化NsdManager NsdManager nsdManager = (NsdManager) getSystemService(Context.NSD_SERVICE); // 创建一个NsdManager.DiscoveryListener,用于处理发现事件 NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() { @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { // 发现服务失败 } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { // 停止发现服务失败 } @Override public void onDiscoveryStarted(String serviceType) { // 开始发现服务 } @Override public void onDiscoveryStopped(String serviceType) { // 停止发现服务 } @Override public void onServiceFound(NsdServiceInfo serviceInfo) { // 找到服务 } @Override public void onServiceLost(NsdServiceInfo serviceInfo) { // 服务丢失 } }; // 开始发现服务 nsdManager.discoverServices("_http._tcp", NsdManager.PROTOCOL_DNS_SD, discoveryListener); // 停止发现服务 nsdManager.stopServiceDiscovery(discoveryListener); ``` 在上面的示例代码中,我们首先通过调用`getSystemService()`方法获得了一个NsdManager实例,然后创建了一个NsdManager.DiscoveryListener对象来处理发现事件。接着,我们调用`discoverServices()`方法开始发现支持mDNS协议的服务,该方法传入了一个服务类型字符串和一个协议类型常量。最后,我们可以通过调用`stopServiceDiscovery()`方法停止发现服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值