Ios 无法将数据写入硬件外围设备

Ios 无法将数据写入硬件外围设备,ios,objective-c,cocoa-touch,core-bluetooth,cbperipheral,Ios,Objective C,Cocoa Touch,Core Bluetooth,Cbperipheral,我正在使用CoreBlueTooth API将数据写入我们从某硬件制造公司收到的外围设备。根据规范,他们为我们提供了一系列可以写入数据的UUID特性。一旦我们想要完成,我们需要在其中一个特征中写入0。现在的问题是,当我试图发送字符串/整数并将其转换为NSData时,它就不起作用了。我想我需要在这些可写特性中发送字节流。有人能帮助我在发送之前如何将NSString和NSNumber数据转换成字节流吗。以下是我尝试使用的转换代码: - (void)writeCharactersticData:(NS

我正在使用CoreBlueTooth API将数据写入我们从某硬件制造公司收到的外围设备。根据规范,他们为我们提供了一系列可以写入数据的UUID特性。一旦我们想要完成,我们需要在其中一个特征中写入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];
        }
    }
}
-(void)writeCharactersticData:(NSDictionary*)iData TopPeriperal:(CBPeriperal*)IPERiperal{
NSArray*CharacteristicsId=[NSArray数组及其数组:iData.allKeys];
self.writeCharacteristicsCount=characteristics.count;
for(字符ID中的CBUUID*uuid){
if(自身外围设备特性[uuid]){
NSData*有效载荷;
如果([iData[uuid]是类的种类:[NSNumber类]]){
NSInteger数据=((NSNumber*)iData[uuid])。整数值;
//int integerSize=sizeof(数据);
//                
//uint8_t字节[整数化];
//                
//                
//NSLog(@“整数数据=%d”,数据);
//                
//int8_t tx=(int8_t)数据;
//字节[0]=tx;
//有效负载=[NSData dataWithBytes:字节长度:sizeof(data)];
有效负载=[NSData dataWithBytes:&数据长度:sizeof(data)];
}如果([iData[uuid]是类的kindofClass:[NSString类]]),则为else{
int stringSize=sizeof(iData[uuid]);
uint8_t字节[stringSize];
NSScanner*scanner=[NSScanner scannerWithString:iData[uuid]];

对于(int i=0;i这不是一个基于蓝牙的核心问题

对于调试,您可以使用

NSLog(@"%@", payload);
对于字符串到NSData的转换,您的方法似乎非常复杂

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

另一个错误可能是,在写入值时,将ASCII 0
'0'
与二进制零
'\0'
混合使用。

这是修复方法,它对我有效

//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;
}
//整数到NSData
+(NSData*)IntToNSData:(NSInteger)数据
{
字节*字节数据=(字节*)malloc(4);
byteData[3]=数据&0xff;
字节数据[2]=(数据&0xff00)>>8;
字节数据[1]=(数据&0xff0000)>>16;
字节数据[0]=(数据&0xff000000)>>24;
NSData*result=[NSData dataWithBytes:byteData长度:4];
NSLog(@“结果=%@”,结果);
返回(NSData*)结果;
}
//将数据转换为整数
+(NSInteger)NSDATATOTOINT:(NSData*)数据
{
无符号字符字节[4];
[data getBytes:字节长度:4];
NSInteger n=(int)字节[0]只需使用

这将使您的工作更轻松100倍

我们如何处理ASCII 0和二进制0以将它们转换为字节流?另外,对于字符串,我是按照您提到的方式进行的,但我的硬件似乎不接受数据,所以考虑更改它。根据规格,对于硬件,我需要发送转换为NSData的字节流。有什么建议吗?蓝牙LE doesn没有流的概念,只有单个数据包的读/写特性。您的规范描述非常模糊,我不明白您到底想发送什么。如果您的协议要求发送二进制0,那么如果您发送ascii字符“0”。ascii“0”显然不起作用是二进制的0x30。请参阅.char c='0';NSData*payload=[NSData dataWithBytes:&c length:1];我将尝试使用它。感谢您共享此信息。该repo不再可用。@skladek它在此处可用:但它是旧的。您可以在线找到其他用Obj-c和Swift编写的包装器