python 通过Zeroconf/Bonjour发布的最简单方法?

2exbekwf  于 2023-02-28  发布在  Python
关注(0)|答案(5)|浏览(240)

我有一些应用程序,我想使可见的zeroconf。
1.有没有一种简单的脚本化方法来实现这一点?
1.我的网络管理员是否需要执行任何操作才能启用此功能?
Python或sh是首选。欢迎为Linux和OSX提供特定于操作系统的建议。

nhjlsmyf

nhjlsmyf2#

pybonjour似乎没有得到积极的维护,我使用的是python-zeroconf

pip install zeroconf

以下是我用来向iOS设备发布Twisted-Autobahn WebSocket的脚本摘录:

from zeroconf import ServiceInfo, Zeroconf

class WebSocketManager(service.Service, object):
    ws_service_name = 'Verasonics WebSocket'
    wsPort = None
    wsInfo = None

    def __init__(self, factory, portCallback):
        factory.protocol = BroadcastServerProtocol
        self.factory = factory
        self.portCallback = portCallback
        self.zeroconf = Zeroconf()

    def privilegedStartService(self):
        self.wsPort = reactor.listenTCP(0, self.factory)
        port = self.wsPort.getHost().port

        fqdn = socket.gethostname()
        ip_addr = socket.gethostbyname(fqdn)
        hostname = fqdn.split('.')[0]

        wsDesc = {'service': 'Verasonics Frame', 'version': '1.0.0'}
        self.wsInfo = ServiceInfo('_verasonics-ws._tcp.local.',
                                  hostname + ' ' + self.ws_service_name + '._verasonics-ws._tcp.local.',
                                  socket.inet_aton(ip_addr), port, 0, 0,
                                  wsDesc, hostname + '.local.')
        self.zeroconf.register_service(self.wsInfo)
        self.portCallback(port)

        return super(WebSocketManager, self).privilegedStartService()

    def stopService(self):
        self.zeroconf.unregister_service(self.wsInfo)

        self.wsPort.stopListening()
        return super(WebSocketManager , self).stopService()
lrpiutwd

lrpiutwd3#

或者您可以直接使用bash:

dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]

这在OS X上默认工作。对于其他 * nix,请参阅avahi-publish手册页(您可能需要通过首选的包管理器安装)。

eivgtgni

eivgtgni5#

编辑日期:2022年2月27日:我不能100%确定我写的内容是正确的,我最近试过了,虽然它运行了,但我不能通过mdns查询得到信息;这表明mDNS可能比预期的更复杂.....未完待续....如果这对您有效/无效,请留下评论。
尽管this answer为您指出了正确的方向,但似乎python-zeroconf(0.39.4)做了一些更改,使上面的示例不再工作(对我来说)。
另外,我认为一个更简单、更独立的答案会更好,所以这里有:

from zeroconf import ServiceInfo, Zeroconf

PORT=8080

zeroconf = Zeroconf()
wsInfo = ServiceInfo('_http._tcp.local.',
                     "myhost._http._tcp.local.",
                     PORT, 0, 0, {"random_key": "1234", "answer": "42"})
zeroconf.register_service(wsInfo)

import time
time.sleep(1000);

请注意,对于ServiceInfo()PORT以外的任何内容都是可选的。
您可以同时运行多个这样的程序;它们将毫无问题地全部绑定到相同的UDP端口。

相关问题