react-native-bt-device/ios/RNBTDevice/Device/ENSanDyGlucoseDevice.m

360 lines
12 KiB
Mathematica
Raw Normal View History

2024-03-24 09:45:44 +00:00
//
// ENSanDyGlucoseDevice.m
// RNBTDevice
//
// Created by lvwang2002 on 2019/5/12.
// Copyright © 2019 zmxv. All rights reserved.
//
#import "ENSanDyGlucoseDevice.h"
@implementation ENSanDyGlucoseDevice{
CBCharacteristic *_sendCharacteristic;
NSString *connectedStatus;
int requestCode;
}
const NSString *PREPARE = @"PREPARE";
const NSString *CREATING_CHANNEL = @"CREATING_CHANNEL";
const NSString *CREATED_CHANNEL = @"CREATED_CHANNEL";
const NSString *START_AUTHORIZATION = @"START_AUTHORIZATION";
const NSString *AUTHORIZATION_SUCCESSFUL = @"AUTHORIZATION_SUCCESSFUL";
const NSString *AUTHORIZATION_FAILED = @"AUTHORIZATION_FAILED";
static NSString* UUID_BTLE_SERVICE = @"0000ffb0-0000-1000-8000-00805f9b34fb";
static NSString* UUID_BTLE_SEND = @"0000ffb2-0000-1000-8000-00805f9b34fb";
static NSString* UUID_BTLE_RECEIVE = @"0000ffb2-0000-1000-8000-00805f9b34fb";
const unsigned char SET = 0x61;
const unsigned char GET = 0x62;
const unsigned char VOLTAGE = 0X01;
const unsigned char DATA = 0x02;
//V09: 0X02
//V55: 0X03
//RECORD(only GET) 0X02
const unsigned char NDFI = 0x04;
const unsigned char ADFI = 0x05;
const unsigned char AD = 0x07;
const UInt8 AC = 0x06;
const unsigned char MONITOR = 0X08;
const unsigned char START = 0X01;
const unsigned char STOP = 0X03;
const UInt8 BATTERY = 0x11;
const UInt8 NAME = 0x0f;
const UInt8 SN = 0x13;
const UInt8 VERSION = 0x14;
const UInt8 AUTHO = 0x0B;
const unsigned char cmdStartMonitor[]={SET, MONITOR, START};
const unsigned char cmdStopMonitorp[] = {SET, MONITOR, STOP};
unsigned char cmdGetNumberDataFromIndex[] = {GET, NDFI, 0x00,0x00,0x00,0x00};
unsigned char cmdGetAllDataFromIndex[] = {GET,ADFI,0x00,0x00};
UInt8 cmdGetAllDataCount[] = {GET,AC};
UInt8 cmdGetAllData[] = {GET,AD};
UInt8 cmdGetBattery[] = {GET,BATTERY};
UInt8 cmdGetName[] = {GET,NAME};
UInt8 cmdGetSN[] = {GET,SN};
UInt8 cmdGetVersion[] = {GET,VERSION};
UInt8 cmdDoAuthorization[] = {GET,AUTHO,0x00,0x00,0x00,0x00,0x00,0x00};
UInt8 cmdGetMonitorStatus[] = {GET,MONITOR};
-(instancetype)initWithPeripheral:(CBPeripheral *)peripheral WithCentralManager:(CBCentralManager *)centerManager WithDevice:(BLEDevice *)device{
self = [super initWithPeripheral:peripheral WithCentralManager:centerManager WithDevice:device];
if(self){
connectedStatus = [PREPARE copy];
requestCode = 0;
}
return self;
}
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{
//,
NSArray *array = [peripheral services];
for( CBService *service in array ){
CBUUID *serviceUUID = [CBUUID UUIDWithString:UUID_BTLE_SERVICE];
if([serviceUUID isEqual:service.UUID]){
NSArray *uuids = @[[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];
connectedStatus = [CREATING_CHANNEL copy];
for( CBCharacteristic *characteristic in service.characteristics){
NSString *log =[NSString stringWithFormat:@"characteristic is %@",characteristic];
ENLog(log);
if([characteristic.UUID isEqual:sendUUID]){
_sendCharacteristic = characteristic;
}
if([characteristic.UUID isEqual:receiveUUID]){
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
}
}
connectedStatus = [CREATED_CHANNEL copy];
if([self.deviceDelegate respondsToSelector:@selector(onCreatedChannel:)]){
[(id)self.deviceDelegate onCreatedChannel:_device];
}
}
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForReceiveData:(NSData *)data UUID:(CBUUID *)uuid error:(NSError *)error{
CBUUID *receiveUUID = [CBUUID UUIDWithString:UUID_BTLE_RECEIVE];
if( [receiveUUID isEqual:uuid]){
Byte *command = (Byte *)[data bytes];
NSLog(@"RNDY device rcv data:%@",data);
NSLog(@"RNDY rcv data length:%lu",(unsigned long)[data length]);
if([data length] == 9 && command[3]==0x63 && command[4]==0x00){
// <0e240163 00150007 02>
// <0e240163 00160007 02>
UInt16 index = command[6]*256+command[5];
double value = (command[8]*256+command[7])/10.0;
if([self.deviceDelegate respondsToSelector:@selector(onUpdateNewDataDevice:Index:ElecValue:)]){
[(id)self.deviceDelegate onUpdateNewDataDevice:_device
Index:index
ElecValue:value];
}
return;
}
if(requestCode == 1){ //
// <18021c02 22021f02 1f021c02 1c021c02 1f021c02>
NSArray *array =[self byteToElecArray:command Length:[data length]];
if([self.deviceDelegate respondsToSelector:@selector(onGetProgressData:DataList:Index:)]) {
[(id)self.deviceDelegate onGetProgressData:_device DataList:array Index:0];
}
return;
}
UInt8 CMD = (UInt8)command[4];
switch (CMD) {
//
case MONITOR:{
if(command[3] == GET){
bool isSuc = (command[5]==START);
if([self.deviceDelegate respondsToSelector:@selector(onGetMonitorStatus:IsStartMonitor:)]) {
[(id)self.deviceDelegate onGetMonitorStatus:_device IsStartMonitor:isSuc];
}
}else{
UInt8 status = command[5];
if(status == START){
if([self.deviceDelegate respondsToSelector:@selector(onStartMonitor:IsSuc:)]){
[(id)self.deviceDelegate onStartMonitor:_device IsSuc:true];
}
}else if(status == STOP){
if([self.deviceDelegate respondsToSelector:@selector(onStopMonitor:IsSuc:)]){
[(id)self.deviceDelegate onStopMonitor:_device IsSuc:true];
}
}
}
}
break;
case BATTERY:{
double value = (command[2]*256+command[1])/100.0;
if([self.deviceDelegate respondsToSelector:@selector(onGetBattery:Value:)]){
[(id)self.deviceDelegate onGetBattery:_device Value:value];
}
}
break;
//
case NDFI:
case ADFI:
case AD:{
// NSArray *array = [self byteToElecArray:&data[3] Length:[[characteristic value] length]];
requestCode = 1;
}
break;
case AC:{
if([self.deviceDelegate respondsToSelector:@selector(onAuthenticated:IsSuc:)]){
// <0e260162 060000>
UInt16 count = [self bytesToIntHigh:command[6] Low:command[5]];
[(id)self.deviceDelegate onGetAllDataCount:_device Count:count];
}
}
break;
case AUTHO:{
connectedStatus = [AUTHORIZATION_SUCCESSFUL copy];
if([self.deviceDelegate respondsToSelector:@selector(onAuthenticated:IsSuc:)]){
[(id)self.deviceDelegate onAuthenticated:_device IsSuc:true];
}
}
break;
}
}
}
-(void)parseUpdateData:(UInt8 *)data{
UInt16 index = data[5]+data[6]*256;
double elecValue = (data[7]+data[8]*256)/10.0;
if([self.deviceDelegate respondsToSelector:@selector(onAuthenticated:IsSuc:)]){
[(id)self.deviceDelegate
onUpdateNewDataDevice:_device
Index:index
ElecValue:elecValue];
}
}
/** */
-(void)sendData:(NSData *)data{
if(_peripheral == nil || _sendCharacteristic == nil){
//,.
return;
}
NSLog(@"RNDY send data:%@",data);
dispatch_async([[ENBLEDeviceManager shareDeviceManager] getPostQueue], ^{
[_peripheral writeValue:data forCharacteristic:_sendCharacteristic type:CBCharacteristicWriteWithoutResponse];
});
}
-(void)startMonitor{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdStartMonitor length:3];
[self sendData:data];
}
-(void)stopMonitor{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdStopMonitorp length:3];
[self sendData:data];
}
-(void)getNumberDataFromIndex:(UInt16)index Count:(UInt16)count{
requestCode = 0;
unsigned char numberArray[2];
numberArray[0] = (unsigned char)(count>>8);
numberArray[1] = (unsigned char)(count&0x00ff);
unsigned char indexArray[2];
indexArray[0] = (unsigned char)(index>>8);
indexArray[1] = (unsigned char)(index&0x00ff);
cmdGetNumberDataFromIndex[2] = numberArray[1];
cmdGetNumberDataFromIndex[3] = numberArray[0];
cmdGetNumberDataFromIndex[4] = indexArray[1];
cmdGetNumberDataFromIndex[5] = indexArray[0];
NSData *data = [NSData dataWithBytes:cmdGetNumberDataFromIndex length:6];
[self sendData:data];
}
-(void)getAllDataFromIndex:(UInt16)index{
requestCode = 0;
UInt8 indexArray[2];
indexArray[0] = (unsigned char)(index>>8);
indexArray[1] = (unsigned char)(index&0x00ff);
cmdGetAllDataFromIndex[2] = indexArray[1];
cmdGetAllDataFromIndex[3] = indexArray[0];
NSData *data = [NSData dataWithBytes:cmdGetAllDataFromIndex length:4];
[self sendData:data];
}
-(void)getAllDataCount{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdGetAllDataCount length:2];
[self sendData:data];
}
-(void)getAllData{
requestCode = 1;
NSData *data = [NSData dataWithBytes:cmdGetAllData length:2];
[self sendData:data];
}
-(void)getBattery{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdGetBattery length:2];
[self sendData:data];
}
-(void)getName{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdGetName length:2];
[self sendData:data];
}
-(void)getSN{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdGetSN length:2];
[self sendData:data];
}
-(void)getMonitorStatus{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdGetMonitorStatus length:2];
[self sendData:data];
}
-(void)getMonitorVersion{
requestCode = 0;
NSData *data = [NSData dataWithBytes:cmdGetVersion length:2];
[self sendData:data];
}
-(void)doAuthorization{
connectedStatus = [START_AUTHORIZATION copy];
NSData *data = [NSData dataWithBytes:cmdDoAuthorization length:8];
[self sendData:data];
}
-(NSArray *)byteToElecArray:(UInt8 *)data Length:(UInt16)length{
NSMutableArray *array = [[NSMutableArray alloc] init];
for(int i=0;i<length;i=i+2){
if(i==length-1){
break;
}
UInt16 value = [self bytesToIntHigh:data[i+1] Low:data[i]];
[array addObject:[NSNumber numberWithDouble:value/10.0]];
}
return [array copy];
}
-(UInt16)bytesToIntHigh:(UInt8)high Low:(UInt8)low{
return high*256+low;
}
-(NSString *)getConnectedStatus{
return connectedStatus;
}
@end