【问题标题】:Unable to write data into hardware peripheral无法将数据写入硬件外围设备
【发布时间】:2013-11-04 23:56:33
【问题描述】:

我正在使用 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];
        }
    }
}

【问题讨论】:

    标签: ios objective-c cocoa-touch core-bluetooth cbperipheral


    【解决方案1】:

    这不是您在这里遇到的基于核心蓝牙的问题。

    对于调试,您可以使用

    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' 混合在一起。

    【讨论】:

    • 我们如何处理 ASCII 0 和二进制 0 以将它们转换为字节流?另外,对于字符串,我按照您提到的方式进行操作,但是我的硬件似乎不接受数据,因此想更改它。根据规范,对于硬件,我需要发送转换为 NSData 的字节流。有什么建议吗?
    • 蓝牙 LE 没有流的概念,只有读/写单个数据包的特征。你的规格描述很模糊,我不明白你到底想发送什么。
    • 如果您的协议需要发送二进制 0,那么如果您发送 ascii 字符“0”显然将无法正常工作。 ASCII“0”是二进制的 0x30。见asciitable.com
    • char c = '0'; NSData* 有效负载 = [NSData dataWithBytes:&c length:1];
    • 我会试试这个。感谢您分享此信息。
    【解决方案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

    【讨论】:

      【解决方案3】:

      只需使用 https://github.com/LGBluetooth/LGBluetooth 它会让你的工作轻松 100 倍

      【讨论】:

      • 该仓库不再可用。
      • @skladek 可以在这里找到:LGBluetooth 但它已经过时了。你可以在网上找到用 Obj-C 和 Swift 编写的其他包装器
      猜你喜欢
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 2019-12-13
      • 1970-01-01
      相关资源
      最近更新 更多