1

CoreBlueTooth API を使用して、ハードウェア製造会社から受け取った周辺機器にデータを書き込んでいます。仕様によると、彼らはデータを書き込むための一連の特性 UUID を提供してくれました。終了したい場合は、特性の 1 つに 0 を書き込む必要があります。問題は、文字列/整数を送信して NSData に変換しようとすると、機能しないことです。それらの書き込み可能な特性でバイトストリームを送信する必要があると思います。NSString & NSNumber データを送信する前にバイトストリームに変換する方法を教えてください。以下は、私が試した変換コードです。

- (void)writeCharactersticData:(NSDictionary *)iData toPeripheral:(CBPeripheral *)iPeripheral {
    NSArray *charactersticsIDs = [NSArray arrayWithArray:iData.allKeys];
    self.writeCharactersticsCount  = charactersticsIDs.count;

    for (CBUUID *uuid in charactersticsIDs) {
        if (self.peripheralCharacterstics[uuid]) {



            NSData *payload;

            if ([iData[uuid] isKindOfClass:[NSNumber class]]) {
                NSInteger data = ((NSNumber *)iData[uuid]).integerValue;
//                int integerSize = sizeof(data);
//                
//                uint8_t bytes[integerSize];
//                
//                
//                NSLog(@"Integer data = %d", data);
//                
//                int8_t tx = (int8_t)data;
//                bytes[0] = tx;
//                payload = [NSData dataWithBytes:bytes length:sizeof(data)];

                payload = [NSData dataWithBytes:&data length:sizeof(data)];
            } else if ([iData[uuid] isKindOfClass:[NSString class]]) {

                int stringSize = sizeof(iData[uuid]);
                uint8_t bytes[stringSize];
                NSScanner *scanner = [NSScanner scannerWithString:iData[uuid]];

                for (int i=0; i<stringSize; i++) {
                    unsigned int value;
                    [scanner scanHexInt:&value];
                    bytes[i] = (uint8_t)value;
                }

                payload = [NSData dataWithBytes:bytes length:stringSize];
//                payload = [iData[uuid] dataUsingEncoding:NSUTF8StringEncoding];
            }

            [self.discoveredPeripheral writeValue:payload forCharacteristic:self.peripheralCharacterstics[uuid] type:CBCharacteristicWriteWithResponse];
        }
    }
}
4

3 に答える 3

2

ここに修正があります、それは私のために働きます

//Integer to NSData
+(NSData *) IntToNSData:(NSInteger)data
{
    Byte *byteData = (Byte*)malloc(4);
    byteData[3] = data & 0xff;
    byteData[2] = (data & 0xff00) >> 8;
    byteData[1] = (data & 0xff0000) >> 16;
    byteData[0] = (data & 0xff000000) >> 24;
    NSData * result = [NSData dataWithBytes:byteData length:4];
    NSLog(@"result=%@",result);
    return (NSData*)result;
}

//NSData to Integer
+(NSInteger) NSDataToInt:(NSData *)data
{
    unsigned char bytes[4];
    [data getBytes:bytes length:4];
    NSInteger n = (int)bytes[0] << 24;
    n |= (int)bytes[1] << 16;
    n |= (int)bytes[2] << 8;
    n |= (int)bytes[3];
    return n;
}

http://coding-snippet.blogspot.in/2013/05/blog-post.htmlに感謝します

于 2013-12-10T14:48:20.833 に答える
1

これはコア Bluetooth ベースの問題ではありません。

デバッグには、使用できます

NSLog(@"%@", payload);

文字列から NSData への変換の場合、アプローチは非常に複雑に見えます。次のような簡単なものをお勧めします

NSData* payload = [iData[uuid] dataUsingEncoding:NSUTF8StringEncoding];
if (payload.length > 20)
{
    // handle error. most LE peripherals don't support longer values.
}

もう 1 つのエラーは、値を書き込むときにASCII 0'0'と 2 進数のゼロを混在させることです。'\0'

于 2013-10-26T11:14:39.990 に答える
0

https://github.com/LGBluetooth/LGBluetoothを使用するだけ で、仕事が 100 倍簡単になります

于 2014-02-15T10:15:57.763 に答える