8

1 つは周辺機器 (iOS 7 を実行する iPad 第 4 世代) として、もう 1 つは中央 (iOS 7 を実行する iPhone 5c) としての 2 つのアプリケーションがあります。

中央が一握りのバイト (約 4 バイトですが、実行ごとに異なる可能性があります) を書き込む周辺デバイス内に書き込み可能な特性が必要です。

次のように周辺機器を構成しています。

-(void)startPeripheral
{
    CBMutableService *service = [[CBMutableService alloc]initWithType:[CBUUID UUIDWithString:kMyServiceUUID] primary:YES];
    CBMutableCharacteristic *ch = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:kMyWriteUUID] properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];
    service.characteristics = @[ch];

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@[[CBUUID UUIDWithString:kMyServiceUUID]], CBAdvertisementDataServiceUUIDsKey, @"My Peripheral", CBAdvertisementDataLocalNameKey, nil];

    [self.peripheralManager addService:service];
    [self.peripheralManager startAdvertising:dict];

    NSLog(@"Service = %@",service);
}

これはすべて最初は機能しているように見えます。周辺機器はサービスをアドバタイズし、セントラルはサービスと特性をスキャン、検索、発見し、関心のある特性を見つけることができます。特性に書き込もうとすると問題が発生します。

セントラルでは、次の方法があります。

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
    NSLog(@"Service/Characteristics = %@",service.characteristics);
    for(CBCharacteristic *ch in service.characteristics)
    {
        NSLog(@"Characteristic properties = %x",ch.properties);
        NSLog(@"Characterisctic = %@",ch.UUID);
        if([ch.UUID isEqual:[CBUUID UUIDWithString:kMyWriteUUID]])
        {
            // We've found our write characteristic
            NSLog(@"Writing data to characteristic %@",ch.UUID);
            NSData *data = [NSData dataWithBytes:(Byte[]){1,2,3,4} length:4];
            [peripheral writeValue:data forCharacteristic:ch type:CBCharacteristicWriteWithResponse];
        }
    }
 }

エラーを示す didWriteValueForCharacteristic へのコールバックを取得します。

エラー ドメイン = CBATTErrorDomain コード = 14 「ありそうもないエラーです。」

これはあまり役に立ちません。

誰かが問題を見つけたり、解決策を提案したりできますか?

ありがとう、リッチ

4

3 に答える 3

0

次のコールバックを取得するまで、サービスを追加しないようにしてください。

- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral

次に、周辺機器の CBPeripheralManagerStatePoweredOn の状態を確認します。周辺機器の電源が入っていないときにサービスを追加することは無効です。

于 2014-01-29T19:11:41.393 に答える
0

ペリフェラル側でデリゲートをタイプミスしたときに同じエラーが発生しました。実装されているデリゲート署名を再確認してください

私が書いた

-(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequest:(NSArray *)requests

それ以外の

-(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray *)requests

(最初のバージョンで欠落している「s」を参照してください)

于 2015-08-11T08:28:52.757 に答える
0

エラーが何であるかは私には明らかではありませんが、

  1. コールバックを受信した後でのみ、広告を開始する必要がありperipheralManager:didAddService:error:ます。
  2. 対応するデバイスのコンソール ログを添付していただけますか? (オーガナイザー -> 電話 -> コンソールを使用)
于 2013-11-10T10:45:44.560 に答える