技术交流有兴趣请加:
音视频技术交流群:308601278
无线投屏技术交流群:582349005
详情可访问我司官网 必捷网络|因必捷而简单
商务合作请至邮件marketing@bijienetworks.com
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