Mar*_*son 14 python bonjour zeroconf
我有一些我想用zeroconf看到的应用程序.
Python或sh是首选.特定于操作系统的建议欢迎使用Linux和OS X.
或者你可以使用bash:
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]
Run Code Online (Sandbox Code Playgroud)
这在OS X上默认有效.对于其他*nix,请参阅avahi-publish手册页(您可能需要通过首选软件包管理器安装).
pybonjour似乎没有积极维护.我正在使用python-zeroconf.
pip install zeroconf
Run Code Online (Sandbox Code Playgroud)
以下是我用来向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()
Run Code Online (Sandbox Code Playgroud)
编辑 2022-02-27:我不再 100% 确定我写的内容实际上是正确的。mdns我最近尝试了它,虽然它运行了,但我无法通过查询取回信息;表明 mDNS 可能比预期更复杂......待续......如果这对您有用/不适用,请发表评论。
尽管这个答案为您指明了正确的方向,但似乎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);
Run Code Online (Sandbox Code Playgroud)
请注意,对于 来说,超出的任何内容PORT都是可选的ServiceInfo()。
您可以同时运行多个此类程序;它们都会毫无问题地绑定到同一个 UDP 端口。
| 归档时间: |
|
| 查看次数: |
9219 次 |
| 最近记录: |