2009-12-16 205 views
12

我有一些应用程序,我想使用zeroconf显示。最简单的方式发布Zeroconf/Bonjour?

  1. 有没有简单的脚本方式来做到这一点?
  2. 有什么需要通过我的网络管理员来完成,以使这个?

Python或SH将preferrable。操作系统特定的建议欢迎Linux和OS X.

回答

9

或者,你可以使用bash:

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

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

+0

“简单解决方法”不再可用 – bjoernz 2017-02-21 09:51:30

+0

@bjoernz我已更新我的答案以反映linkrot。 – Zack 2017-02-24 20:40:49

8

我建议pybonjour

+2

听起来不错。请注意,它目前[不支持Python 3.x - 请参阅问题#5](http://code.google.com/p/pybonjour/issues/detail?id=5)。 – 2012-11-29 01:11:12

+1

上次发布2009 ... – 2017-03-14 06:18:45

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()