Bonjour 是什么?
bonjour其實(shí)來(lái)自法語(yǔ)蜓耻,是你好的意思。而Bonjour服務(wù)是蘋果公司發(fā)布的一個(gè)基于ZEROCONF工作組(IETF下屬小組)的工作,用于實(shí)現(xiàn)零配置網(wǎng)絡(luò)聯(lián)網(wǎng)
的解決方案复隆。Bonjour是基于IP層協(xié)議的,簡(jiǎn)單來(lái)說(shuō),就是一套解決方案,能夠不需要復(fù)雜的配置,即可互相發(fā)現(xiàn)彼此
的解決方案迫吐∮势ǎ可以用它來(lái)輕松探測(cè)并連接到相同網(wǎng)絡(luò)
中的其他設(shè)備整袁,并與別的智能硬件進(jìn)行交互或者其他操作。典型的Bonjour應(yīng)用有Remote佑吝、AirPrint等坐昙。(本段摘自Bonjour的使用-本地通信/智能交互)
如何實(shí)現(xiàn)
屬性申明 定義
let domain: String = "local."
let type: String = "_xiaopao._tcp"
let port:Int32 = 1234
var service: NetService!
var browser: NetServiceBrowser!
1、發(fā)布服務(wù)
@objc func publishService() {
// 發(fā)布服務(wù)
let name: String = "\(Int(Date().timeIntervalSince1970 * 1000))"
service = NetService(domain: domain, type: type, name: name, port: port)
service.delegate = self
service.schedule(in: RunLoop.current, forMode: .common)
// 發(fā)布的數(shù)據(jù)
let dict: [String: Data] = ["name": "xiaopao".data(using: .utf8) ?? Data()]
let data = NetService.data(fromTXTRecord: dict)
service.setTXTRecord(data)
// 開(kāi)始發(fā)布
service.publish()
}
1.1 發(fā)布服務(wù)代理
extension ViewController: NetServiceDelegate {
// 將要發(fā)布服務(wù)
func netServiceWillPublish(_ sender: NetService) {
print(#function)
}
// 發(fā)布失敗處理
func netService(_ sender: NetService, didNotPublish errorDict: [String : NSNumber]) {
print(#function)
}
// 發(fā)布服務(wù)完成
func netServiceDidPublish(_ sender: NetService) {
print(#function)
}
}
2芋忿、瀏覽服務(wù)
@objc func browseService() {
//瀏覽服務(wù)
browser = NetServiceBrowser()
browser.delegate = self
browser.schedule(in: RunLoop.current, forMode: .common)
browser.searchForServices(ofType: type, inDomain: domain)
}
2.1瀏覽服務(wù)代理
// 瀏覽服務(wù)代理
extension ViewController: NetServiceBrowserDelegate {
// 將要搜索服務(wù)
func netServiceBrowserWillSearch(_ browser: NetServiceBrowser) {
print(#function)
}
// 搜索不成功處理
func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber]) {
print(#function)
}
// 搜索到服務(wù)
func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) {
print(#function)
// 搜索服務(wù)開(kāi)始處理
//調(diào)用 NetServiceDelegate代理的 netServiceWillResolve炸客、netServiceDidResolveAddress等方法
self.service = service
service.delegate = self
service.schedule(in: RunLoop.current, forMode: .common)
service.resolve(withTimeout: 5)
}
// 服務(wù)已消失或者不可用
func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool) {
print(#function)
let name = service.name
let type = service.type
let domain = service.domain
print("移除服務(wù):····name:\(name),type:\(type),domain:\(domain)")
}
}
3、互相通信
// 發(fā)布服務(wù)代理
extension ViewController: NetServiceDelegate {
// 將要處理服務(wù)
func netServiceWillResolve(_ sender: NetService) {
print(#function)
}
// 處理服務(wù)
func netServiceDidResolveAddress(_ sender: NetService) {
guard let txtData = sender.txtRecordData() else { return }
print(#function)
let name = sender.name
let type = sender.type
let domain = sender.domain
let dict = resolveDictionary(fromTXTRecord: txtData)
print("處理服務(wù):····name:\(name),type:\(type),domain:\(domain),data\(dict)")
}
// 處理data數(shù)據(jù)轉(zhuǎn)成 字典[String:String]
func resolveDictionary(fromTXTRecord data: Data) -> [String: String] {
var dict = [String: String]()
var offset = 0
data.withUnsafeBytes({
while offset < $0.count {
let recordLength = Int($0[offset])
offset += 1
if recordLength > 0 {
let subBytes = $0[offset..<offset + recordLength]
let compoments = subBytes.split(separator: 61)
if compoments.count == 2 {
let key = String(bytes: Data(compoments[0]), encoding: .utf8) ?? ""
let value = String(bytes: Data(compoments[1]), encoding: .utf8) ?? ""
dict[key] = value
}
}
offset += recordLength
}
})
return dict
}
// 處理服務(wù)時(shí) 發(fā)生錯(cuò)誤
func netService(_ sender: NetService, didNotResolve errorDict: [String : NSNumber]) {
print(#function)
}
func netService(_ sender: NetService, didUpdateTXTRecord data: Data) {
print(#function)
}
}