ios - iOS。 discoverCharacteristics方法调用SIGABRT信号

标签 ios objective-c bluetooth core-bluetooth cbperipheral

我正在使用CoreBluetooth,并且discoverCharacteristics方法有问题。

我初始化了服务和特性,因此:

m_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

CBUUID *uuid = [CBUUID UUIDWithString:ServiceUUID];
m_services = [NSArray arrayWithObject:uuid];

CBMutableCharacteristic *characteristics = [CBMutableCharacteristic alloc];
characteristics = [characteristics initWithType:uuid
                                     properties:CBCharacteristicPropertyWriteWithoutResponse
                                          value:nil
                                    permissions:CBAttributePermissionsWriteable];
m_characteristics = [NSArray arrayWithObject:characteristics];

我的ServiceUUID@"ffe0"
- (void) centralManagerDidUpdateState:(CBCentralManager *)central
{
    m_scanLabel = [UILabel new];
    [self addLabel:m_scanLabel topPadding:TextFieldFirstPadding];

    if (central.state == CBCentralManagerStatePoweredOn)
    {
        m_scanLabel.text = @"Launch scan";

        m_timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                   target:self
                                                 selector:@selector(scan)
                                                 userInfo:nil
                                                  repeats:YES];
    }
    else
    {
        m_scanLabel.text = @"Error connection. Check bluetooth state";
        [m_timer invalidate];
    }

    [m_scanLabel sizeToFit];
}

- (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    // todo check right peripheral

    m_peripheralLabel = [UILabel new];
    [self addLabel:m_peripheralLabel topPadding:CGRectGetMaxY(m_scanLabel.frame)];

    [m_timer invalidate];

    if (m_peripheral == nil)
    {
        m_peripheral = peripheral;

        m_peripheralLabel.text = @"Connecting...";
        [m_peripheralLabel sizeToFit];

        [m_centralManager connectPeripheral:peripheral options:nil];
    }
    else
    {
        [m_centralManager retrieveConnectedPeripheralsWithServices:m_services];
    }
}

- (void) centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    [m_centralManager stopScan];

    peripheral.delegate = self;

    m_didConnectLabel = [UILabel new];
    [self addLabel:m_didConnectLabel topPadding:CGRectGetMaxY(m_peripheralLabel.frame)];
    m_didConnectLabel.text = @"Connected. Launch discover";
    [m_didConnectLabel sizeToFit];

    [peripheral discoverServices:m_services];
}

- (void) centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    m_timer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                               target:self
                                             selector:@selector(scan)
                                             userInfo:nil
                                              repeats:YES];
}

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error
{
    for (CBService *service in peripheral.services)
    {
        [peripheral discoverCharacteristics:m_characteristics forService:service];
    }
}

应用程序在以下位置崩溃:[peripheral discoverCharacteristics:m_characteristics forService:service];
使用这样的日志(这里我使用了1802服务,但结果相同):
* thread #1: tid = 0x1710ca, 0x0000000199e15d3c libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1
frame #0: 0x0000000199e15d3c libobjc.A.dylib`objc_exception_throw
frame #1: 0x000000018d9befdc CoreFoundation`+[NSException raise:format:] + 128
frame #2: 0x000000018d688464 CoreBluetooth`-[CBXpcConnection allocXpcObjectWithNSObject:] + 556
frame #3: 0x000000018d688590 CoreBluetooth`-[CBXpcConnection allocXpcArrayWithNSArray:] + 252
frame #4: 0x000000018d6883e0 CoreBluetooth`-[CBXpcConnection allocXpcObjectWithNSObject:] + 424
frame #5: 0x000000018d6887b4 CoreBluetooth`-[CBXpcConnection allocXpcDictionaryWithNSDictionary:] + 360
frame #6: 0x000000018d687b48 CoreBluetooth`-[CBXpcConnection allocXpcMsg:args:] + 104
frame #7: 0x000000018d687bd4 CoreBluetooth`-[CBXpcConnection sendAsyncMsg:args:] + 32
frame #8: 0x000000018d687c20 CoreBluetooth`-[CBXpcConnection sendMsg:args:] + 36
frame #9: 0x000000010002daa0 SampleApp`-[ViewController peripheral:didDiscoverServices:](self=0x0000000126e04900, _cmd=0x00000001913f147c, peripheral=0x00000001700bb120, error=0x0000000000000000) + 364 at ViewController.m:121
frame #10: 0x000000018d682c08 CoreBluetooth`-[CBPeripheral handleServicesDiscovered:] + 756
frame #11: 0x000000018d67ed88 CoreBluetooth`-[CBCentralManager xpcConnection:didReceiveMsg:args:] + 136
frame #12: 0x000000018d687e38 CoreBluetooth`__34-[CBXpcConnection handleMsg:args:]_block_invoke + 84
frame #13: 0x000000019a3e4420 libdispatch.dylib`_dispatch_call_block_and_release + 24
frame #14: 0x000000019a3e43e0 libdispatch.dylib`_dispatch_client_callout + 16
frame #15: 0x000000019a3e756c libdispatch.dylib`_dispatch_main_queue_callback_4CF + 344
frame #16: 0x000000018d97ed64 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
frame #17: 0x000000018d97d0a4 CoreFoundation`__CFRunLoopRun + 1452
frame #18: 0x000000018d8bdb38 CoreFoundation`CFRunLoopRunSpecific + 452
frame #19: 0x000000019329f830 GraphicsServices`GSEventRunModal + 168
frame #20: 0x00000001908fc0e8 UIKit`UIApplicationMain + 1156
frame #21: 0x000000010002e7e0 SampleApp`main(argc=1, argv=0x000000016fdd7ca8) + 116 at main.m:16
frame #22: 0x000000019a3ffaa0 libdyld.dylib`start + 4

我做错了什么?

最佳答案

问题是要传递给peripheral discoverCharacteristics的m_characteristics是CBMutableCharacteristics数组,而应该是CBUUID数组。所以,你应该有

m_characteristics = [NSArray arrayWithObject:uuid];

其中uuid是根据您的特征性uuid字符串创建的CBUUID。

关于ios - iOS。 discoverCharacteristics方法调用SIGABRT信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22632890/

相关文章:

iOS - iOS 设备和外部附件(蓝牙 watch )之间 BLE 数据传输的 MTU 大小

调用 stopDeviceMotionUpdates() 后抛出 iOS CoreMotion.MotionThread EXC_BAD_ACCESS

ios - 使用 NSURLCache 的离线模式

objective-c - 如何使用 C Obj C 或 Swift 扫描网络中的设备

ios - 在 iOS 中使用深度链接检查应用程序版本

Android 蓝牙 Le 扫描仪在一段时间后停止

ios - 解释从 iOS 中的蓝牙体重秤设备接收到的字节

ios - 在没有与设备配对的 Apple-ID 的情况下签署应用程序以进行两步验证

ios - 创建一个 SKShapeNodes 数组

ios - 某些 youtube 视频无法在 UIWebView 中播放。显示 - (发生错误请稍后重试)