iOS - 一些蓝牙问题的解决

最近阅读

一、计算蓝牙设备距离

被问到如何计算蓝牙设备距离的,之前有做过大概是通过设备信号量强弱通过计算,得出距离。这里总结一下。

基于上述逻辑,我们只要通过系统接口能拿到设备的信号量就行,而这里有个值得注意的点在于,这个设备信号量其实是可以通过两种方式获取到的。

  1. 利用 CoreLocation.framework 中的 iBeacon 这个类,其中有 RSSI 值(接收信号强度),可以用来计算发射端和接收端间距离。
  2. 通过 Core BluetoothCBPeripheral 类中的 readRSSI 方法中读取到信号量。
    如果你需要用蓝牙连接来控制设备,推荐使用第二种方法,如果需要长时间监听信号量,则可以配合定时器使用。

通过 rssi 的计算距离公式具体如下:

d = 10^((abs(RSSI) - A) / (10 * n))

计算公式的代码实现:

1
2
3
4
5
6
- (float)calcDistByRSSI:(int)rssi
{
int iRssi = abs(rssi);
float power = (iRssi-59)/(10*2.0);
return pow(10, power);
}

其中:

d - 计算所得距离
RSSI - 接收信号强度(负值)
A - 发射端和接收端相隔1米时的信号强度
n - 环境衰减因子

其中 环境衰减因子 可以根据具体设备计算出来,比如多次测试,通过确定的距离值 d 反向计算出 n 的值,然后用平均数或中位数的取值法取一个合适的数值。

二、通过蓝牙设备在应用内实现直接拨打电话功能

使用百度车载设备的时候发现他们可以直接在应用内发起系统拨打电话,众所周知,由于 iOS 系统限制,调用打电话方法时,都会弹出一个系统提示框,让用户确认。

那么这个问题是如何解决的呢,网上找了一下,在这篇文章iOS拨打电话对话框问题解决里面得到了答案。

里面使用的 PBAP 协议的 AT Command 来实现直接拨号功能。具体逻辑里面也写得很清晰。通俗的来说就是我们把号码发给蓝牙设备,由蓝牙设备发起拨打电话这个动作。唯一的限制就在于如果是纯 ble 设备就无法实现该功能。