iOS 藍牙(CoreBluetooth)

iOS中提供了4個框架用于實現(xiàn)藍牙連接

  1. GameKit.framework(用法簡單)
    只能用于iOS設(shè)備之間的連接读处,多用于游戲(比如五子棋對戰(zhàn)),從iOS7開始過期

  2. MultipeerConnectivity.framework
    只能用于iOS設(shè)備之間的連接锡搜,從iOS7開始引入

  3. ExternalAccessory.framework
    可用于第三方藍牙設(shè)備交互,但是藍牙設(shè)備必須經(jīng)過蘋果MFi認證(國內(nèi)較少)

  4. CoreBluetooth.framework(時下熱門)
    可用于第三方藍牙設(shè)備交互,必須要支持藍牙4.0
    硬件至少是4s布隔,系統(tǒng)至少是iOS6
    藍牙4.0以低功耗著稱,一般也叫BLE(BluetoothLowEnergy)
    目前應(yīng)用比較多的案例:運動手壞稼虎、嵌入式設(shè)備衅檀、智能家居

實現(xiàn)步驟

  1. 導(dǎo)入框架 CoreBluetooth.framework
  2. 建立中央管理者
  3. 掃描周邊設(shè)備
  4. 鏈接掃描到的設(shè)備
  5. 掃描服務(wù)
  6. 掃描特征
  7. 根據(jù)需求進行數(shù)據(jù)的一個處理

代碼實現(xiàn)

#import "ViewController.h"
#import <CoreBluetooth/CoreBluetooth.h>

@interface ViewController () <CBCentralManagerDelegate, CBPeripheralDelegate>

@property (strong, nonatomic) CBCentralManager *centralManager; // 中央管理者
@property (strong, nonatomic) NSMutableArray *peripheralArray;; // 掃描到的外設(shè)

@end

@implementation ViewController

- (NSMutableArray *)peripheralArray {
    if (_peripheralArray == nil) {
        _peripheralArray = [NSMutableArray array];
    }
    return _peripheralArray;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // 1.建立中央管理者
    // queue:傳空,代表的就是在主隊列
    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    
    //2.掃描周邊設(shè)備
    // Services:服務(wù)的UUID,是一個數(shù)據(jù).如果傳nil,默認就會掃描全部所有的服務(wù)
    [self.centralManager scanForPeripheralsWithServices:nil options:nil];
}

#pragma mark - CBCentralManager代理方法
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    NSLog(@"state: %ld",(long)central.state);
}

/**
 當發(fā)現(xiàn)外圍設(shè)備時,會調(diào)用這個方法

 @param central 控制中心
 @param peripheral 外圍設(shè)備
 @param advertisementData 相關(guān)數(shù)據(jù)
 @param RSSI 信號的強度
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *, id> *)advertisementData RSSI:(NSNumber *)RSSI {
    // 3.記錄掃描到的設(shè)備
    if (![self.peripheralArray containsObject:peripheral]) {
        [self.peripheralArray addObject:peripheral];
    }
    // 偽步驟.用一個列表顯示咋們檢測到的外設(shè)備.
    
    // 4.鏈接掃描到的設(shè)備
    [self.centralManager connectPeripheral:peripheral options:nil];
    
    // 5.設(shè)置外圍設(shè)備的一個代理
    peripheral.delegate = self;
}

#pragma mark - 連接到設(shè)備之后,會調(diào)這方法
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    //    6.掃描服務(wù)
    [peripheral discoverServices:nil];
}

#pragma mark - 外設(shè)的代理方法.當發(fā)現(xiàn)到讀物的時候會調(diào)用
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    // 7. 獲取制定的服務(wù),根據(jù)這個服務(wù)來查找特征
    //services:外設(shè)的所有服務(wù),會保存在一個servicse中
    for (CBService *service in peripheral.services) {
        if ([service.UUID.UUIDString isEqualToString:@"123"]) {
            // UUID一直的話,就開始掃描
            [peripheral discoverCharacteristics:nil forService:service];
        }
    }
}

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(nullable NSError *)error {
    //    8.獲取制定特征
    for (CBCharacteristic *characteristic in service.characteristics) {
        if ([characteristic.UUID.UUIDString isEqualToString:@"789"]) {
            //    9.根據(jù)需求進行數(shù)據(jù)的一個處理
            // 如果獲取到了指定的特征,就可以進行數(shù)據(jù)交換了
            [peripheral readValueForCharacteristic:characteristic];
        }
    }
}

#pragma mark - 斷開
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    // 10.最后斷開連接
    [self.centralManager stopScan];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霎俩,隨后出現(xiàn)的幾起案子哀军,更是在濱河造成了極大的恐慌沉眶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杉适,死亡現(xiàn)場離奇詭異谎倔,居然都是意外死亡,警方通過查閱死者的電腦和手機猿推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門片习,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹬叭,你說我怎么就攤上這事藕咏。” “怎么了秽五?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵孽查,是天一觀的道長。 經(jīng)常有香客問我坦喘,道長盲再,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任瓣铣,我火速辦了婚禮答朋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棠笑。我一直安慰自己绿映,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布腐晾。 她就那樣靜靜地躺著叉弦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藻糖。 梳的紋絲不亂的頭發(fā)上淹冰,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音巨柒,去河邊找鬼樱拴。 笑死,一個胖子當著我的面吹牛洋满,可吹牛的內(nèi)容都是我干的晶乔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼牺勾,長吁一口氣:“原來是場噩夢啊……” “哼正罢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驻民,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤翻具,失蹤者是張志新(化名)和其女友劉穎履怯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裆泳,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡叹洲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了工禾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运提。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闻葵,靈堂內(nèi)的尸體忽然破棺而出糙捺,到底是詐尸還是另有隱情,我是刑警寧澤笙隙,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站坎缭,受9級特大地震影響竟痰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掏呼,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一坏快、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧憎夷,春花似錦莽鸿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒋得,卻和暖如春级及,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背额衙。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工饮焦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窍侧。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓县踢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伟件。 傳聞我的和親對象是個殘疾皇子硼啤,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容