iOS-使用bonjour完成與智能硬件交互的功能

雖然很久之前就有轉(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)用就好了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容