iOS BLE开发中,遇到的一些坑

2020-03-14  本文已影响0人  程序猿类码农

最近接触到了蓝牙的一些东西,基础的我就不复述了,一搜都是,今天就来说说,我在BLE开发中遇到的一些坑.

    1、创建一个CBCentralManager实例来进行蓝牙管理;

    2、搜索扫描外围设备;

    3、连接外围设备;

    4、获得外围设备的服务;

    5、获得服务的特征;

    6、从外围设备读取数据;

    7、给外围设备发送(写入)数据。

前五条就不说了,说说从外围设备读取数据,返回的数据从

- (void)peripheral:(CBPeripheral*)peripheraldidUpdateValueForCharacteristic:(CBCharacteristic*)characteristicerror:(NSError*)error{

返回,但是大家一定要问硬件工程师,返回的数据是一次性的还是分段返回,有的数据量太大,蓝牙设备不能一次性返回,如果分段返回,还需要拼接第二个是返回的数据是十六进制类型的,是转成十进制格式的,还是转成字符串格式的,我当时在开发两个设备,结果第二个就搞了好长时间

十六进制转十进制

NSString * temp10 = [NSString stringWithFormat:@"%lu",strtoul([[NSString stringWithFormat:@"%@%@%@",string3,string2,string1] UTF8String],0,16)]

十六进制转字符串

- (NSString*)stringFromHexString:(NSString*)hexString {

    for(NSString * toRemove in [NSArray arrayWithObjects:@" ",@"<",@">", nil])

        hexString = [hexStringstringByReplacingOccurrencesOfString:toRemove withString:@""];

    // The hex codes should all be two characters.

    if(([hexStringlength] %2) !=0)

        return nil;

    NSMutableString *string = [NSMutableString string];

    for(NSIntegeri =0; i < [hexStringlength]; i +=2) {

        NSString *hex = [hexString substringWithRange:NSMakeRange(i, 2)];

        NSIntegerdecimalValue =0;

        sscanf([hexUTF8String],"%x", &decimalValue);

        [stringappendFormat:@"%c", decimalValue];

    }

    returnstring;

}

写入数据:

[_bluetoothManager.connectedPeripheral writeValue:data forCharacteristic:self.characteristic type:CBCharacteristicWriteWithResponse];(Type最好用CBCharacteristicWriteWithResponse,写入成功后会走代理方法)

写入数据时必须为data类型的,当时我把字符串直接转成data类型的,然后就一直不成功,最后硬件工程师告诉我,要转成十六进制的才可以.

将十六进制字符串转换成data类型

- (NSData *)convertHexStrToData:(NSString *)str

{

    if(!str || [strlength] ==0) {

        returnnil;

    }

    NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:20];

    NSRangerange;

    if([strlength] %2==0) {

        range =NSMakeRange(0,2);

    }else{

        range =NSMakeRange(0,1);

    }

    for(NSIntegeri = range.location; i < [strlength]; i +=2) {

        unsignedintanInt;

        NSString*hexCharStr = [strsubstringWithRange:range];

        NSScanner*scanner = [[NSScanneralloc]initWithString:hexCharStr];

        [scannerscanHexInt:&anInt];

        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];

        [hexDataappendData:entity];

        range.location+= range.length;

        range.length=2;

    }

    returnhexData;

}

如果type用的是CBCharacteristicWriteWithResponse,写入后,会在

- (void)peripheral:(CBPeripheral*)peripheraldidWriteValueForCharacteristic:(CBCharacteristic*)characteristicerror:(NSError*)error

返回,切记,一定要判断error是否为空,为空时是写入成功,非空就是写入了但是写入失败.

我暂时就是遇到这两个坑.

上一篇下一篇

猜你喜欢

热点阅读