您的位置:首页 > 移动开发 > IOS开发

Zeroconf/Bonjour

2017-03-07 08:44 966 查看
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 苹果 ios