iOS藍牙BLE開發

藍牙是一個標準的無線通訊協議,具有設備成本低、傳輸距離近和功耗低等特點,被廣泛的應用在多種場合。藍牙一般分為傳統藍牙和BLE兩種模式:傳統藍牙可以傳輸音頻等較大數據量,距離近、功耗相對大;而BLE則用來傳輸節點數據,傳輸數據量十分小,多數情況處于休眠狀態,因而功耗十分低,被廣泛的應用于智能穿戴設備。

藍牙BLE簡介

本文主要介紹iOS的藍牙BLE開發流程,在介紹具體開發流程之前,有必要了解一下藍牙BLE的特點。BLE通過屬性(attribute)在clientserver之間進行數據交互,GATT定義了屬性協議(Profile)來進行發現設備、讀寫數據和獲取狀態等功能。其中,在iOS藍牙BLE開發過程中,App應用屬于Central設備,BLE產品屬于外設PeripheralProfile的結構圖如下:

圖1

其中,ServiceCharacteristic 都有一個UUID來相互區分,類似心跳、血糖等的ServiceUUID由藍牙SIG統一設定,同時也允許自定義服務,但仍需要用不同的UUID來標識。

針對客戶端藍牙BLE開發,一般不需要深入了解藍牙協議棧,如果有興趣,可以參考如下資料(本資料來自TI):
TI_BLE_Description

BLE開發流程

1. 創建CBCentralManager

創建一個隊列,然后在這個隊列里面進行BLE的各種操作

    //創建CBCentralManager對象
    dispatch_queue_t queue = dispatch_queue_create("bluetooth", DISPATCH_QUEUE_SERIAL);
    CBCentralManager *mgr = [[CBCentralManager alloc] initWithDelegate:self queue:queue];

2. 掃描外設

參數介紹:

  • serviceUUIDs: 指定掃描包含特點服務的外設,傳nil表明是所有服務
  • options: 掃描時的設置,是一個字典
    //CBCentralManagerScanOptionAllowDuplicatesKey值為 No,表示不重復掃描已發現的設備
    NSDictionary *optionDic = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
    [_mgr scanForPeripheralsWithServices:nil options:optionDic];

3. 停止掃描

    [_mgr stopScan];

4. 連接外設

遍歷掃描到的外設,然后連接外設

    for (CBPeripheral *peripheral in self.peripherals) {
        [_mgr connectPeripheral:peripheral options:nil];
    }

5. 掃描外設中的服務和特征

獲取服務

    [peripheral discoverServices:nil];

獲取特征

    [peripheral discoverCharacteristics:nil forService:service];

獲取描述

    [peripheral discoverDescriptorsForCharacteristic:characteristic]

改寫特征數據

    [_peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];

6. 部分CBCentralManagerDelegate方法簡介

代理方法:centralManagerDidUpdateState

Central已經更新狀態,要在CBManagerStatePoweredOn里掃描外設,因為這是藍牙初始化工作已完成

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    switch (central.state) {
        case CBManagerStatePoweredOn:
        {
            NSLog(@"開啟藍牙, 開始掃描");
            
            [_mgr scanForPeripheralsWithServices:nil options:nil];
        }
            break;
        case CBManagerStateUnsupported:
            NSLog(@"不支持藍牙");
            break;
        case CBManagerStatePoweredOff:
            NSLog(@"藍牙未打開");
            break;
            
        default:
            NSLog(@"藍牙打開失敗");
            break;
    }
}

代理方法: centralManager:didDiscoverPeripheral:advertisementData:RSSI:

掃描到外設

    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI

代理方法: centralManager:didConnectPeripheral:

連接到外設

    - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

7. 部分CBPeripheralDelegate方法簡介

代理方法: peripheral:didDiscoverServices:

發現服務

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

代理方法: peripheral:didDiscoverCharacteristicsForService:error:

發現服務的特征

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

代理方法: peripheral:didUpdateValueForCharacteristic:error:

已經更新特征的值

    - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

代理方法: peripheral:didWriteValueForCharacteristic:error:

已經寫入特征的值

    -(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

8. 實例代碼

下面的視圖是基于小米手環2的測試數據,由于不是小米手環的開發者,沒辦法讀取詳細的數據,只把硬件、軟件的版本信息等數據讀出,以供需要開發藍牙BLE之參考。

圖3

圖2

參考源碼

https://github.com/BirdandLion/iOS-BLE.git

參考文檔

http://www.lxweimin.com/p/0a6c49922aad

http://www.lxweimin.com/p/4df85eba6dab

http://www.lxweimin.com/p/7ba443878e7d

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 在寫這個博客之前,空余時間抽看了近一個月的文檔和Demo,系統給的解釋很詳細,接口也比較實用,唯獨有一點,對于設備...
    木易林1閱讀 3,392評論 3 4
  • 藍牙簡介 藍牙( Bluetooth? ):是一種無線技術標準,可實現固定設備、移動設備和樓宇個人域網之間的短距離...
    Chefil閱讀 2,060評論 2 19
  • 首先進一則廣告: 藍牙技術聯盟(Bluetooth SIG)2010年7月7日宣布,正式采納藍牙4.0核心規范(B...
    L澤閱讀 1,467評論 3 4
  • 有時候信任別人就是被出賣時,有時一個問,得到一個敷衍和輕視,有時情商高是用于惡人先告狀,有時想靠近得到是不屑,也知...
    阿Q哥哥閱讀 170評論 1 1
  • 二月十九日,為期一天的啟源嶺作陶藝教師首期培訓洛陽澗西區順利舉辦,來自教學一線的22名教師,以及幼兒園的16...
    啟源教育閱讀 593評論 1 2