IOS/Android 读取蓝牙设备电量信息
|
使用系统API扫描到蓝牙设备:
IOS使用到的framework
1.CoreBluetooth/CoreBluetooth.h
Android使用到的framework
1.android.bluetooth.BluetoothAdapter
2.android.bluetooth.BluetoothDevice
3.android.bluetooth.BluetoothManager
蓝牙默认广播中是不会带有电量信息的,但是可以通过定制蓝牙硬件的方式,手动添加额外信息ServiceData,然后使用IOS/Android原生的API扫描蓝牙广播数据,并根据自己定义的协议对其进行解析便可得到蓝牙电量信息。
IOS 代码示例
- (void)centralManager:(CBCentralManager*)central
didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary<NSString*,id>
*)advertisementData RSSI:(NSNumber*)RSSI {
NSArray *keys = [advertisementData allKeys]; for (inti = 0; i < [keyscount]; ++i) { id key = [keys objectAtIndex: i]; NSString *keyName = (NSString*) key; NSObject *value = [advertisementData objectForKey: key]; if ([value isKindOfClass: [NSArrayclass]]) { printf("key01: %s\n", [keyName cStringUsingEncoding:NSUTF8StringEncoding]); NSArray *values = (NSArray*) value; for (intj = 0; j < [valuescount]; ++j) { if ([[values objectAtIndex: j]isKindOfClass: [CBUUIDclass]]) { CBUUID *uuid = [values objectAtIndex: j]; NSData *data = uuid.data; printf("UUID(%d):", j); for (intj = 0; j < data.length; ++j) printf(" %2X", ((UInt8*) data.bytes)[j]); printf("\n"); } else { const char *valueString = [[value description]cStringUsingEncoding:NSUTF8StringEncoding]; printf(" value(%d): %s\n", j, valueString); } } } else { const char *valueString = [[value description]cStringUsingEncoding:NSUTF8StringEncoding]; if([keyNameisEqualToString:@"kCBAdvDataServiceData"]) { NSString *string = [NSStringstringWithUTF8String:valueString]; [selfcheckAndAddNewDevice:string]; } NSLog(@" key02: %s, value: %@\n", [keyName cStringUsingEncoding:NSUTF8StringEncoding], [NSStringstringWithUTF8String:valueString]); } } }
//解析广播包
- (void)checkAndAddNewDevice:(NSString*)serverData { void (^CallBack)() = ^(){ if(self.delegate&& [self.delegaterespondsToSelector:@selector(updateDataSources:)]) { [self.delegateupdateDataSources:_bleArray]; } self.status= (self.bleArray&& self.bleArray.count>0) ? BLEStatus_Gotit : BLEStatus_NoDevices; if(self.delegate&& [self.delegaterespondsToSelector:@selector(didScannerStatusChanged:)]) { [self.delegatedidScannerStatusChanged:_status]; } }; BLEModel *newModel = [selfbluetoothServerDataAnalyzer:serverData]; BOOL exist = false; if(! newModel)return; if(!_bleArray) _bleArray = [NSMutableArraynew]; for(BLEModel*model in _bleArray) { if([model.b_macisEqualToString:newModel.b_mac]) exist = true; } if(!exist) { [_bleArrayaddObject:newModel]; CallBack();; } } - (BLEModel*)bluetoothServerDataAnalyzer:(NSString*)serverData { BLEModel *model = nil; if(!serverData) { return nil; } if([serverDatacontainsString:@" = "] && [serverData containsString:@"<"] && [serverData containsString:@">"]) { NSArray *array = [serverData componentsSeparatedByString:@" = "]; if(array.count== 2) { NSString *data = array[1]; data = [data stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet ]]; data = [data stringByReplacingOccurrencesOfString:@" "withString:@""]; if(data.length== 21) { NSString *body = [data substringWithRange:NSMakeRange(1, data.length-5)]; NSString *b_version = [body substringWithRange:NSMakeRange(0,2)]; NSString *b_bettery = [body substringWithRange:NSMakeRange(2,2)]; NSString *b_mac = [body substringWithRange:NSMakeRange(4, body.length-4)]; model = [[BLEModelalloc]init:b_versionbettery:b_betterymac:b_mac]; // NSLog(@"版本:%@电量:%@ mac:%@", model.b_version, model.b_bettery, model.b_mac); } } } return model; }
|
Android 代码示例
/**
* 扫描设备 * * @param enable */ private void scanLeDevice(booleanenable) { if (enable) { mHandler.postDelayed(newRunnable() { @Override public void run() { // TODO Auto-generated method stub mBluetoothAdapter.stopLeScan(mLeScanCallback); invalidateOptionsMenu(); } }, SCAN_PERIOD);//在搜索时间内,关闭搜索标志,不对搜索回调函数进行响应 mBluetoothAdapter.startLeScan(mLeScanCallback); } else { mBluetoothAdapter.stopLeScan(mLeScanCallback); } Logger.error(TAG, "是否开始扫描="+ enable); invalidateOptionsMenu(); } // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(finalBluetoothDevice device, int rssi, byte[] scanRecord) { final IBeaconClass.IBeacon ibeacon = IBeaconClass.fromScanData(device, rssi, scanRecord); if (ibeacon == null)return; try { String strTemp = StringUtil.bytesToHexString(scanRecord); Logger.error(TAG, strTemp.length() + "=长度,回调方法-onLeScan()="+ strTemp);//0201061aff4c000215fda50693a4e24fb1afcfc6eb07647825000a0007c5090942523531343633310b1642523d6400cdff003ab100000000000000000000 if (!TextUtils.isEmpty(strTemp)) { String usefulData = strTemp.substring(86,106);//4252 3d6400cdff003a9e Logger.error(TAG, usefulData.length() + "=长度,回调方法-onLeScan()截取有用数据usefulData="+ usefulData); // String serviceID1 = usefulData.substring(2); // String serviceID = usefulData.substring(2, 4); // if (serviceID.equals("52")) { String strVersion = usefulData.substring(4,6); int intVersion = Integer.parseInt(strVersion, 16); String strPower = usefulData.substring(6,8); int intPower = Integer.parseInt(strPower, 16); Logger.error(TAG, strVersion + "=strVersion回调方法-onLeScan(),版本值intVersion="+ intVersion); Logger.error(TAG, strPower + "=strPower回调方法-onLeScan(),电量值intPower="+ intPower); if (intPower > 0) { ibeacon.version = intVersion; ibeacon.power = intPower; runOnUiThread(newRunnable() { @Override public void run() { adapter.addDevice(ibeacon); } }); } // } } } catch (Exception e) { Logger.error(TAG, "解析蓝牙数据出错="+ e); } } };
|