文件目錄
整個(gè)文件主要包含四大塊澡罚,每一塊的功能都是獨(dú)立開的玩郊,不過當(dāng)中卻又設(shè)計(jì)不足的地方,希望各位能夠積極fork练慕,貢獻(xiàn)代碼惰匙!
QWSDiscovery
這個(gè)文件是功能的核心技掏,主要負(fù)責(zé)和系統(tǒng)的CoreBluetooth溝通,比如掃描設(shè)備项鬼,連接哑梳,斷開等操作。其中維護(hù)了一個(gè)設(shè)備列表绘盟,使用設(shè)備的uuid來唯一識別鸠真。在這個(gè)文件中,同時(shí)也定義了通知和錯(cuò)誤類型龄毡,方便處理與設(shè)備之間的信息交流吠卷。
QWSBleHelper
用心的讀者一定發(fā)現(xiàn),在我們的每一個(gè)viewController中沦零,只要與藍(lán)牙功能相關(guān)祭隔,那他一定維護(hù)了一個(gè)helper。在這里我稱這個(gè)頁面為監(jiān)護(hù)人蠢终,智能設(shè)備就像是一個(gè)孩子,很多孩子在幼兒園里茴她,我只關(guān)心我的孩子寻拂,而這個(gè)helper就像幼兒園老師,他負(fù)責(zé)告知我們孩子在校的情況丈牢,也可以讓我和孩子直接溝通祭钉。
helper中會維護(hù)兩個(gè)集合,一個(gè)是我關(guān)心的設(shè)備集合己沛,一個(gè)是即將斷開的設(shè)備集合慌核。并不是連接成功的設(shè)備就會加入到這個(gè)集合中,只有監(jiān)護(hù)人發(fā)出了與這個(gè)設(shè)備相關(guān)的請求(比如說申尼,連接垮卓,獲取信息等),這個(gè)時(shí)候师幕,hepler可以判定這個(gè)設(shè)備是被監(jiān)護(hù)人關(guān)心的粟按,從而這個(gè)設(shè)備有信息更新的時(shí)候,他會告知所有監(jiān)護(hù)這個(gè)設(shè)備的監(jiān)護(hù)人霹粥。
在這里之所以即將斷開的設(shè)備集合是為了灭将,在監(jiān)護(hù)人發(fā)出斷開請求之后,仍然能夠清晰的告知監(jiān)護(hù)人該設(shè)備的狀態(tài)信息后控,等到真正斷開連接之后通知到每一個(gè)監(jiān)護(hù)人庙曙。
QWSBleHandler
這個(gè)文件顧名思義,就是一些代理方法浩淘。設(shè)計(jì)中是將他加入到helper中捌朴,當(dāng)helper收到設(shè)備發(fā)來的信息時(shí)吴攒,通過代理將信息拆解并封裝模型通知到所有監(jiān)護(hù)人,寫在這里純粹只是為了看起來更加清晰男旗,分擔(dān)一下各個(gè)文件的代碼壓力舶斧。
QWSDevControlService
繼承NSObject,封裝的智能硬件設(shè)備的模型察皇。 對于智能硬件設(shè)備來講茴厉,單單一個(gè)CBPeripheral(CoreBluetooth里的對象)是遠(yuǎn)遠(yuǎn)不夠的。我們可能需要為他豐富更多的擴(kuò)展信息什荣,比如這個(gè)設(shè)備是否自動重連矾缓,是否需要斷開后連接,是否認(rèn)證稻爬,重連次數(shù)嗜闻,版本號等,當(dāng)然也可以繼承CBPeripheral桅锄,但這里我覺得將CBPeripheral作為其一個(gè)屬性會比較清晰琉雳。
這個(gè)對象會維護(hù)自己所有的讀寫操作,不管外界發(fā)來什么指令信息友瘤,他都能根據(jù)自己當(dāng)前的狀態(tài)翠肘,該報(bào)錯(cuò)報(bào)錯(cuò),該執(zhí)行執(zhí)行辫秧,并將結(jié)果反饋給每一個(gè)監(jiān)護(hù)人束倍。
圖解說明
1.智能設(shè)備與移動端的關(guān)系
Paste_Image.png
我們的Discovery在最頂層,不會參與與設(shè)備的直接交互盟戏,所有的收發(fā)數(shù)據(jù)都是經(jīng)過系統(tǒng)的框架實(shí)現(xiàn)绪妹。
2.監(jiān)護(hù)人與孩子的關(guān)系
Paste_Image.png
圖中的連線很多,可能很迷糊柿究,同一種顏色的連線代表數(shù)據(jù)交互邮旷,看helper里關(guān)心的設(shè)備,可以明顯理解蝇摸,只有關(guān)心這個(gè)設(shè)備才會收到這個(gè)設(shè)備的信息廊移。
每一個(gè)viewController維護(hù)一個(gè)helper,通過NSNotificationCenter廣播所有操作的結(jié)果探入,并告知每一個(gè)關(guān)心這個(gè)設(shè)備的viewController狡孔。
簡言之,就是監(jiān)護(hù)人接不接受這個(gè)通知蜂嗽,或者老師發(fā)不發(fā)送這個(gè)消息給監(jiān)護(hù)人苗膝。有一點(diǎn)需要明白的是,不管監(jiān)護(hù)人想不想收到這個(gè)設(shè)備的消息植旧,這個(gè)設(shè)備都是會廣播自己的信息的辱揭,只是helper會判斷這個(gè)孩子是不是你的~
以上就是這個(gè)Demo的設(shè)計(jì)思路离唐,當(dāng)然Demo中仍有很多不足,之所以不敢稱之為kit问窃,是因?yàn)樗_實(shí)沒有達(dá)到kit的封裝能力與效果亥鬓,畢竟這只是一個(gè)Demo,他只是簡單體現(xiàn)了一個(gè)設(shè)計(jì)思路域庇,并不能達(dá)到通用的效果嵌戈,因?yàn)樵谥悄苡布@一塊,每個(gè)產(chǎn)品的協(xié)議听皿,屬性都會有所差異熟呛,不可能做到通用的效果。希望和大家有更深入的交流與學(xué)習(xí)尉姨!
最后回顧一下上篇文章的地址:iOS-BLE藍(lán)牙開發(fā)持續(xù)更新
以及這個(gè)說了很久的Demo地址:一個(gè)iOS BLE藍(lán)牙學(xué)習(xí)的Demo
ps:
在這里也順便介紹一下近期看到的一篇關(guān)于BLE開發(fā)的kit(MPBluetoothKit iOS藍(lán)牙框架)庵朝,作者很詳細(xì)的將系統(tǒng)的CoreBluetooth的代理都用block實(shí)現(xiàn)了,看起來更加清晰與實(shí)用又厉,也希望各位能夠多多關(guān)注九府,共同學(xué)習(xí)。