iOS-藍牙(CoreBlueTooth)

iOS藍牙須知

iOS提供了4個框架用于實現藍牙連接

1.gameKit.framework(用法簡單)

只能用于iOS設備之間的連接,多用于游戲(比如五子棋游戲),從iOS7開始過期(請參考http://www.lxweimin.com/p/f58e57f1b424)

2.MultipeerConnectivity.framework

只能用于iOS設備之間的連接,從iOS7開始引入,主要用于文件共享(僅限于沙盒的文件)

3.ExternalAccessory.frameWork

可用于第三方藍牙設備交互,但是藍牙設備必須經過蘋果MFi認證(國內較少)

4.CoreBluetooh.framework(時下熱門)

可用于第三方藍牙設備交互,必須要支持藍牙4.0(硬件至少是4s,系統至少iOS6,藍牙4.0以低功耗著稱,一般也叫BLE(Bluetooth low Energy) 目前應用比較多的案例:運動手環,嵌入式設備,智能家居)

Core Bluetooth框架簡介

Core Bluetooth基本常識

1.每個藍牙4.0設備都是通過服務(Service)和特征(Characteristic)來展示自己的
2.一個設備必然包含一個或多個服務,每個服務下面又包含若干個特征
3.特征是與外界交互的最小單位(比如說:一個藍牙4.0設備,用特征A來描述自己的出場信息,用特征B來收發數據)
4.服務和特征都是用UUID來唯一標識的,通過UUID就能區分不同的服務和特征
5.設備里面的各個服務(Service)和特征(Characteristic)的功能,均由藍牙設備硬件廠商提供,比如那些是用來交互(讀寫),那些可獲取模塊信息(只讀)等

Core Bluetooth的開發步驟

1.建立中心設備(手機)
2.掃描外圍設備(Discover Peripheral)
3.連接外圍設備(Connect Peripheral)
4.掃描外圍設備的服務和特征(Discover Service and Characteristic)
5.利用特征與外圍設備做數據交互(Explore And Interact)
6.斷開連接(Disconnect)

如何讓iOS模擬器也能測試藍牙4.0程序

1.買一個CSR藍牙4.0USB適配器,插在Mac上
2.在終端輸入 sudo nvram bluetoothHostControllerSwitchBehavior="never"
3.重啟Mac

上代碼

//
//  ViewController.m
//  藍牙(CoreBlueTooth)
//
//  Created by ws on 2017/6/14.
//  Copyright ? 2017年 王松. All rights reserved.
//

#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>
@interface ViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate>
///中央管理者
@property(nonatomic,strong)CBCentralManager*mgr;
///存儲掃描到的外圍設備
@property(nonatomic,strong)NSMutableArray*peripherals;
@end

@implementation ViewController
-(NSMutableArray *)peripherals{
    if (!_peripherals) {
        _peripherals = [NSMutableArray array];
    }
    return _peripherals;
}
#pragma mark 1.建立中央管理者
-(CBCentralManager *)mgr{
    if (!_mgr) {
        //1.建立中央管理者
        self.mgr = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
    }
    return _mgr;
}
#pragma mark CBCentralManager必須實現方法

/**
 狀態發生改變的時候會執行該方法(藍牙4.0沒有打開變成打開狀態就會執行該方法)
 */
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
    //判斷狀態
    if (central.state) {
        
    }
}
#pragma mark 掃描到外圍設備執行的代理方法

/**
 當發現外圍設備的時候會調用該方法
 @param peripheral 發現的外圍設備
 @param advertisementData 外圍設備發出的信號
 @param RSSI 信號強度
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI{
    //先判斷 如果我的數組里面已經包含了某個外圍設備就不存儲啦
    if (![self.peripherals containsObject:peripheral]) {
        [self.peripherals addObject:peripheral];
    }
    
}
#pragma mark 用戶連接外圍設備
-(void)connect:(CBPeripheral *)peripheral{
    //連接外圍設備
    [self.mgr connectPeripheral:peripheral options:nil];
}
#pragma mark 連接到某一個外圍設備就會調用該代理方法
/**
 連接到某一個外圍設備所走的方法
 @param peripheral 連接上的外圍設備
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral{
    //1.掃描所有的服務
    //參數:指定掃描該外圍設備的那些服務(nil 表示掃描該外圍設備的所有服務)
    [peripheral discoverServices:nil];
    //2.設置外圍設備的代理
    peripheral.delegate = self;
    
}
#pragma mark CBPeripheralDelegate外圍設備的代理方法

/**
 發現掃描到該外圍設備的服務的時候執行該方法(掃描到服務之后直接添加到peripheral.services數組對象里面)
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(nullable NSError *)error{
    //對掃描到的該外圍設備的服務進行遍歷
    for (CBService *service in peripheral.services) {
        //拿到你想要的某個服務
        if ([service.UUID.UUIDString isEqualToString:@"某個服務的UUID"]) {
            NSLog(@"拿到你想要的某個服務");
            //掃描服務里面的所有特征
            //參數1:CBUUID:可以指定這個服務里想要掃描的特征(nil 表示掃描這個服務里面的所有的特征)
            [peripheral discoverCharacteristics:nil forService:service];
        }
    }
}

/**
 當掃描某一個服務的特征的時候會執行該方法(掃描到特征之后直接添加到service.characteristics數組對象里面)

 @param service 在哪一個服務里的特征
 */
-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{
    for (CBCharacteristic *characteristic in service.characteristics) {
        if ([characteristic.UUID.UUIDString isEqualToString:@"某個特征的UUID"]) {
            //拿到特征 和外圍設備進行交互
            //讀
           // [peripheral readValueForCharacteristic:characteristic];
            //寫
           // peripheral writeValue:<#(nonnull NSData *)#> forCharacteristic:<#(nonnull CBCharacteristic *)#> type:<#(CBCharacteristicWriteType)#>
        }
    }
    
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //1.建立中央管理者
    //2.掃描所有的外圍設備
    //參數1:CBUUID 可以將你想要掃描的服務的外圍設備傳入(傳nil表示掃描所有的外圍設備)
    //參數2:什么操作
    [self.mgr scanForPeripheralsWithServices:nil options:nil];
}

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

推薦閱讀更多精彩內容

  • Guide to BluetoothSecurity原文 本出版物可免費從以下網址獲得:https://doi.o...
    公子小水閱讀 8,158評論 0 6
  • 前言 最近實驗室做了一個IOS設備之間使用藍牙進行數據交互的項目。中間遇到了很多坑,現在大致講解一下藍牙通訊的流程...
    Larrycal閱讀 9,896評論 3 36
  • 隨著智能家具、智能穿戴等的興起,藍牙開發應用越來越廣泛,有關藍牙方面的問題,今天就給大家進行詳細的講解,想要了解藍...
    知易行難880721閱讀 630評論 0 0
  • 雖然說,買得起車也加得起油,但是油耗問題卻仍然是一筆不小的開支,積少成多,大家都要養成環保節能的意識。其實開車有很...
    愛車吧閱讀 183評論 0 0
  • 這是關于我的故事,是我最想告訴你的故事。 然后,這個故事我沒有告訴你。 為什么呢,你可能會覺得我抽了才會想這么多,...
    小雨辰閱讀 119評論 0 0