Zeroconf/Bonjour

来源:互联网 发布:调节阀口径计算软件 编辑:程序博客网 时间:2024/05/22 05:19
Zeroconf苹果设备中也叫Bonjour是一种自发现协议,可以自动搜索发现同一局域网中的设备及服务。
使用前需要安装或者移植avahi-daemon,avahi-daemon安装运行后,就可以进行serveice的publish了,命令如下:
avahi-publish -s identifier type  port name
identifier即标识符以后可以用来对终止服务或者重新发起,type需要以._tcp.local.结尾。port为绑定的端口号,最后一个name一般设为主机名也就是最后设备搜索到的名字
再起一个avahi-browse -t 就可以发现上面的发起的服务了,在苹果设备中不需要avahi-browse就可以直接发现了。
要是不要不想单独起一个avahi-daemon的话,可以直接python中的包实现
from zeroconf import ServiceInfo, Zeroconfclass ZeroconfTest(service.Service, object):    service_name = 'Zeroconf Test'    Port = None    Info = None    def __init__(self, factory, portCallback):        factory.protocol = BroadcastServerProtocol        self.factory = factory        self.portCallback = portCallback        self.zeroconf = Zeroconf()    def StartService(self):        self.Port = reactor.listenTCP(0, self.factory)        port = self.Port.getHost().port        fqdn = socket.gethostname()        ip_addr = socket.gethostbyname(fqdn)        hostname = fqdn.split('.')[0]        wsDesc = {'service': 'myservice', 'version': '1.0.0'}        self.Info = ServiceInfo('_myservice._tcp.local.',                                  hostname + ' ' + self.service_name + '_myservice._tcp.local.',                                  socket.inet_aton(ip_addr), port, 0, 0,                                  wsDesc, hostname + '.local.')        self.zeroconf.register_service(self.Info)        self.portCallback(port)        return super(ZeroconfTest, self).StartService()    def stopService(self):        self.zeroconf.unregister_service(self.Info)        self.Port.stopListening()        return super(ZeroconfTest , self).stopService()

C++上的实现也与此相类似,也有很多的实现方式,我司一款airplay无线投屏所参考的是XBMC的https://github.com/xbmc/xbmc/blob/master/xbmc/network/Zeroconf.h


0 0