CoreBluetooth For Central (8)

CoreBluetooth For Central (8)

前言

从2012年接触CoreBluetooth至今也蛮长一段时间,不过还是纯研究,也没写出相关的APP。不过,真正理解BLE沟通是在接触TI CC2540并撰写相关的程式,回过头来又再看看CoreBluetooth整个流程与操作其实已经非常完整也较稳定,未来或许会有几篇CC2540或BLE的相关心得说明。

RSSI

RSSI是Received Signal Strength Indication的缩写,也就代表接收的讯号深度(强度),讯号愈好代表连线品质愈好,它的单位是以负值的dBm表示,RSSI愈接近0连线品质愈好,所以-50dBm讯号会比-89dBm来的好。

这篇所要介绍的是如何即时读取连线中Peripheral的RSSI值,使用方式很简单,但要配合ReadRSSI与Delegate。

ReadRSSI

每个Pheripheral都会有method ReadRSSI,利用此方式来触发读取RSSI的事件后再引发Delegate,当你连线成功后就能执行

[peripheral readRSSI];

告知要进行读取目前Peripheral的RSSI值,此时会引发Delegate:

iOS 7

- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error {
 NSLog(@"name: %@ RSSI:%@",peripheral.name,peripheral.RSSI);
}

iOS 8 以上

因iOS 8后弃用peripheral中的RSSI method,所以delegate直接回传该peripheral RSSI值

