惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
量子位
月光博客
月光博客
罗磊的独立博客
宝玉的分享
宝玉的分享
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
博客园 - 叶小钗
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
美团技术团队
爱范儿
爱范儿
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Y
Y Combinator Blog

壹拾肆

2024 年做过的一些梦 2023 年做过的一些梦 2023 年终总结丨随时开始奔跑的心气 2022 年终总结丨惠存这一年 翻译:Why use dependency injection 是时候维护一个属于自己的开源库了 iOS 端豆瓣开源许可提到的库 推荐几个播客节目 iOS 自动化打包上传 AppleStore、fir.im,并发邮件通知测试人员 业余剪辑自我修养 Swift - 权限请求封装 iOS - HMAC 加密算法和一个 MD5 加密的问题 Swift - 顶部弹出框封装 被光放弃的人 OC - 多代理的实现 我的 AIO-notion 工作流搭建 解决使用 GitPage 重定向多次问题 Swift - ?和!的学习 《文学回忆录》读书笔记
iOS - 一些蓝牙问题的解决
Kaaaaai · 2020-08-15 · via 壹拾肆

最近阅读

一、计算蓝牙设备距离

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

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

  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 设备就无法实现该功能。