69911


iOSのIPアドレス情報を、PC上の[Python-
Zeroconf](https://pypi.org/project/zeroconf/)で受け取りたいと考えています。

Swiftでの送信に関しては、以下のコードを使用しています。  
<https://github.com/jameszaghini/bonjour-demo-osx-to-ios>

以下のように、Python-Zeroconfのサンプルコードを走らせると、Swiftと連携が出来ているようで、情報がprintされます。

[code]

    from zeroconf import ServiceBrowser, Zeroconf
    
    
    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)
            print("Service %s added, service info: %s" % (name, info))
    
    
    zeroconf = Zeroconf()
    listener = MyListener()
    for i in range(10):
        browser = ServiceBrowser(zeroconf, "_probonjore._tcp.local.", listener)
    try:
        input("Press enter to exit...\n\n")
    finally:
        zeroconf.close()
    
[/code]

printされる文字列は以下のようになっております。  
iOS端末のIPアドレス情報と空きポートの情報などが表示されます。

[code]

    Service iPhone._probonjore._tcp.local. added, service info: ServiceInfo(type='_probonjore._tcp.local.', name='iPhone._probonjore._tcp.local.', addresses=[b'\xc0\xa8\x01\x03'], port=49595, weight=0, priority=0, server='iPhone.local.', properties={})
    
[/code]

この文字列の中から、adressesの情報のみを抜き取ろうと思い、以下のように記述してみました。

[code]

    from zeroconf import ServiceBrowser, Zeroconf
    
    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)
            info_ip = info.split(',').replace(' ', '')
            print(info_ip)
    
    
    zeroconf = Zeroconf()
    listener = MyListener()
    browser = ServiceBrowser(zeroconf, "_probonjore._tcp.local.", listener)
    try:
        input("Press enter to exit...\n\n")
    finally:
        zeroconf.close()
    
[/code]

すると単純な文字列ではないようで、以下のようなエラーが出ます。

[code]

    AttributeError: 'ServiceInfo' object has no attribute 'split'
    
[/code]

文字列ではないServiceInfo型(?)からadressesだけ抜き出すにはどうしたら良いのでしょうか？


CC BY-SA 4.0
2020-08-27T02:38:23.757
69904
2020-08-27T13:29:54.827
34471
question
python network
Python-Zeroconfで受け取った情報からIPアドレスのみ抽出したい


コメントで解決した分を回答にします。

こちらの記事で同様の話題を取り扱っているので参考になるでしょう。  
[python zeroconf show IPv4
addresses](https://stackoverflow.com/q/51593574/9014308)  
回答の中の以下の部分ですね。

>
[code]

>     print("Service %s added, IP address: %s" % (name,
> socket.inet_ntoa(info.address)))
>  
[/code]

ただし上記記事で通信しているのが`avahi`で、質問記事の方は`bonjour`なので多少違いがあるようで、そのままでは使えなかったとのこと。

質問記事中に情報全体を文字列化した結果が表示されていて、その中にIPアドレスらしき属性名の(`address`の後ろに`es`を付けた)`addresses`があったので、それにに変えることで取り出すことが出来たということです。


CC BY-SA 4.0
2020-08-27T05:22:24.380
69911
2020-08-27T13:29:54.827
2020-08-27T13:29:54.827
26370
26370
69904
answer