iOS 藍牙4.0開發使用(內附Demo)

一: 介紹

近幾年,智能設備愈來愈火,這些智能設備中,有很大一部分是經過手機來控制硬件設備,來達到預期的效果,這中間少不了要使用到藍牙功能,經過藍牙來通訊來控制設備。編程

藍牙分爲藍牙2.0和藍牙4.0。 藍牙2.0爲傳統藍牙,傳統藍牙也稱爲經典藍牙。 藍牙4.0由於低耗電,因此也叫作低功耗藍(BLE),它將三種規格集一體,包括傳統藍牙技術、高速技術和低耗能技術。安全

這篇文章用來介紹BLE 4.0的使用以及相關問題的解決。bash

二:BLE的兩種模式

BLE的兩種模式分爲CBCentralMannager 中心模式 和CBPeripheralManager 外設模式,在這裏主要和你們分享CBCentralMannager 中心模式的開發和使用。微信

CBCentralMannager 中心模式

以手機(app)做爲中心,鏈接其餘外設的場景。詳細流程以下:app

  1. 創建中心角色
  2. 掃描外設
  3. 發現外設
  4. 鏈接外設 4.1 鏈接失敗 4.2 鏈接斷開 4.3 鏈接成功
  5. 掃描外設中的服務 5.1 發現並獲取外設中的服務
  6. 掃描外設對應服務的特徵 6.1 發現並獲取外設對應服務的特徵 6.2 給對應特徵寫數據
  7. 訂閱特徵的通知 7.1 根據特徵讀取數據

CBPeripheralManager 外設模式

使用手機做爲外設鏈接其餘中心設備操做的場景。 PS:由於蘋果設備的安全性和封閉性,蘋果設備不能經過與其餘設備藍牙連接進行文件傳輸等功能,因此在iOS與藍牙開發的編程中是CBCentralMannager 中心模式編程居多.框架

  1. 創建外設角色
  2. 設置本地外設的服務和特徵
  3. 發佈外設和特徵
  4. 廣播服務
  5. 響應中心的讀寫請求
  6. 發送更新的特徵值,訂閱中心

三:BLE開發步驟

在介紹CBCentralMannager 中心模式開發步驟以前,首先須要對項目進行以下配置:ui

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

@interface ESPFBYBLEHelper ()<CBCentralManagerDelegate,CBPeripheralDelegate>
// 中心管理者(管理設備的掃描和鏈接)
@property (nonatomic, strong) CBCentralManager *centralManager;
// 存儲的設備
@property (nonatomic, strong) NSMutableArray *peripherals;
// 掃描到的設備
@property (nonatomic, strong) CBPeripheral *cbPeripheral;
// 外設狀態
@property (nonatomic, assign) CBManagerState peripheralState;
@end

// 藍牙4.0設備名
static NSString * const kBlePeripheralName = @"lighte290";
// 通知服務
static NSString * const kNotifyServerUUID = @"FF03";
// 寫服務
static NSString * const kWriteServerUUID = @"FFFF";
// 通知特徵值
static NSString * const kNotifyCharacteristicUUID = @"FF05";
// 寫特徵值
static NSString * const kWriteCharacteristicUUID = @"FF08";
@implementation ESPFBYBLEHelper
複製代碼

這其中須要導入CoreBluetooth框架atom

#import <CoreBluetooth/CoreBluetooth.h>
複製代碼

遵照CBCentralManagerDelegate,CBPeripheralDelegate協議spa

@interface ESPFBYBLEHelper ()<CBCentralManagerDelegate,CBPeripheralDelegate>
複製代碼

而後須要檢測藍牙狀態,代碼以下:代理

