pythonipv4zeroconf

python zeroconf show IPv4 addresses


I'm trying to figure out how to scan the network for devices which are published by 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()

It works, but it doesn't give me ANY IPv4 address. Output(example):

ServiceInfo(type='_http._tcp.local.', name='Barco ptp-owsserver-2237._http._tcp.local.', address=b'\n\x80Cj', port=80, weight=0, priority=0, server='ptp-owsserver-2237.local.', properties={b'root': b'/'})

Could PLEASE someone tell me how to get the IPv4 Addresses of the devices which are published by avahi in our network?


Solution

  • To get the IP addresses, you can use the attribute address of class ServiceInfo. It gives you the IP address in bytes type (in your post, it is displayed as b'\n\x80Cj'), so that you should use socket.inet_ntoa() to convert it to a more readable format. Here is the code where I replaced the print() instruction in the MyListener.add_service() method in order to print the IP address:

    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()