iOS BLE开发中,遇到的一些坑
最近接触到了蓝牙的一些东西,基础的我就不复述了,一搜都是,今天就来说说,我在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是否为空,为空时是写入成功,非空就是写入了但是写入失败.
我暂时就是遇到这两个坑.