- 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/
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 血压的测量和预测是心脏病患者和有心脏问题的人的一个重要条件,应该保持持续的控制。在这项研究中,基
具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 心血管疾病是最严重的死亡原因之一,每年在全世界造成严重的生命损失。持续监测血压似乎是最可行的选择
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 恩智浦MCX系列MCU的新品MCXN947 。 自 2015 年恩智浦和飞思卡尔合并成新恩智浦之后,关于它们各
我正在开发一个应用程序,该应用程序接受语音输入,并将该输入与 list 中的已知项目进行匹配。 list 中的每个项目都有一个别名列表,以便长标题的项目可以与较短的名称相匹配。 例如: class P
两个双模蓝牙设备连接时,必须使用EDR,不能并联使用LE。然后必须通过 EDR 链路传输 BT 低功耗 GATT 配置文件。这是我从规范中读到的内容。 但是 iOS EDR 堆栈(在没有 MFi 许可
我正在尝试为 S3 开发蓝牙 4.0 应用程序。问题是,手机的行为就像它甚至没有蓝牙 4.0。它不会发现 4.0 设备,并且无法通过 4.0 设备发现。我在手机设置和应用程序中都尝试过,使用 Broa
我正在寻找一种与 Adafruit bluefruit LE(nRF8001 芯片组)板进行交互的方法,在 Windows 桌面应用程序中使用 c#(据我所知,我无法使用 Windows.Device
我是一名优秀的程序员,十分优秀!