雖然很久之前就有轉(zhuǎn)到簡(jiǎn)書(shū)的想法,但在拖延癥的影響下一直是處于要命的狀態(tài),借著這次離職了終于可以好好寫(xiě)一下自己的工作上的一些事了,畢竟只是一介普通的iOS程序員,基礎(chǔ)知識(shí)已經(jīng)有太多人寫(xiě)過(guò)了,高深的我也不敢誤人子弟,所以,只能將自己工作中遇到的一些冷門(mén)經(jīng)驗(yàn)寫(xiě)出來(lái),做一點(diǎn)微薄的工作,希望大家?guī)е涣鞯男膽B(tài)來(lái)看,不要全信,我有錯(cuò)誤的地方請(qǐng)務(wù)必指出。
關(guān)于bonjour的基礎(chǔ)知識(shí)百度谷歌要多少有多少,在此便不多做說(shuō)明,簡(jiǎn)而言之,你可以通過(guò)它發(fā)布服務(wù)以及檢索服務(wù),并在客戶(hù)端獲取服務(wù)端的信息。
上一份工作時(shí)為了達(dá)到與智能硬件交互,完成在給硬件發(fā)送手機(jī)當(dāng)前所處的wifi的賬號(hào)密碼的同時(shí)將硬件的mac地址及其他數(shù)據(jù)保存下來(lái)這樣的功能時(shí)使用了bonjour,不得不說(shuō),比起之前用的廣播手法,bonjour的效率高上不少,至少,修改后就沒(méi)多少催命電話(huà)了。
首先,你得明白,除非你自家智能硬件的wifi模塊是由你們自家制造的,否則的話(huà)wifi模塊的制造廠商需要提供一份框架以讓發(fā)布服務(wù)的功能在他們的框架下完成,所以我的任務(wù)大部分就是自寫(xiě)一個(gè)檢索服務(wù)的模塊來(lái)自動(dòng)獲得我需要的信息。
//如果wifi模塊制造商沒(méi)有提供框架,那我也沒(méi)辦法了| ω?′)
//這塊代碼是將wifi賬號(hào)密碼保存并發(fā)送給智能硬件,大體上建議做封裝,不過(guò)DEMO就隨意啦
if (!self.easylink) {
self.easylink = [[EASYLINK alloc]initWithDelegate:self];
}
NSMutableDictionary *wlanConfig = [NSMutableDictionary dictionaryWithCapacity:20];
NSData *ssidData = [self.tfdSSID.text dataUsingEncoding:NSUTF8StringEncoding];
[wlanConfig setObject:ssidData forKey:KEY_SSID];
[wlanConfig setObject:self.tfdPWD.text forKey:KEY_PASSWORD];
[wlanConfig setObject:[NSNumber numberWithBool:YES] forKey:KEY_DHCP];
[self.easylink prepareEasyLink_withFTC:wlanConfig info:nil mode:EASYLINK_V2_PLUS];
[self.easylink transmitSettings];
好了,我們已經(jīng)注冊(cè)了服務(wù),接下來(lái)就是進(jìn)行檢索了,需要注意的是,檢索服務(wù)涉及到一些蘋(píng)果認(rèn)為頗為隱私的數(shù)據(jù),所以雖然沒(méi)有像UDID一樣被禁止,但也是限制了獲取信息的手法,似乎只能通過(guò)代理回調(diào)的樣子。
//定義NSNetService,NSNetServiceBrowser兩個(gè)變量以及添加代理
@property(strong,nonatomic)NSNetServiceBrowser *brower;
@property(strong,nonatomic)NSNetService *service;
NSNetServiceDelegate,NSNetServiceBrowserDelegate
那么來(lái)檢索吧
/*
需要注意的是,并不是進(jìn)行檢索就能立即檢索出來(lái),發(fā)布服務(wù)可能會(huì)有稍許延遲,所以,如果在檢索未能
成功獲取到想要的數(shù)據(jù)時(shí)當(dāng)然是再一次檢索,但在此之前,你必須停止上一次的檢索,它可不是善解人意的
小寶貝。
*/
[self.brower stop];
/*
如果你的模塊商沒(méi)有告訴你發(fā)布的服務(wù)名的話(huà)那么最好的解決方法是進(jìn)入手機(jī)上的App Store以
bonjour為關(guān)鍵詞搜索軟件‘Discovery - Bonjour Brower’,然后用它就好了。
*/
[self.brower searchForServicesOfType:@"_easylink._tcp" inDomain:@"local."];
如你所見(jiàn),蘋(píng)果只提供了代理讓我們來(lái)獲取信息,不過(guò),總比沒(méi)有好吧。
//字面意思,當(dāng)檢索到指定名的服務(wù)時(shí)就會(huì)調(diào)用的代理方法,如果你如我一樣想獲得更細(xì)致的數(shù)據(jù)就必須通過(guò)它來(lái)做下一步動(dòng)作
-(void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing{}
//需要解釋么
-(void)netService:(NSNetService *)sender didNotResolve:(NSDictionary<NSString *,NSNumber *> *)errorDict{}
//如果你想要獲得更細(xì)致的數(shù)據(jù),那么,它是你的選擇,不過(guò),你得先通過(guò)它丈母娘(第一個(gè)代理方法)的審視。
-(void)netServiceDidResolveAddress:(NSNetService *)sender{}
-(void)netServiceBrowser:(NSNetServiceBrowser *)browser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing{
//為service設(shè)置代理,無(wú)法直接在此代理中得到地址,似乎必須通過(guò)代理回調(diào)
NSString *str = [service.name lowercaseString];
NSRange range = [str rangeOfString:@"#"];
NSString *maccode = [str substringWithRange:NSMakeRange(range.location+3, 4)];
echo(@"%@",maccode);
if ([maccode isEqualToString:[self.tfdCode.text lowercaseString]] ) {
//可能有人問(wèn)我,為何要這么做,因?yàn)闅⑶У兜奶O(píng)果同一時(shí)間里只給你提供一個(gè)寶貝的詳細(xì)數(shù)據(jù),如果你想要對(duì)每個(gè)service寶貝都添加代理,那你恐怕就得失望了。
self.service = service;
self.service.delegate = self;
//使用它,在下一個(gè)代理回調(diào)內(nèi)得到數(shù)據(jù)
[self.service resolveWithTimeout:1.0]; }
}
來(lái)吧,勝利的果實(shí)就在眼前.
-(void)netServiceDidResolveAddress:(NSNetService *)sender{
NSData* data = [sender TXTRecordData];
NSDictionary* dict = [NSNetService dictionaryFromTXTRecordData:data];
NSData *str = [dict objectForKey:@"MAC"];
NSString *oldmacadress = [[NSString alloc]initWithData:str encoding:NSUTF8StringEncoding];
//如果你如我一樣需要硬件的mac地址,那么切記字典中的數(shù)據(jù)并不是立馬就能用的,必須再做處理。
NSString *macadress = [oldmacadress stringByReplacingOccurrencesOfString:@":" withString:@""];
if (macadress.length < 8) {
return;
}
if (self.timer) {
[self.timer invalidate];
}
_Mac = macadress;
//既然找到了心儀的對(duì)象,記得收收心,把該停的都停掉。
[self stopToLink];
}
好了,我得到了mac地址,我的任務(wù)完成了,把它保存在本地?cái)?shù)據(jù)庫(kù),等到該用的時(shí)候拿出來(lái)用就好了。