- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我想做什么
我正在尝试将我的应用程序连接到需要配对的蓝牙 LE 设备。
当前行为
没有配对设备和我的 iPhone 应用程序没有问题。我能够毫无问题地连接、重新连接和读/写特性。
但是,如果设备需要配对,我只能在配对弹出确认后的第一时间读取/写入特性。下一次,我发现应用程序并将其连接到我的设备,但我无权读取/写入特征数据,因为(我猜)我没有使用配对信息。
终于……
在花了几个小时在网络上搜索但没有运气之后,我的问题是:
如何使用手机中存储的配对数据将我的应用程序从我的 iPhone 应用程序连接到蓝牙 LE 设备?我错过了什么吗?
这是否可能不是 IOS 问题,因为如果手机中存在连接设备的配对数据,它会自动使用?
是否有具有蓝牙 LE 和 IOS 经验的人可以帮助我?
更新 2013-10-27
我发现您无法通过配对身份验证读取 protected 特征,之后如果存在配对(无确认弹出窗口)。非保护特性没问题!我不知道为什么会这样,但行为是 IOS 应用程序永远不会从设备收到答案。
因此,如果第一次阅读在之后完成,则不会造成问题。这是我用来发现评论中数据读取特征的代码。
- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;
{
NSArray *characteristics = [service characteristics];
CBCharacteristic *characteristic;
if (peripheral != servicePeripheral) {
NSLog(@"Wrong Peripheral.\n");
return ;
}
if (service != batteryService) {
NSLog(@"Wrong Service.\n");
return ;
}
if (error != nil) {
NSLog(@"Error %@\n", error);
return ;
}
for (characteristic in characteristics) {
NSLog(@"discovered characteristic %@", [characteristic UUID]);
if ([[characteristic UUID] isEqual:[CBUUID UUIDWithString:kBatteryCharacteristicUUIDString]]) { // Bat
NSLog(@"Discovered Bat Characteristic");
batteryCharacteristic = [characteristic retain];
//--> generate problem when pairing exists between IOS app and device
//[peripheral readValueForCharacteristic:batteryCharacteristic];
}
}
}
最佳答案
您无需在应用中执行任何配对管理操作。
如果您的应用在 LE Central 模式下运行,并且外围设备发送身份验证不足错误代码以响应读/写请求,iOS 将自动与您的设备配对并重试该请求。
如果您断开与设备的连接,然后重新连接,外设需要再次发送 Insufficient Authentication 错误代码,以便 iPhone 重新启动加密。同样,您无需在此处对您的应用执行任何特殊操作。
如果您的应用在 LE 外设模式下运行,情况就会有所不同。设置 GATT 数据库时,请确保为 CBAAttributePermissions
和 CBCharacteristicProperties
设置正确的标志。这将告诉 iOS 如果没有配对,它应该自己发送 Insufficient Authentication 错误代码。然后中央设备负责启动加密过程。
在Bluetooth Accessory Design Guidelines for Apple Products , 描述了进一步的限制。
您的配件需要能够解析私有(private)蓝牙地址。 iPhone 会不时更改其公共(public)蓝牙地址,只有配对的设备才能拥有正确的 key 来解析该公共(public)地址并识别 iPhone。
《Section 3.9 Pairing》也很有意思。
请注意,如果您在没有中间人 (MITM) 保护的情况下配对,您的外围设备可以使用生成的 key 来解析 iPhone 的私有(private)蓝牙地址。但是,您将无法加密 channel 。
在 iOS 上与 MITM 保护配对涉及输入由远程设备显示的 PIN 码。据我所知,iOS 不支持通过外部 channel 发送配对数据的带外 (OOB) 配对(至少没有用于设置 OOB 数据的公共(public) API)。
长话短说:如果您只有“配对”/“取消”配对,则无法加密 LE channel ,只能在以后的连接中识别 iPhone。令人高兴的是,即使您在 iPhone 端取消配对,甚至在恢复 iPhone 固件后,您仍然可以识别 iPhone ;-)。
关于一般 LE 加密:无论如何它都不安全(参见 http://eprint.iacr.org/2013/309)。
关于iOS 低功耗蓝牙 : unable to connect using stored pairing data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19589836/
我正在学习使用 STL 的排序函数,方法是将它用于一些复杂的对 vector 。 我有以下 vector : vector > > > > 我需要先根据对中的第一个整数对元素进行排序,如果发现有 2
我想初始化: pair>,vector>> pvp; 所以对于所有的我: pvp.first[i].first = true; 和 pvp.second[i].first = false; 我知道您可
那为什么我们能实例化Pair却不能实例化Pair Pair p=new Pair(); 对比 Pair p=new Pair(); 我知道 意思是未知类型 --> 但不是 意思是一样的---> 有
这个问题在这里已经有了答案: How to have an unordered_map where the value type is the class it's in? (1 个回答) `std
我正在编写一个代码来处理warehouse[item[batch, qty]]的组合,然后将基于[batch, qty]的batch与qty的总和分组。我的代码是: package main impo
我想知道最好的类 java 容器是什么 > 我有一个作为键的 object1 以及一个 t1 和 t2。 我的类具有以下属性: public class Patient implements Exte
所以我有一些使用 Java 8 流的代码,而且它可以工作。它做的正是我需要它做的,而且清晰易读(这在函数式编程中很少见)。在子例程结束时,代码遍历自定义对类型的列表: // All names Hun
我正在声明一个字符串映射到一对对,如下所示: std::map, std::pair>> reference; 我将其初始化为: reference.insert
例如,镜像 pair 至 pair ,我可以像这样创建一个模板函数: template void mirror(const AB& ab,BA& ba){ ba.first=ab.secon
我正在使用 PyZMQ 创建一个简单的 PAIR/PAIR 通信原型(prototype)消息传递模式。 配对服务器 import zmq import random import sys impor
我正在尝试习惯 Kotlin 中的习语和快捷方式,我想知道是否有任何方法可以做到这一点。 val pairList = listOf(Pair(1, 2), Pair(5, 10), Pair(12,
我定义的 map 是这样的 map > hmap; 如果有一个pair(2,pair(3,4))如何得到2 3 4个值,itr->first, itr->第二个不工作 最佳答案 If there is
我希望能够对以下 vector 进行排序 -vector>> 基于 pair 的第一个元素,如果它们相等,则根据它们的第二个元素对它们进行排序,我如何使用 STL 在 C++ 中做到这一点构建? 这种
通过 PHP_PDO: fetchAssoc echo 从 MySql SELECT 查询得到一个 $.getJSON 结果使用 json_encode() 编辑,在 firebug 控制台中的输出如
假设我有以下功能: (defun f (v1 v2) ...) 我想简化以下代码: (lambda (pair) (apply #'f pair)) 此处的目标是创建一个函数,该函数接受两个值的列表并
对不起,我真的不知道怎么写这个标题。我可以想到这样做的代价高昂的方法,但我想看看是否有人可以指出一个优雅的解决方案,这里是: 我有很多成对关联的元素; 每个元素都有一个与其自身关联的数值,该数值表示它
我有一个使用以下方法用 Java 编写的 PreferencesManager: public void insert(Pair keyValue, boolean async) { 我正尝试从 k
这是 assigning-of-unordered-map-to-pair-of-objects 的后续问题.这是一个关于编译器错误解释的问题(而不是一个重复的问题,因为该问题已经得到了完整的回答)。
这是我的 map : map, pair > matchMap; 这是函数: void Schedule::studentSchedule() { string s, c; cout
#include #include #include using namespace std; int main() { map,pair> items; items.inser
我是一名优秀的程序员,十分优秀!