python zeroconf show IPv4 addresses
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地址吗?
问题:在给定的代码中,为什么无法显示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, Zeroconf
和import 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()