Самый простой способ опубликовать Zeroconf/Bonjour?
У меня есть некоторые приложения, которые я хотел бы сделать видимыми с помощью zeroconf.
- Есть ли простой способ для сценариев?
- Есть ли что-нибудь, что должен сделать мой сетевой администратор, чтобы включить это?
Python или sh предпочтительнее. Рекомендации по использованию ОС приветствуются для Linux и OS X.
Ответы
Ответ 1
Или вы можете просто использовать bash:
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]
Это работает по умолчанию для OS X. Для других * nixes см. справочную страницу avahi-publish (которая вам может понадобиться установите с помощью вашего предпочтительного менеджера пакетов).
Ответ 2
Я бы рекомендовал pybonjour.
Ответ 3
pybonjour, похоже, активно не поддерживается. Я использую python-zeroconf.
pip install zeroconf
Вот выдержка из script, которую я использую для объявления Twisted-Autobahn WebSocket на устройстве iOS:
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()
Ответ 4
Через привязки Avahi Python это очень просто.