2009-12-16 2 views
12

У меня есть некоторые приложения, которые я хотел бы сделать видимыми с помощью zeroconf.Простейший способ опубликовать более Zeroconf/Bonjour?

  1. Есть ли простой способ для написания сценариев?
  2. Есть ли что-нибудь, что должно было бы сделать мой сетевой администратор, чтобы включить это?

Python или sh предпочтительнее. Предложения по конкретным ОС приветствуются для Linux и OS X.

ответ

9

Или вы можете просто использовать Баш:

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

Это работает по умолчанию на OS X. Для других * nixes, обратитесь к странице avahi-publish человека (который вы, возможно, потребуется установить с помощью предпочтительного менеджера пакетов) ,

+0

«Легкий обходной путь» больше не доступен – bjoernz

+0

@bjoernz Я обновил свой ответ, чтобы отразить ссылку. – Zack

8

Я бы порекомендовал pybonjour.

+2

Звучит неплохо. Обратите внимание, что в настоящее время [не поддерживает Python 3.x - см. Проблему № 5] (http://code.google.com/p/pybonjour/issues/detail?id=5). –

+1

Последний выпуск 2009 ... –

7

pybonjour, похоже, активно не поддерживается. Я использую python-zeroconf.

pip install zeroconf 

Вот отрывок из сценария я использую, чтобы объявить 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() 
Смежные вопросы