2009-12-16 10 views
12

J'ai quelques applications que j'aimerais rendre visibles avec zeroconf.Manière la plus simple de publier sur Zeroconf/Bonjour?

  1. Existe-t-il un moyen facile à utiliser pour les scripts?
  2. Y at-il quelque chose qui doit être fait par mon administrateur réseau pour permettre cela?

Python ou sh serait préférable. Des suggestions spécifiques au système d'exploitation sont les bienvenues pour Linux et OS X.

Répondre

9

Ou vous pouvez simplement utiliser bash:

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

Cela fonctionne par défaut sur OS X. Pour les autres nix *, reportez-vous à la page de manuel avahi-publish (que vous devrez peut-être installer via votre gestionnaire de paquets préféré) .

+0

La "solution de contournement facile" n'est plus disponible – bjoernz

+0

@bjoernz J'ai mis à jour ma réponse pour refléter le lien. – Zack

8

Je recommanderais pybonjour.

+2

Ça a l'air bien. Notez qu'il actuellement [ne supporte pas Python 3.x - voir le numéro 5] (http://code.google.com/p/pybonjour/issues/detail?id=5). –

+1

Dernière version 2009 ... –

7

pybonjour ne semble pas être activement maintenu. J'utilise python-zeroconf.

pip install zeroconf 

Voici un extrait d'un script que j'utilise pour annoncer un Twisted-Autobahn WebSocket à un appareil 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()