【问题标题】:python zeroconf show IPv4 addressespython zeroconf 显示 IPv4 地址
【发布时间】:2018-07-30 12:04:01
【问题描述】:

我正在尝试弄清楚如何扫描网络以查找由 avahi 发布的设备。

#!/usr/bin/python3
from zeroconf import ServiceBrowser, Zeroconf
from time import sleep

class MyListener:
    def remove_service(self, zeroconf, type, name):
        print("Service % removed" % (name))

    def add_service(self, zeroconf, type, name):
        info = zeroconf.get_service_info(type, name)
        info = str(info)
        info = info.split(",")[6]
        print(info)


zeroconf = Zeroconf()
listener = MyListener()
browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener)
try:
        sleep(1)
finally:
        zeroconf.close()

它有效,但它没有给我任何 IPv4 地址。 输出(示例):

ServiceInfo(type='_http._tcp.local.', name='巴可 ptp-owsserver-2237._http._tcp.local.',地址=b'\n\x80Cj',端口=80, 权重=0,优先级=0,服务器='ptp-owsserver-2237.local.', properties={b'root': b'/'})

请有人告诉我如何获取 avahi 在我们网络中发布的设备的 IPv4 地址?

【问题讨论】:

    标签: python ipv4 zeroconf


    【解决方案1】:

    要获取 IP 地址,您可以使用类 ServiceInfo 的属性 address。它为您提供bytes 类型的IP 地址(在您的帖子中,它显示为b'\n\x80Cj'),因此您应该使用socket.inet_ntoa() 将其转换为更易读的格式。下面是我替换 MyListener.add_service() 方法中的 print() 指令以打印 IP 地址的代码:

    from zeroconf import ServiceBrowser, Zeroconf
    import socket
    
    class MyListener:
    
        def remove_service(self, zeroconf, type, name):
            print("Service %s removed" % (name,))
    
        def add_service(self, zeroconf, type, name):
            info = zeroconf.get_service_info(type, name)
            if info: 
                #print("Service %s added, service info: %s" % (name, info))
                print("Service %s added, IP address: %s" % (name, socket.inet_ntoa(info.address)))
    
    
    zeroconf = Zeroconf()
    listener = MyListener()
    browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener)
    try:
        input("Press enter to exit...\n\n")
    finally:
        zeroconf.close()
    

    【讨论】:

    • 在我的例子中 info 总是包含一个地址列表。所以我不得不将代码更改为socket.inet_ntoa(info.addresses[0]))。
    【解决方案2】:

    您也可以直接从 ServiceInfo 获取解析后的地址。

    print("Service %s added, IP address: %s" % (name, info.parsed_addresses()[0]))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-02-22
      • 1970-01-01
      • 2011-06-24
      • 2012-06-27
      • 2011-01-04
      • 2016-10-17
      • 2012-12-25
      • 2020-11-25
      相关资源
      最近更新 更多