標籤:
iOS藍芽極速開發一、背景
最近一段時間,由於公司一套藍牙裝置更新,通訊協議上需要修改,功能也要完善,因此需要更新app。坑爹的是,這款app開發到現在已有一年時間,出了源碼和app啥都沒有。無奈,上級交與的任務難也要做。花了大概三天時間熟悉整個項目,由於app的主要功能在於與公司的配套裝置進行互動,所以,介面上的東西我就一帶而過,主要瞭解藍芽互動的內容。
經過仔細瞭解,我發現這款app的開發人員也是極品,不知道是不瞭解C的基本知識,還是不會用,整個藍芽互動的資料全部使用字串操作,這對一個開發人員來說真心不應該。有的資料頭竟然還是寫死在字串裡!沒辦法,重構!所以就有了這篇文章。
二、藍芽
藍芽技術發展到現在的4.0,也就是常說的低功耗藍芽。藍芽4.0是2012年最新藍芽版本,是3.0的升級版本;較3.0版本更省電、成本低、3毫秒低延遲、超長有效串連距離、AES-128加密等;通常用在藍芽耳機、藍芽音箱等裝置上。
以上介紹來源於百度,大家相對藍芽具體瞭解,請自行google,在這裡我主要介紹我本次重構的心得。
藍芽是居於socket的長連結,遵循TCP/IP協議,iOS-CoreBluetooth 架構已經幫我們做了內部封裝,我們不需要瞭解串連裝置,資料發送等相關細節,只需要在其上定製應用程式層的通訊協議即可。當然這個協議是與裝置上的協議配套的,一般都是私人協議。一方面保護裝置,另一方面避免被惡意使用。
三、通訊協議
現在,做智能家居的越來越多,不可避免的要用到藍芽,但是,藍芽通訊都有自己的私人協議,這個協議在我的理解上看就是資料的安排方式。按照一定的格式去排序命令和資料,再加上校正就是通訊協議的主要部分了。一般來說,這個協議分為兩部分,一部分是資料頭,一部分是資料題。資料頭有頭幀、命令、校正等等東西,資料體就是具體的資料和資料校正。當然有的可能沒有校正,這需要與裝置開發人員協商好。
四、發送資料與接受資料
藍芽資料包只能包含20個位元組的資料,再多了就會分包,這點需要注意。許多時候我們需要發送給裝置很多的資料,這就需要分包發送,這是我們需要警惕的問題。接受的時候也一樣,資料長度超過20個位元組就要等待下一次讀取,拼接上資料,這樣擷取的資料才完整。當然,還需要校正資料是否正確,避免接受到不正確的資料幹擾app。
由於資料都是位元組,操作起來很麻煩,不管是發送還是接受對一些不擅長使用C的朋友來說都是一種折磨。如何變得簡單呢?答案是結構體!是的就用結構體封裝資料,無論是發送資料還是接受資料都使用結構體去操作這樣就會省事很多。
我們可以按照通訊協議去構建我們的結構體資料結構,雖然有時候結構很多,沒關係你可以拆分資料結構,相同的資料結構就不用重複了。malloc加上memset(或者calloc)初始化結構體,再賦值資料,注意結構體中的資料順序需要與通訊協議相匹配。這樣,我們就能很簡單的建立發送資料了,然後我們將資料轉換成NSData,現在就是OC的領域了。具體如何去拆剪資料,拼接資料等等都去用NSData解決。
接受資料是同樣的道理,需要注意的是,我們需要把接受的資料直接裝在NSData裡,長資料需要拼接的裝在NSMutableData內。然後用這些資料初始化接受資料的結構體,接著從結構體中校正資料,如果資料正確,就可以使用一個模型去接收這些資料,然後之後如何使用這些資料就是OC的內容了。這裡就很像我們常說的資料轉模型。
最後需要提示的是,一般外部裝置可能是小端通訊,也可能採用大端通訊,採用結構體封裝後轉NSData後的超過兩個位元組的資料都是小端的,所以大家要警惕這一點。
五、完結
沒有啦!想看代碼的小夥伴對不起了,由於項目還需要保密,工程管理很嚴格,所以就不貼了。不過我確實是這樣做的,一天就寫好了整個藍芽互動模組。希望我的經驗對大家有用。
關於iOS藍芽開發二三事