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