CoreBluetooth 藍芽
藍芽的連線做一個學習的總整理
官方文件連結:https://developer.apple.com/documentation/corebluetooth
藍芽的傳輸主要分為設備服務,還有設備服務特徵,每個設備有很多的服務,每個服務也有可以能有很多特徵,其中特徵又有很多不同的屬性,屬性可能分為可讀,可寫,廣播等等..,非常多不一樣的
首先介紹nRF Connect這個App,在App Store可以下載,這是一個測試藍芽的App,本篇的測試軟體也是類似它的功能去實現的
從官方文件就可以看出,框架對這些藍芽的特性準備了各種方法去實行各種需求,這邊主要介紹手機端可以執行的方法,藍芽主要分成中央處理端,和外部設備,手機通常是中央處理端,接收各種外部設備,例如:耳機,滑鼠,等等都算外部設備。
在手機這邊必須先 import CoreBluetooth ,才能遵從藍芽的協議,手機這邊分別要遵從:CBCentralManagerDelegate ,還有CBPeripheralDelegate
官方文件:https://developer.apple.com/documentation/corebluetooth/cbcentralmanagerdelegate
官方文件:https://developer.apple.com/documentation/corebluetooth/cbperipheraldelegate
一開始要注意
如果要上架,info.plist必須加入這個,而且key一定要給,不然上架上傳會失敗,但是沒有上架就還不用
照字面上就知道第一個CBCentral Manager 就是中央處理器的管理協議,第二個是當連線到外部設備的執行協議,大致上流程是從中央開啟掃描,到連結外部設備取得服務,特徵點傳送廣播,來完成整個流程
首先我在一開始執行,當這個物件實做出來時,手機就開始藍芽偵測
在以前的版本藍芽設備,會如果沒開啟,程式可以通過權限幫你開啟,但是在ios 11以後已經拿掉了,我們只能在這邊寫一些警告來提醒使用者要記得開啟藍芽,不能再幫使用者自動開啟藍芽了,所以這邊的方法裡可以把各種提示寫在裡面提醒使用者目前藍芽的狀態,最後一行就是開始掃描附近的藍芽外部設備了,當然藍芽狀態必須是開始才能執行成功。
藍芽掃描只要掃到設備就會執行這裡,所以這裡可以順便執行,跟設備連結,通常一個外部設備只能跟一個中央處理器連結,當然我們可以先掃描把附近的設備都先存在陣列裡,在做連結的選擇。
我這邊是點選tabel其中一個列表設備,才去執行連結的動作,如圖一開始執行會看到很多設備新增到tabel中,點選之後就是去對該設備做連結
這邊是開始連結成功時,執行裡面的方法,外部設備連結成功,就可以直接在裡面執行尋找服務,順便也可以停止掃描其他設備。
這裡是發現服務時執行,這邊要注意發現服務是全部的服務,一個設備裡面有很多服務,這裡順便執行尋找所有服務裡的特徵方法。
以上是發現特徵所執行的方法,順便解釋Readvalue這個方法,就是讀取所有特徵的值,而下面setNotifyValue就是要讓中央接受外部設備的廣播開啟功能的方法,這裡要稍微注意是其實只要開啟廣播就會收到相關的值,並不需要特別去讀取,所以必須事先知道你想得到的值是什麼再去作決定要廣播還是讀取值。
這裡先發現特徵,特徵有各種屬性,可讀或可寫或廣播等等,上面先發現,順便執行讀取的話,下面就會依據讀的數據去做解析。
以上大致上是一個簡單基本的流程,來完成整個藍芽連結的運作,個人是依工作上的需求去利用這個框架來達成藍芽傳輸的功能。
這邊比較需要注意是,藍芽的傳輸大部分是以16進位數字字串來去連結辨識,傳送各種命令,以及廣播,如果沒有特別處理,在Xcode這邊print的結果可能只能拿到byte,必須做特殊的處理才能解讀16進位裡面的資料。
這邊我們就可以擴展官方原有的函式庫,來對16進位去做處理,
上面是將Data解讀成16進位字串,原本得到的Data如果沒有這樣處理,直接解成字串是解不了的,所以只能自己擴展16進位的方法去解析它,下面是如果特徵有寫入功能,可以用下面的方法,把16進位字串變成Data傳送出去,外部設備才能接收到他看得懂的訊息,如果直接給字串外部設備看不懂的,一般下載的App也都會幫你解析成16進位字串,nRF Connect也是。
另外介紹這個方法,也是幫助解析特徵屬性的方法,在iOS框架裡面,特徵屬性被設定成常數,但是我們如果得到常數,其實還要去查常數的意義,所以網路有好心人把常數寫成字串,讓我們更容易去解讀特徵的屬性,來了解我們對特徵要執行什麼動作。
總結:藍芽是因為工作上需求,所以特別學習到的技術之一,算是用iPhone連結硬體的技巧之一,感覺藍芽算目前還算實用的技術,趁這機會學習也是好事,但是在純軟體的開發上可能比較少用到,但是工作上就是需要什麼技術就必須去研究它,工程師的日常就是這樣…,每天必須面臨這種未知的挑戰,但是值得高興的是我的技術又更上一層了,用這心態去工作就能更有成就感。
這邊附上Git Hub這個程式沒有什麼酷炫的功能,單純就是認識藍芽的功能,如果你有用到覺得我寫的還可以,就給我一些拍手吧!