296 lines
7.3 KiB
Objective-C
Executable File
296 lines
7.3 KiB
Objective-C
Executable File
//
|
||
// ENHMDGlucoDevice.m
|
||
// ENBLEProject
|
||
//
|
||
// Created by lvwang2002 on 16/4/7.
|
||
// Copyright © 2016年 Facebook. All rights reserved.
|
||
//
|
||
|
||
#import "ENHMDGlucoDevice.h"
|
||
static NSString *displayName = @"好轻松血糖仪";
|
||
@implementation ENHMDGlucoDevice{
|
||
NSArray *_characteristics;
|
||
}
|
||
-(id)initWithPeripheral:(CBPeripheral *)peripheral WithCentralManager:(CBCentralManager *)centerManager WithDevice:(BLEDevice *)device{
|
||
self = [super initWithPeripheral:peripheral WithCentralManager:centerManager WithDevice:device];
|
||
if(self){
|
||
|
||
|
||
}
|
||
return self;
|
||
}
|
||
|
||
-(NSString *)getDeviceDisplayName{
|
||
return displayName;
|
||
}
|
||
|
||
|
||
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
|
||
if (error){
|
||
NSLog(@"didDiscoverServices : %@", [error localizedDescription]);
|
||
return;
|
||
}
|
||
|
||
for (CBService * service in peripheral.services) {
|
||
/**
|
||
* 查找自己需要的UUID的服务
|
||
*/
|
||
|
||
// if ([[self.advertisementData[@"kCBAdvDataServiceUUIDs"] firstObject] isEqual:service.UUID]) {
|
||
|
||
/**
|
||
* 查找外围设备特性
|
||
*/
|
||
[peripheral discoverCharacteristics:nil forService:service];
|
||
|
||
}
|
||
}
|
||
|
||
- (void)peripheral:(CBPeripheral *)peripheral
|
||
didDiscoverCharacteristicsForService:(CBService *)service
|
||
error:(NSError *)error{
|
||
if (error){
|
||
NSLog(@"didDiscoverCharacteristicsForService error : %@", [error localizedDescription]);
|
||
return;
|
||
}
|
||
|
||
_characteristics = service.characteristics;
|
||
|
||
for (CBCharacteristic * cbCharacteristic in service.characteristics) {
|
||
|
||
// NSLog(@"获取的UUID为:%@", cbCharacteristic.UUID.UUIDString);
|
||
|
||
if ([cbCharacteristic.UUID isEqual:[CBUUID UUIDWithString:@"2A18"]]) {
|
||
[peripheral setNotifyValue:YES forCharacteristic:cbCharacteristic];
|
||
}
|
||
|
||
if ([cbCharacteristic.UUID.UUIDString isEqual:@"2A25"]) {
|
||
[peripheral readValueForCharacteristic:cbCharacteristic];
|
||
}
|
||
}
|
||
}
|
||
|
||
//- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
|
||
// [self caculateWithData:[characteristic value]];
|
||
//}
|
||
|
||
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForReceiveData:(NSData *)data UUID:(CBUUID *)uuid error:(NSError *)error{
|
||
[self caculateWithData:data];
|
||
}
|
||
|
||
|
||
#pragma mark - 计算
|
||
- (void)caculateWithData:(NSData *)data{
|
||
Byte * byte = (Byte *)[data bytes];
|
||
NSString *hexStr=@"";
|
||
NSMutableArray * array = [NSMutableArray array];
|
||
for(int i=0;i<[data length];i++){
|
||
NSString *newHexStr = [NSString stringWithFormat:@"%x",byte[i]&0xff]; ///16进制数
|
||
if([newHexStr length]==1){
|
||
hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
|
||
[array addObject:[NSString stringWithFormat:@"0%@",newHexStr]];
|
||
}else{
|
||
hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
|
||
[array addObject:newHexStr];
|
||
}
|
||
}
|
||
// NSLog(@"bytes 的16进制数为:%@",hexStr);
|
||
|
||
|
||
if (array.count == 15) {
|
||
NSString * str1 = array[array.count - 2];
|
||
NSString * str2 = array[array.count - 3];
|
||
|
||
NSString *strHex = [NSString stringWithFormat:@"%@%@",str2, str1];
|
||
NSString *strResult = [self getBinaryByhex:strHex];
|
||
|
||
NSString *strM = [strHex substringWithRange:NSMakeRange(1, 3)];
|
||
NSString *strN = [strResult substringWithRange:NSMakeRange(0, 4)];
|
||
NSLog(@"---%@", strResult);
|
||
|
||
unsigned long resultM = [self getLongIntWithString:strM];
|
||
unsigned long resultN = [self getIntWithString:strN];
|
||
|
||
float myResultValue = resultM;
|
||
float resultP = powl(10, (16 - resultN));
|
||
|
||
float resultBlood = myResultValue / resultP;
|
||
NSLog(@"blood %@",@(resultBlood));
|
||
// info[@"Glucose"] = @((b[9]&0xff) + 256*(b[10]&0xff));
|
||
|
||
dispatch_async(dispatch_get_main_queue(), ^{
|
||
NSString *glucoseValue = [NSString stringWithFormat:@"%d.%d",(int)resultBlood,((int)(resultBlood*10)%10)];
|
||
NSDictionary *info = @{
|
||
@"Glucose":@(resultBlood),
|
||
@"displayValue":glucoseValue} ;
|
||
|
||
if([self.deviceDelegate respondsToSelector:@selector(getResult:WithDevice:)]){
|
||
[(id)self.deviceDelegate getResult:info WithDevice:_device];
|
||
}
|
||
});
|
||
|
||
|
||
} else {
|
||
NSLog(@"code is %@",hexStr);
|
||
}
|
||
}
|
||
|
||
//将16进制转化为二进制
|
||
-(NSString *)getBinaryByhex:(NSString *)hex
|
||
{
|
||
NSMutableDictionary *hexDic = [[NSMutableDictionary alloc] init];
|
||
|
||
hexDic = [[NSMutableDictionary alloc] initWithCapacity:16];
|
||
|
||
[hexDic setObject:@"0000" forKey:@"0"];
|
||
|
||
[hexDic setObject:@"0001" forKey:@"1"];
|
||
|
||
[hexDic setObject:@"0010" forKey:@"2"];
|
||
|
||
[hexDic setObject:@"0011" forKey:@"3"];
|
||
|
||
[hexDic setObject:@"0100" forKey:@"4"];
|
||
|
||
[hexDic setObject:@"0101" forKey:@"5"];
|
||
|
||
[hexDic setObject:@"0110" forKey:@"6"];
|
||
|
||
[hexDic setObject:@"0111" forKey:@"7"];
|
||
|
||
[hexDic setObject:@"1000" forKey:@"8"];
|
||
|
||
[hexDic setObject:@"1001" forKey:@"9"];
|
||
|
||
[hexDic setObject:@"1010" forKey:@"A"];
|
||
|
||
[hexDic setObject:@"1011" forKey:@"B"];
|
||
|
||
[hexDic setObject:@"1100" forKey:@"C"];
|
||
|
||
[hexDic setObject:@"1101" forKey:@"D"];
|
||
|
||
[hexDic setObject:@"1110" forKey:@"E"];
|
||
|
||
[hexDic setObject:@"1111" forKey:@"F"];
|
||
|
||
[hexDic setObject:@"1010" forKey:@"a"];
|
||
|
||
[hexDic setObject:@"1011" forKey:@"b"];
|
||
|
||
[hexDic setObject:@"1100" forKey:@"c"];
|
||
|
||
[hexDic setObject:@"1101" forKey:@"d"];
|
||
|
||
[hexDic setObject:@"1110" forKey:@"e"];
|
||
|
||
[hexDic setObject:@"1111" forKey:@"f"];
|
||
|
||
NSMutableString *binaryString=[[NSMutableString alloc] init];
|
||
|
||
for (int i=0; i<[hex length]; i++) {
|
||
|
||
NSRange rage;
|
||
|
||
rage.length = 1;
|
||
|
||
rage.location = i;
|
||
|
||
NSString *key = [hex substringWithRange:rage];
|
||
|
||
//NSLog(@"%@",[NSString stringWithFormat:@"%@",[hexDic objectForKey:key]]);
|
||
|
||
binaryString = [[NSString stringWithFormat:@"%@%@",binaryString,[NSString stringWithFormat:@"%@",[hexDic objectForKey:key]]] mutableCopy];
|
||
|
||
}
|
||
|
||
//NSLog(@"转化后的二进制为:%@",binaryString);
|
||
|
||
return binaryString;
|
||
}
|
||
|
||
#pragma mark - 二进制转变成十进制
|
||
- (unsigned long)getIntWithString:(NSString *)hex
|
||
{
|
||
unsigned long resultValue = 0;
|
||
|
||
for (NSInteger j = 0; j < hex.length; j++) {
|
||
char value = [hex characterAtIndex:j];
|
||
NSInteger i = hex.length - 1 - j;
|
||
if (value == '0') {
|
||
resultValue += 0 * powl(2, i);
|
||
} else if (value == '1') {
|
||
resultValue += 1 * powl(2, i);
|
||
}
|
||
}
|
||
|
||
return resultValue;
|
||
}
|
||
|
||
#pragma mark - 十六进制转变成十进制
|
||
- (unsigned long)getLongIntWithString:(NSString *)hex
|
||
{
|
||
unsigned long resultValue = 0;
|
||
|
||
for (NSInteger j = 0; j < hex.length; j++) {
|
||
char value = [hex characterAtIndex:j];
|
||
NSInteger i = hex.length - 1 - j;
|
||
|
||
NSInteger valueR = [self charToInt:value];
|
||
resultValue += valueR * powl(16, i);
|
||
}
|
||
return resultValue;
|
||
}
|
||
|
||
- (NSInteger)charToInt:(char)value
|
||
{
|
||
if (value == '0') {
|
||
return 0;
|
||
} else if (value == '1') {
|
||
return 1;
|
||
} else if (value == '2') {
|
||
return 2;
|
||
} else if (value == '3') {
|
||
return 3;
|
||
} else if (value == '4') {
|
||
return 4;
|
||
} else if (value == '5') {
|
||
return 5;
|
||
} else if (value == '6') {
|
||
return 6;
|
||
} else if (value == '7') {
|
||
return 7;
|
||
} else if (value == '8') {
|
||
return 8;
|
||
} else if (value == '9') {
|
||
return 9;
|
||
} else if (value == 'a') {
|
||
return 10;
|
||
} else if (value == 'A') {
|
||
return 10;
|
||
} else if (value == 'b') {
|
||
return 11;
|
||
} else if (value == 'B') {
|
||
return 11;
|
||
} else if (value == 'c') {
|
||
return 12;
|
||
} else if (value == 'C') {
|
||
return 12;
|
||
} else if (value == 'd') {
|
||
return 13;
|
||
} else if (value == 'D') {
|
||
return 13;
|
||
} else if (value == 'e') {
|
||
return 14;
|
||
} else if (value == 'E') {
|
||
return 14;
|
||
} else if (value == 'f') {
|
||
return 15;
|
||
} else if (value == 'F') {
|
||
return 15;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
@end
|