// 狀態更新時調用
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    switch (central.state) {
        case CBManagerStateUnknown:{
            NSLog(@"爲知狀態");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStateResetting:
        {
            NSLog(@"重置狀態");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStateUnsupported:
        {
            NSLog(@"不支持的狀態");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStateUnauthorized:
        {
            NSLog(@"未受權的狀態");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStatePoweredOff:
        {
            NSLog(@"關閉狀態");
            self.peripheralState = central.state;
        }
            break;
        case CBManagerStatePoweredOn:
        {
            NSLog(@"開啓狀態-可用狀態");
            self.peripheralState = central.state;
            NSLog(@"%ld",(long)self.peripheralState);
        }
            break;
        default:
            break;
    }
}
複製代碼

添加屬性和常量,常量須要根據本身的項目來進行配置。 下面只須要根據實現流程一步步實現便可,核心代碼以下:

1. 創建中心角色
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
複製代碼
2. 掃描外設
if (self.peripheralState ==  CBManagerStatePoweredOn){
    [self.centralManager scanForPeripheralsWithServices:nil options:nil];
}
複製代碼
3. 發現外設
/**
 掃描到設備
 @param central 中心管理者
 @param peripheral 掃描到的設備
 @param advertisementData 廣告信息
 @param RSSI 信號強度
 */
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"%@",[NSString stringWithFormat:@"發現設備,設備名:%@",peripheral.name]);
}
複製代碼
4. 鏈接外設
[self.centralManager connectPeripheral:peripheral options:nil];
複製代碼
  • 4.1 鏈接失敗 didFailToConnectPeripheral
/**
 鏈接失敗
 @param central 中心管理者
 @param peripheral 鏈接失敗的設備
 @param error 錯誤信息
 */
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"%@",@"鏈接失敗");
}
複製代碼
  • 4.2 鏈接斷開
/**
 鏈接斷開
 @param central 中心管理者
 @param peripheral 鏈接斷開的設備
 @param error 錯誤信息
 */
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"%@",@"斷開鏈接");
}
複製代碼
  • 4.3 鏈接成功
/**
 鏈接成功
 
 @param central 中心管理者
 @param peripheral 鏈接成功的設備
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    NSLog(@"鏈接設備:%@成功",peripheral.name);
    [self.centralManager stopScan];
}
複製代碼
5. 掃描外設中的服務
// 設置設備的代理
peripheral.delegate = self;
// services:傳入nil  表明掃描全部服務
[peripheral discoverServices:nil];
複製代碼

5.1 發現並獲取外設中的服務

/**
 掃描到服務
 @param peripheral 服務對應的設備
 @param error 掃描錯誤信息
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    // 遍歷全部的服務
    for (CBService *service in peripheral.services)
    {
        NSLog(@"服務:%@",service.UUID.UUIDString);
    }
}
複製代碼
6. 掃描外設對應服務的特徵
// 獲取對應的服務
        if (![service.UUID.UUIDString isEqualToString:kWriteServerUUID])
        {
            return;
        }
        // 根據服務去掃描特徵
        [peripheral discoverCharacteristics:nil forService:service];
複製代碼

6.1 發現並獲取外設對應服務的特徵

/**
 掃描到對應的特徵
 @param peripheral 設備
 @param service 特徵對應的服務
 @param error 錯誤信息
 */
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    NSLog(@"%@",peripheral);
}
複製代碼

6.2 給對應特徵寫數據

[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
複製代碼
7. 訂閱特徵的通知
if ([characteristic.UUID.UUIDString isEqualToString:kNotifyCharacteristicUUID]){
  [peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
複製代碼

7.1 根據特徵讀取數據 didUpdateValueForCharacteristic

/**
 根據特徵讀到數據
 @param peripheral 讀取到數據對應的設備
 @param characteristic 特徵
 @param error 錯誤信息
 */
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(nonnull CBCharacteristic *)characteristic error:(nullable NSError *)error
{
    if ([characteristic.UUID.UUIDString isEqualToString:kNotifyCharacteristicUUID])
    {
        NSData *data = characteristic.value;
        NSLog(@"%@",data);
    }
}
複製代碼

四:源碼Demo獲取方法

若是須要源碼demo,歡迎關注 【網羅開發】微信公衆號,回覆【94】即可領取。 網羅天下方法,方便你我開發,全部文檔會持續更新,歡迎關注一塊兒成長!


歡迎關注公衆號「網羅開發」

相關文章
相關標籤/搜索