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 框架已經幫我們做了內部封裝,我們不需要了解連接設備,數據發送等相關細節,只需要在其上定制應用層的通訊協議即可。當然這個協議是與設備上的協議配套的,一般都是私有協議。一方面保護設備,另一方面避免被惡意使用。
三、通訊協議
現在,做智能家居的越來越多,不可避免的要用到藍牙,但是,藍牙通訊都有自己的私有協議,這個協議在我的理解上看就是數據的安排方式。按照一定的格式去排序命令和數據,再加上校驗就是通訊協議的主要部分了。一般來說,這個協議分為兩部分,一部分是數據頭,一部分是數據題。數據頭有頭幀、命令、校驗等等東西,數據體就是具體的數據和數據校驗。當然有的可能沒有校驗,這需要與設備開發者協商好。
四、發送數據與接受數據
藍牙設備的某一特征的值被設備更新以后,如果啟動了notice 就會自動回調,在這里我發現回調的數據以20字節一次回調,不知是什么原因,希望有知道的道友能告知一二。
由於數據都是字節,操作起來很麻煩,不管是發送還是接受對一些不擅長使用C的朋友來說都是一種折磨。如何變得簡單呢?答案是結構體!是的就用結構體包裝數據,無論是發送數據還是接受數據都使用結構體去操作這樣就會省事很多。
我們可以按照通訊協議去構建我們的結構體數據結構,雖然有時候結構很多,沒關系你可以拆分數據結構,相同的數據結構就不用重復了。malloc加上memset(或者calloc)初始化結構體,再賦值數據,注意結構體中的數據順序需要與通訊協議相匹配。這樣,我們就能很簡單的創建發送數據了,然后我們將數據轉換成NSData,現在就是OC的領域了。具體如何去拆剪數據,拼接數據等等都去用NSData解決。
接受數據是同樣的道理,需要注意的是,我們需要把接受的數據直接裝在NSData里,長數據需要拼接的裝在NSMutableData內。然后用這些數據初始化接受數據的結構體,接着從結構體中校驗數據,如果數據正確,就可以使用一個模型去接收這些數據,然后之后如何使用這些數據就是OC的內容了。這里就很像我們常說的數據轉模型。
最后需要提示的是,一般外部設備可能是小端通訊,也可能采用大端通訊,采用結構體封裝后轉NSData后的超過兩個字節的數據都是小端的,所以大家要警惕這一點。
五、完結
沒有啦!想看代碼的小伙伴對不起了,由於項目還需要保密,工程管理很嚴格,所以就不貼了。不過我確實是這樣做的,一天就寫好了整個藍牙交互模塊。希望我的經驗對大家有用。