Zeroconf/Bonjour

 技术交流有兴趣请加:
 音视频技术交流群:308601278
 无线投屏技术交流群:582349005
 
 详情可访问我司官网 必捷网络|因必捷而简单
 商务合作请至邮件[email protected]

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, Zeroconf

class 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

 

 

你可能感兴趣的:(AirPlay)