python zeroconf显示IPv4地址

python zeroconf显示IPv4地址,python,ipv4,zeroconf,Python,Ipv4,Zeroconf,我正试图找出如何扫描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(sel

我正试图找出如何扫描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(类型=''http.''tcp.local',名称='Barco ptp-owsserver-2237._http._tcp.local.',地址=b'\n\x80Cj',端口=80, 权重=0,优先级=0,服务器='ptp-owsserver-2237.local', 属性={b'root':b'/'})


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

要获取IP地址,您可以使用class
ServiceInfo
的属性
address
。它以
字节
类型提供IP地址(在您的帖子中,它显示为
b'\n\x80Cj'
),因此您应该使用
socket.inet\u ntoa()
将其转换为更可读的格式。下面是我在
MyListener.add\u 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()

您还可以直接从ServiceInfo获取解析的地址

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

在我的案例中,“信息”始终包含地址列表。因此,我不得不将代码更改为
socket.inet\u ntoa(info.addresses[0])