- (void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(nullable NSError *)error {
 NSLog(@"name: %@ RSSI:%@",peripheral.name,RSSI);
}

BluetoothLE-ReadRSSI

CoreBluetooth For Central (7)中的范例BluetoothLE-Interact,将它另存成BluetoothLE-ReadRSSI,并修改内容增加读取RSSI的功能,RSSI的更新在iOS中最好以超过2秒为单位来执行Timer,在此设定为2秒一次。

设定2秒timeout执行程式

范例中在连线完成后会将peripheral相应存至connectPeripheral变数:

- (void)execReadRSSI:(NSTimer *)timer
{
    [connectPeripheral readRSSI];
}


连线时启动Timer

避免重复执行,执行前先将Timer停止

-(void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    :
    :
    :
    :
    //增加设定定时的程式码
    //initial timer
    [_readRSSITimer invalidate];
    _readRSSITimer = [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(execReadRSSI:) userInfo:nil repeats:YES];
    NSLog(@"readRSSI Timer start");
}

断线停止Timer

断线后会引发didDisconnectPeripheral,所以利用此方式将计时器顺便停止:

-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error {
    NSLog(@"%@",@"disconnect-2");
    [_readRSSITimer invalidate];
}

执行结果

此次要连接的依然是Polar H7心跳表示范,连线成功后按下Scan and Connect后会自行找到周边后自行连线。

连线成功后就能在Log中看到RSSI讯号值,内容像:

2015-11-18 09:32:59.979 BluetoothLE-ReadRSSI[2596:1682965] name: Polar H7 000607 RSSI:-70

以下为整个连线过程及印出RSSI值的过程:

2015-11-18 09:32:56.565 BluetoothLE-ReadRSSI[2596:1682965] UpdateState:PoweredOn
2015-11-18 09:32:57.868 BluetoothLE-ReadRSSI[2596:1682965] Scan And Connect
2015-11-18 09:32:57.888 BluetoothLE-ReadRSSI[2596:1682965] ---advertisementData--start-
2015-11-18 09:32:57.889 BluetoothLE-ReadRSSI[2596:1682965] peripheral
<CBPeripheral: 0x1563bf30, identifier = 8DC3DD90-0C17-1AB9-90FE-E9130DD07B81, name = Polar H7 000607, state = disconnected>
2015-11-18 09:32:57.889 BluetoothLE-ReadRSSI[2596:1682965] advertisementData
{
    kCBAdvDataIsConnectable = 1;
    kCBAdvDataLocalName = "Polar H7 000607";
    kCBAdvDataManufacturerData = <6b000315 00>;
    kCBAdvDataServiceUUIDs =     (
        "Heart Rate"
    );
    kCBAdvDataTxPowerLevel = 0;
}
2015-11-18 09:32:57.890 BluetoothLE-ReadRSSI[2596:1682965] RSSI
-65
2015-11-18 09:32:57.890 BluetoothLE-ReadRSSI[2596:1682965] ---advertisementData--end-
2015-11-18 09:32:57.890 BluetoothLE-ReadRSSI[2596:1682965] localName:Polar H7 000607
2015-11-18 09:32:57.890 BluetoothLE-ReadRSSI[2596:1682965] stopScan
2015-11-18 09:32:57.891 BluetoothLE-ReadRSSI[2596:1682965] connect to Polar H7 000607
2015-11-18 09:32:57.975 BluetoothLE-ReadRSSI[2596:1682965] connected
2015-11-18 09:32:57.975 BluetoothLE-ReadRSSI[2596:1682965] Connect To Peripheral with name: Polar H7 000607
with UUID:8DC3DD90-0C17-1AB9-90FE-E9130DD07B81
2015-11-18 09:32:57.975 BluetoothLE-ReadRSSI[2596:1682965] readRSSI Timer start
2015-11-18 09:32:58.271 BluetoothLE-ReadRSSI[2596:1682965] didDiscoverServices:
2015-11-18 09:32:58.271 BluetoothLE-ReadRSSI[2596:1682965] ====Polar H7 000607
2015-11-18 09:32:58.272 BluetoothLE-ReadRSSI[2596:1682965] =========== 4 of service for UUID 8DC3DD90-0C17-1AB9-90FE-E9130DD07B81 ===========
2015-11-18 09:32:58.272 BluetoothLE-ReadRSSI[2596:1682965] Service found with UUID: Heart Rate
2015-11-18 09:32:58.273 BluetoothLE-ReadRSSI[2596:1682965] Service found with UUID: Device Information
2015-11-18 09:32:58.273 BluetoothLE-ReadRSSI[2596:1682965] Service found with UUID: Battery
2015-11-18 09:32:58.274 BluetoothLE-ReadRSSI[2596:1682965] Service found with UUID: 6217FF49-AC7B-547E-EECF-016A06970BA9
2015-11-18 09:32:58.331 BluetoothLE-ReadRSSI[2596:1682965] =========== 2 Characteristics of Heart Rate service 
2015-11-18 09:32:58.331 BluetoothLE-ReadRSSI[2596:1682965]  2A37 
2015-11-18 09:32:58.332 BluetoothLE-ReadRSSI[2596:1682965] 找到 心跳测量属性
2015-11-18 09:32:58.332 BluetoothLE-ReadRSSI[2596:1682965]  2A38 
2015-11-18 09:32:58.333 BluetoothLE-ReadRSSI[2596:1682965] 找到 心跳测量位置属性 
2015-11-18 09:32:58.333 BluetoothLE-ReadRSSI[2596:1682965] === Finished set notification ===
2015-11-18 09:32:58.570 BluetoothLE-ReadRSSI[2596:1682965] =========== 7 Characteristics of Device Information service 
2015-11-18 09:32:58.571 BluetoothLE-ReadRSSI[2596:1682965]  System ID 
2015-11-18 09:32:58.571 BluetoothLE-ReadRSSI[2596:1682965]  Model Number String 
2015-11-18 09:32:58.572 BluetoothLE-ReadRSSI[2596:1682965]  Serial Number String 
2015-11-18 09:32:58.572 BluetoothLE-ReadRSSI[2596:1682965]  Firmware Revision String 
2015-11-18 09:32:58.572 BluetoothLE-ReadRSSI[2596:1682965]  Hardware Revision String 
2015-11-18 09:32:58.572 BluetoothLE-ReadRSSI[2596:1682965]  Software Revision String 
2015-11-18 09:32:58.572 BluetoothLE-ReadRSSI[2596:1682965]  Manufacturer Name String 
2015-11-18 09:32:58.573 BluetoothLE-ReadRSSI[2596:1682965] === Finished set notification ===
2015-11-18 09:32:58.630 BluetoothLE-ReadRSSI[2596:1682965] =========== 1 Characteristics of Battery service 
2015-11-18 09:32:58.631 BluetoothLE-ReadRSSI[2596:1682965]  Battery Level 
2015-11-18 09:32:58.631 BluetoothLE-ReadRSSI[2596:1682965] === Finished set notification ===
2015-11-18 09:32:58.779 BluetoothLE-ReadRSSI[2596:1682965] =========== 1 Characteristics of 6217FF49-AC7B-547E-EECF-016A06970BA9 service 
2015-11-18 09:32:58.780 BluetoothLE-ReadRSSI[2596:1682965]  6217FF4A-B07D-5DEB-261E-2586752D942E 
2015-11-18 09:32:58.781 BluetoothLE-ReadRSSI[2596:1682965] === Finished set notification ===
2015-11-18 09:32:58.900 BluetoothLE-ReadRSSI[2596:1682965] 0 bpm
2015-11-18 09:32:58.959 BluetoothLE-ReadRSSI[2596:1682965] 位置: 胸部
2015-11-18 09:32:59.919 BluetoothLE-ReadRSSI[2596:1682965] 89 bpm
2015-11-18 09:32:59.979 BluetoothLE-ReadRSSI[2596:1682965] name: Polar H7 000607 RSSI:-70
2015-11-18 09:33:00.909 BluetoothLE-ReadRSSI[2596:1682965] 89 bpm
2015-11-18 09:33:01.929 BluetoothLE-ReadRSSI[2596:1682965] 92 bpm
2015-11-18 09:33:01.978 BluetoothLE-ReadRSSI[2596:1682965] name: Polar H7 000607 RSSI:-71
2015-11-18 09:33:02.950 BluetoothLE-ReadRSSI[2596:1682965] 96 bpm
2015-11-18 09:33:03.940 BluetoothLE-ReadRSSI[2596:1682965] 97 bpm

范例程式