python zeroconf show IPv4 addresses

7 浏览
0 Comments

python zeroconf show IPv4 addresses

我正试图找出如何扫描网络上由avahi发布的设备。\n

#!/usr/bin/python3
from zeroconf import ServiceBrowser, Zeroconf
from time import sleep
class MyListener:
    def remove_service(self, zeroconf, type, name):
        print("服务 %s 已移除" % (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()

\n这个代码可以运行,但是它没有给我任何IPv4地址。\n输出示例:\n

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

\n请问有人可以告诉我如何获取我们网络中由avahi发布的设备的IPv4地址吗?

0
0 Comments

问题的出现原因是在使用Python zeroconf时,想要显示IPv4地址,但没有正确地实现该功能。

解决方法是使用ServiceInfo对象直接获取解析后的地址,并打印出来。

以下是解决问题的代码示例:

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

通过使用ServiceInfo对象的parsed_addresses()方法,我们可以直接获取解析后的地址列表,并通过索引[0]获取第一个IPv4地址。

这样,我们就可以正确地显示出IPv4地址了。

0
0 Comments

问题:在给定的代码中,为什么无法显示IPv4地址?

原因:代码中使用了address属性来获取IP地址,但它返回的是以字节(bytes)形式表示的IP地址(如b'\n\x80Cj'),需要使用socket.inet_ntoa()函数将其转换为更可读的格式。在给定的例子中,info.address实际上是一个列表info.addresses,所以需要将代码更改为socket.inet_ntoa(info.addresses[0]))

解决方法:

1. 导入必要的模块:from zeroconf import ServiceBrowser, Zeroconfimport socket

2. 创建一个名为MyListener的类,其中包含remove_service()add_service()方法。

3. 在add_service()方法中,使用zeroconf.get_service_info()获取服务的信息。

4. 使用socket.inet_ntoa()info.addresses[0]转换为可读的IP地址。

5. 创建Zeroconf实例zeroconf

6. 创建MyListener实例listener

7. 创建ServiceBrowser实例browser,并传入zeroconf和服务类型"_http._tcp.local."以及listener

8. 最后,使用input()函数让程序暂停,直到用户按下回车键,然后关闭zeroconf连接。

完整代码如下:

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, IP address: %s" % (name, socket.inet_ntoa(info.addresses[0])))
zeroconf = Zeroconf()
listener = MyListener()
browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener)
try:
    input("Press enter to exit...\n\n")
finally:
    zeroconf.close()

0