美文网首页
iOS BLE开发中,遇到的一些坑

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

作者: 程序猿类码农 | 来源:发表于2020-03-14 15:54 被阅读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是否为空,为空时是写入成功,非空就是写入了但是写入失败.

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

    相关文章

      网友评论

          本文标题:iOS BLE开发中,遇到的一些坑

          本文链接:https://www.haomeiwen.com/subject/rwoishtx.html