// // ENGGlucoDevice.m // RNBTDevice // // Created by zcwmac on 2019/5/15. // Copyright © 2019年 zmxv. All rights reserved. // #import "ENGGlucoDevice.h" #import "ENDLog.h" static NSString* UUID_BTLE_SERVICE = @"49535343-fe7d-4ae5-8fa9-9fafd205e455"; static NSString* UUID_BTLE_SEND = @"49535343-8841-43f4-a8d4-ecbe34729bb3"; static NSString* UUID_BTLE_RECEIVE = @"49535343-1e4d-4bd9-ba61-23c647249616"; static NSString *displayName = @"G系列血糖测试仪"; @implementation ENGGlucoDevice{ CBCharacteristic *_sendCharacteristic; } -(instancetype)initWithPeripheral:(CBPeripheral *)peripheral WithCentralManager:(CBCentralManager *)centerManager WithDevice:(BLEDevice *)device{ self = [super initWithPeripheral:peripheral WithCentralManager:centerManager WithDevice:device]; if(self){ } return self; } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ //找到服务,开始扫描指定的服务 NSArray *array = [peripheral services]; for( CBService *service in array ){ // NSString *uuid = [NSString stringWithFormat:@"%@",service.UUID]; CBUUID *serviceUUID = [CBUUID UUIDWithString:UUID_BTLE_SERVICE]; // ENDLog([NSString stringWithFormat:@"service uuid%@",serviceUUID]); if([serviceUUID isEqual:service.UUID]){ NSArray *uuids = @[[CBUUID UUIDWithString:UUID_BTLE_SEND], [CBUUID UUIDWithString:UUID_BTLE_RECEIVE]]; [peripheral discoverCharacteristics:uuids forService:service]; break; } } } - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error;{ CBUUID *sendUUID = [CBUUID UUIDWithString:UUID_BTLE_SEND]; CBUUID *receiveUUID = [CBUUID UUIDWithString:UUID_BTLE_RECEIVE]; for( CBCharacteristic *characteristic in service.characteristics){ NSString *log =[NSString stringWithFormat:@"characteristic is %@",characteristic]; ENLog(log); if([characteristic.UUID isEqual:sendUUID]){ _sendCharacteristic = characteristic; unsigned char data[2] = {0xff,0xaa}; // [peripheral writeValue:[NSData dataWithBytes:&data length:2] forCharacteristic:characteristic type:CBCharacteristicWriteWithoutResponse]; [self sendData:[NSData dataWithBytes:data length:2]]; continue; } if([characteristic.UUID isEqual:receiveUUID]){ [peripheral setNotifyValue:YES forCharacteristic:characteristic]; } } } - (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ CBUUID *receiveUUID = [CBUUID UUIDWithString:UUID_BTLE_RECEIVE]; if( [receiveUUID isEqual:characteristic.UUID]){ [[ENDLog share] log:[NSString stringWithFormat:@"receive gluco data:%@",characteristic.value]]; if([self checkedCommandIntegrityWithData:characteristic.value]){ Byte *dat = (Byte *)[[characteristic value] bytes]; Byte callbackByte[2] = {0xff,dat[2]}; [self sendData:[NSData dataWithBytes:callbackByte length:2]]; dispatch_async(dispatch_get_main_queue(), ^{ NSDictionary *info = [self data2GlucoseWithData:[characteristic value]]; //血糖 if([self.deviceDelegate respondsToSelector:@selector(getResult:WithDevice:)]){ [(id)self.deviceDelegate getResult:info WithDevice:_device]; } }); } } } /** 处理函数 */ -(BOOL)checkedCommandIntegrityWithData:(NSData *)data{ //长度检测 if(data.length<7){ return false; } Byte *b = (Byte *)[data bytes]; //报文头检测 if(b[0] != 0x40){ return false; } //有效命令长度检测 if(b[3] != (data.length - 6)){ return false; } if([self checkedRepeatCommandWithData:data]){ return false; } return true; } //private static int queId = -1; /** 校验是否是重复指令 */ -(BOOL)checkedRepeatCommandWithData:(NSData *)data{ static int queId = -1; Byte *b = (Byte *)[data bytes]; int m = (b[2]&0xff); if(m == queId){ return true; } //2.将该条命令的顺序id写入缓存 queId = m; //4.返回false. return false; } -(NSDictionary *)data2GlucoseWithData:(NSData *)data{ Byte *b = (Byte *)[data bytes]; NSMutableDictionary *info = [[NSMutableDictionary alloc] initWithCapacity:10]; info[@"year"] = @(2000+(b[6] & 0xff)); info[@"month"] = @(b[4] & 0xff); info[@"date"] = @(b[5] & 0xff); info[@"hour"] = @(b[7] & 0xff); info[@"minute"] = @(b[8] & 0xff); info[@"Glucose"] = @((b[11]&0xff) + 256*(b[10]&0xff-128)); // info[@"mask"] = @(b[11]&0xff); // info[@"flag"]= @((b[12]&0xff) + 256*(b[13]&0xff)); // if([info[@"flag"] integerValue]>=4096){ // float value = [info[@"Glucose"] floatValue]/10; // NSString *displayValue = [NSString stringWithFormat:@"%d.%d",(int)value,((int)(value*10)%10)]; // info[@"displayValue"] = displayValue; // }else{ // String displayValue = new BigDecimal((data.getGlucose() * 0.055) + 0.0001).setScale(1, RoundingMode.HALF_UP).toString(); float value = [info[@"Glucose"] floatValue]* 0.055+0.0001; // NSString *glucoseValue = [NSString stringWithFormat:@"%d.%d",(int)value,((int)(value*10)%10)]; NSString *glucoseValue = [NSString stringWithFormat:@"%0.1f",value]; // info[@"Glucose"] =glucoseValue; info[@"displayValue"] = glucoseValue; // } return [info copy]; } /** 发送数据 */ -(void)sendData:(NSData *)data{ [_peripheral writeValue:data forCharacteristic:_sendCharacteristic type:CBCharacteristicWriteWithoutResponse]; } /** 得到设备显示名字 */ -(NSString *)getDeviceDisplayName{ return displayName; } @end