因?yàn)樵趇OS中 牺弄,不同設(shè)備或應(yīng)用獲取到的UUID都是不一致的岛马,但是在實(shí)際藍(lán)牙開發(fā)過程中索烹,會(huì)遇到掃描二維碼連接藍(lán)牙這樣的需求缀辩,但是二維碼中保存的數(shù)據(jù)是固定值臭埋,那么我們需要保證通過二維碼中的固定值找到對(duì)應(yīng)的設(shè)備連接,必然就不能通過掃描得到的UUID進(jìn)行區(qū)分臀玄。
在掃描到的藍(lán)牙serviceData數(shù)據(jù)中瓢阴,獲取1827中的Data
然后截取Data中的10到15位進(jìn)行逆轉(zhuǎn)
然后再對(duì)逆轉(zhuǎn)的數(shù)據(jù)進(jìn)行16進(jìn)制編碼,就可以得到一個(gè)固定的編碼
具體代碼如下:
因?yàn)樾枰獙?duì)Data進(jìn)行16進(jìn)制編碼镐牺,所以我們可以先對(duì)Data添加一個(gè)延展炫掐,方便進(jìn)行編碼
extension Data {
? ? struct HexEncodingOptions: OptionSet {
? ? ? ? letrawValue:Int
? ? ? ? staticletupperCase=HexEncodingOptions(rawValue:1<<0)
? ? }
? ? funchexEncodedString(options:HexEncodingOptions= []) ->String{
? ? ? ? letformat = options.contains(.upperCase) ?"%02hhX":"%02hhx"
? ? ? ? returnmap{String(format: format, $0) }.joined()
? ? }
}
然后在掃描到的advertisementData中調(diào)用
guard let serviceData = advertisementData[CBAdvertisementDataServiceDataKey] as? NSDictionary else {
? ? ? ? ? ? return
}
let data = serviceData[CBUUID(string:"1827")]as?Data
let data1 =Data((data?.subdata(in:10..<16).reversed())!)
let str =?data1.hexEncodedString()
然后str字符串就是我們拿到的掃描到設(shè)備的唯一編碼,在不同的手機(jī)上獲取到的編碼也是一樣的睬涧,就可以解決不同手機(jī)掃描到的藍(lán)牙UUID不一致的問題
我們就可以將這個(gè)編碼生成對(duì)應(yīng)的二維碼募胃,然后使用手機(jī)掃描二維碼時(shí),讀取到這個(gè)編碼從掃描到的藍(lán)牙設(shè)備中找到對(duì)應(yīng)的藍(lán)牙設(shè)備進(jìn)行連接
代碼貼圖: