标签: core-bluetooth

我们可以通过蓝牙与iPhone配对多少台设备?

任何人都可以告诉我我们可以通过蓝牙与iPhone配对多少设备..需要帮助..现在我还没有确切的数字.

iphone bluetooth ios core-bluetooth

15
推荐指数
1
解决办法
3万
查看次数

在iOS上同时使用外围设备和中央设备

到处寻找并尝试了一切,但似乎没有任何工作:(

在iOS上,我正在制作iOS设备需要交换数据的应用程序(适用于iOS 6及更高版本).因此,两个设备需要同时是外围设备和中心设备.我完全按照WWDC视频中的规定完成,但设备无法相互成功连接.

当我将一个设备设置为中央设备而另一个仅设置为外围设备时,中央设备无缝连接到外围设备.

但是,当两个设备同时是外围设备和中心设备时,我会得到随机错误:在任何阶段(发现服务/特性或设置通知值YES)有时会发生错误,有时discoverServices甚至不会调用didDiscoverServices

我应该做些什么吗?我只是将外设和中央代码合并到一个视图控制器中.我注意到,如果设备"a"连接到设备"b",然后设备"b"连接到设备"a",它通常工作.我通过NSThread sleepForTimeInterval:在每个设备上手动使用不同的时间来管理这个,但是我怎么能以可靠的(而不是手动预定义的)方式让一个设备先连接(然后另一个)呢?

如果我确实遇到错误,通常他们就是这么简单 Unknown error

如果您需要任何代码或任何其他信息,请告诉我:)

objective-c ios core-bluetooth

15
推荐指数
1
解决办法
7169
查看次数

蓝牙低功耗加密和数据安全

我需要通过智能手机(iOS和Android)和嵌入式设备(CC2540芯片)之间的蓝牙低功耗(BLE)数据连接发送一些敏感数据.

由于我不认为手机上的应用程序代码是安全的,所以我需要依赖BLE安全来将我的加密包从服务器传送到设备一次而且只有一次(我必须假设任何第二次尝试)提供包,必须来自攻击者).

几天后我一直在浏览网络,以确定我的数据是否安全,以及在哪些条件下.不幸的是,我无法对我的问题提出简单的答案.

  1. 如果我将手机与设备配对,我的数据是否安全? - 我想是的,虽然我理解配对过程本身是有缺陷的,所以理论上可以让一些中间人(MITM)在配对过程中嗅探加密密钥,从而危及连接.

  2. 我需要将每个设备配对多个电话(但一次只能与一个电话通信).什么是配对的最大数量pr.设备? - 不幸的是,我需要将相当多的手机配对我的设备.

  3. 我是否可以从设备获取配对数据(长期密钥等)并将其存储在某些外部存储器中,以增加此限制.

  4. 我是否可以在没有配对的情况下与设备建立安全的数据连接,或者在需要时重新配对? - 这个程序对MITM攻击有多安全?

我似乎无法找到任何明确回答这些问题的文件.任何想法或指示都将受到欢迎.

security android bluetooth core-bluetooth bluetooth-lowenergy

15
推荐指数
1
解决办法
2万
查看次数

如何在iOS中找到蓝牙音频设备

好吧,我正在开发一个有趣的项目,我需要为我的iOS应用程序启用蓝牙音频支持.

我遇到的障碍是我甚至无法开始获得连接的蓝牙音频设备列表.即使我的iPhone 5S识别我的耳机(准确地说是一个~3 - 4岁的LG HBM-230)并通过它播放音频进行电话呼叫,但当我查询两者时,BOTH External Accessory和CoreBluetooth都没有给我任何帮助.

我将我自己的代码基于我发现的CoreBluetoothExternal Accessory框架的问题和答案.

当我的代码只是试图" scanForPeripheralsWithServices:nil" 设置 - >蓝牙说的任何蓝牙设备可见并连接时,下面的代码只是CBCentralManagerStatePoweredOn在控制台中的" "消息之外不会出现一次命中.

我的代码中的这一行(带有有效的EAAccessoryManager实例)

NSArray * connectedDevices = [self.eAAccessoryManager connectedAccessories];
Run Code Online (Sandbox Code Playgroud)

还带有一个nil数组.

我能做错什么?

顺便说一下,我已将此代码作为GitHub项目提供.

@implementation BluetoothManager

+ (BluetoothManager *)sharedInstance
{
    static dispatch_once_t pred = 0;
    __strong static id _bluetoothMGR = nil;

    dispatch_once(&pred, ^{
        _bluetoothMGR = [[BluetoothManager alloc] init];
    });

    return _bluetoothMGR;
}

- (id)init
{
    self = [super init];
    if(self)
    {
        dispatch_queue_t …
Run Code Online (Sandbox Code Playgroud)

iphone audio external-accessory ios core-bluetooth

15
推荐指数
1
解决办法
1万
查看次数

iOS - BLE在背景上扫描随机冻结

更新14/08 - 3 - 找到真正的解决方案:

您可以在下面的答案中查看解决方案!

更新16/06 - 2 - 可能是解决方案:

正如Sandy Chapman在回答中的评论中所说的那样,我现在可以使用这种方法在扫描开始时检索我的外围设备:

- (NSArray<CBPeripheral *> * nonnull)retrievePeripheralsWithIdentifiers:(NSArray<NSUUID *> * nonnull)identifiers
Run Code Online (Sandbox Code Playgroud)

我实际上是想通过在扫描开始时让我的外围设备恢复并在需要时启动连接(即使它不在范围内)来使其工作.iOS将保持活着,直到找到我正在寻找的设备.

还请注意,iOS 8.x中可能存在一个错误,如果在后台有另一个使用蓝牙的发布版本的应用程序,则会不时通过扫描(我得到的消失回调)来保持应用程序的调试版本.

更新16/06:

所以我检查了retrievePeripheralsWithServices,如果在我开始扫描时连接了任何设备.当我得到错误时,我启动应用程序和我做的第一件事

- (void) applicationDidBecomeActive:(UIApplication *)application
Run Code Online (Sandbox Code Playgroud)

是检查返回数组的大小.它总是0,每次我得到错误.如果我的设备在当前运行中之前没有建立任何连接,也会发生错误.当我收到另一台设备的错误时,我也能看到我的设备广告并用第二台设备触发命令.

更新10/06:

  • 我让我的应用程序运行整晚以检查是否没有任何内存泄漏或大量资源使用,这是我在后台运行~12-14小时后的结果.内存/ CPU使用情况与我离开时完全相同.这让我觉得我的应用程序没有任何泄漏可能导致iOS关闭它以恢复内存/ CPU使用率.

资源使用分析

更新08/06:

  • 请注意,这不是一个广告问题,因为我们的BLE设备始终处于供电状态,我们使用了我们能找到的最强的BLE电子卡.
  • 在后台iOS检测时间也不是问题.我等了很长时间(20~30分钟)才确定不是这个问题.

原始问题

我目前正在开发一个处理与BLE设备通信的应用程序.我的一个限制是,只有在必须发送命令或读取数据时才必须连接到此设备.我必须在完成后尽快断开连接,以允许其他潜在用户也这样做.

该应用程序的一个功能如下:

  • 用户可以在应用程序处于后台时启用自动命令.如果在10分钟内未检测到设备,则会触发此自动命令.
  • 我的应用会扫描,直到找到我的BLE设备.
  • 为了在需要时保持清醒,我每次都重新开始扫描,因为CBCentralManagerScanOptionAllowDuplicatesKey选项无知.
  • 当它被检测到时,我正在检查最后一次检测是否超过10分钟.如果是这种情况,我连接到设备,然后写入对应于我需要的服务的特性.

目标是在用户进入范围时触发此设备.它可能会在超出范围几分钟后发生几个小时,这取决于我的用户习惯.

一切都以这种方式运作良好,但有时(似乎在随机时间发生),扫描类型"冻结".我的过程做得很好,但经过几次,我看到我的应用程序扫描,但我的didDiscoverPeripheral:回调从未被调用,即使我的测试设备正好在我的BLE设备前面.有时它可能需要一段时间来检测它,但在这里,几分钟后没有任何反应.

我以为iOS可能已经杀死我的应用程序以声明内存,但当我关闭和蓝牙时,centralManagerDidUpdateState:被称为正确的方式.如果我的应用程序被杀,那不应该是这样吗?如果我打开我的应用程序,扫描将重新启动,它将恢复生机.我还检查了iOS在180秒的活动后没有关闭我的应用程序,但事实并非如此,因为它在这段时间后运行良好.

我已经建立了我的.plist有正确的设置(蓝牙中央UIBackgroundModes).管理所有BLE处理的我的班级作为单身人士存储在我的AppDelegate中,可通过我的所有应用程序访问.我也测试过切换我正在创建这个对象的地方.目前我正在应用程序中创建它:didFinishLaunchingWithOptions:方法.我试着将它放在我的AppDelegate init中:但是如果我这样做的话,每次我在后台时扫描都会失败.

我不知道我的代码的哪一部分可以告诉你,以帮助你更好地理解我的过程.以下是一些可能有用的示例.请注意," AT_appDelegate "是一个maccro,以便访问我的AppDelegate.

// Init of my DeviceManager class that handles all BLE processing …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c background-process ios core-bluetooth

15
推荐指数
1
解决办法
3582
查看次数

核心蓝牙 - 范围内设备的不断RSSI更新

我刚刚开始使用iOS的核心蓝牙框架,我正在开发一个需要不断扫描BLE设备的应用程序,以便我可以每分钟检索一次RSSI编号.

目前我有:

manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[manager scanForPeripheralsWithServices:nil options:options];
Run Code Online (Sandbox Code Playgroud)

这启动我的应用程序扫描BLE设备并在发现设备时调用此委托方法:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData);
    //Do something when a peripheral is discovered.

    rssiLabel.text = [RSSI stringValue];

    [manager retrievePeripherals:[NSArray arrayWithObject:(id)peripheral.UUID]];}
Run Code Online (Sandbox Code Playgroud)

这个方法得到我可以显示的外围设备的RSSI号码.最后一行然后调用此委托方法:

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals {

    NSLog(@"Currently known peripherals :");
    int i = 0;
    for(CBPeripheral *peripheral in peripherals) …
Run Code Online (Sandbox Code Playgroud)

ios ios5 core-bluetooth

14
推荐指数
1
解决办法
2万
查看次数

iOS可以同时在同一个应用程序上执行中央和外围设备吗?

iOS(iPhone或iPad)应用程序可以同时拥有Core Bluetooth(BTLE)中央管理器和外围管理器对象吗?

它们可以异步操作,还是主应用程序线程需要使它们共享(来回切换).

共享概念算法将是:禁用外围设备管理器,启用中央管理器并执行中央功能,然后禁用中央管理器,启用外围设备mgr,并执行外围功能(即发送自动数据,等待并响应远程特性命令),重复......

背景技术细节:我们有一个本地系统,有多个iOS设备和多个非iOS设备,需要通过BTLE进行互通.非iOS设备均使用Broadcom BCM20732蓝牙LE芯片.但硬件还没有准备好,所以我使用iOS设备来模拟非iOS,这需要同步中央和外围功能,即.1.充当集中询问系统中多个其他非iOS设备的核心.2.充当外围设备以响应来自iOS用户界面设备的数据请求.

bluetooth ios core-bluetooth

14
推荐指数
2
解决办法
5926
查看次数

什么时候CBCentralManager的状态会启动,但仍然给我一个"未启动"警告?

当我运行在iPhone 5上使用CoreBluetooth的应用程序时,我一直收到此错误: <CBConcreteCentralManager: 0x2007d590> is not powered on

但是当我调用state我的程序的唯一一个CBCentralManager对象时,它返回5,即CBCentralManagerStatePoweredOn.所以它已启动,但我收到此错误.iPhone的蓝牙也已启用.

总的来说,什么时候会发生?我甚至不知道程序运行时发生了什么,因为我得到了看起来像冲突的消息.

iphone bluetooth ios core-bluetooth cbcentralmanager

14
推荐指数
1
解决办法
9078
查看次数

使用CoreBluetooth读取长特征值

我有一个包含图像数据的特征值.在外围设备中我设置了如下值:

_photoUUID = [CBUUID UUIDWithString:bPhotoCharacteristicUUID];
_photoCharacteristic = [[CBMutableCharacteristic alloc] initWithType:_photoUUID
                                                          properties:CBCharacteristicPropertyRead
                                                               value:Nil
                                                         permissions:CBAttributePermissionsReadable];
Run Code Online (Sandbox Code Playgroud)

我的理解是,当请求此值时,将调用didRecieveRequest回调:

-(void) peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request {

    if ([request.characteristic.UUID isEqual:_photoUUID]) {
        if (request.offset > request.characteristic.value.length) {
            [_peripheralManager respondToRequest:request withResult:CBATTErrorInvalidOffset];
            return;
        }
        else {
            // Get the photos
            if (request.offset == 0) {
                _photoData = [NSKeyedArchiver archivedDataWithRootObject:_myProfile.photosImmutable];
            }

            request.value = [_photoData subdataWithRange:NSMakeRange(request.offset, request.characteristic.value.length - request.offset)];
            [_peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这几乎来自Apple的文档.在didDiscoverCharacteristic回调的中央一侧,我有以下代码:

if ([characteristic.UUID isEqual:_photoUUID]) {
    _photoCharacteristic = characteristic;
    [peripheral readValueForCharacteristic:characteristic];
}
Run Code Online (Sandbox Code Playgroud)

而这反过来调用didUpdateValueCorCharacteristic回调:

- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic …
Run Code Online (Sandbox Code Playgroud)

bluetooth objective-c ios core-bluetooth

14
推荐指数
1
解决办法
1万
查看次数

检查蓝牙状态 - Swift 4

我在Xcode中遇到蓝牙问题.我找不到一个很好的解决方案,如何检查蓝牙是否打开.我想要那个.我在网上搜索了一些解决方案,但没有什么对我有用.有关如何检查蓝牙的任何想法?我导入了CoreBluetooth类,我编写了这行代码:

if CBPeripheralManager.authorizationStatus() == .denied { code }
if CBPeripheralManager.authorizationStatus() == .authorized  { code }
Run Code Online (Sandbox Code Playgroud)

ios core-bluetooth swift

14
推荐指数
1
解决办法
1万
查看次数