IOS/Android 读取蓝牙设备电量信息
来源:互联网 发布:2016年就业数据 编辑:程序博客网 时间:2024/05/22 04:40
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]);
}
}
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*modelin _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:@" = "] && [serverDatacontainsString:@"<"] && [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;
- (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*modelin _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:@" = "] && [serverDatacontainsString:@"<"] && [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);
}
}
* 扫描设备
*
* @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);
}
}
};
1 0
- IOS/Android 读取蓝牙设备电量信息
- iOS --- 获取iOS设备的电量信息:Battery Level
- 获取ios设备电量
- 获取ios设备电量
- IOS -iphone设备信息读取
- Android设备电量监控
- Android设备电量监控
- ZgiBee读取温度电量信息
- Android7.0 获取蓝牙设备电量
- Android电量信息
- iOS获取设备全局信息方法总结(如信号,电量,设备标示)
- iOS获取设备全局信息方法总结(如信号,电量,设备标示)
- iOS获取设备全局信息方法总结(如信号,电量,设备标示)
- iOS开发-获取设备电量
- 获取iOS设备信息(内存/电量/容量/型号/IP地址/当前WIFI名称)
- 获取iOS设备信息(内存/电量/容量/型号/IP地址/当前WIFI名称)
- 获取iOS设备信息(内存/电量/容量/型号/IP地址/当前WIFI名称)
- Android 获取手机电量信息
- Elasticsearch的坑
- jQ选择器
- js判断undefined类型
- 常用代码生成工具汇总(转)
- OpenCV - win7+vs2013(2012)+opencv3.0.0 环境配置
- IOS/Android 读取蓝牙设备电量信息
- 去掉Android新建项目的顶部标题-application:Theme
- iOS6、7、8、9区别和新特性
- 第一个struts2程序
- Vue.js数据绑定
- python抓取糗事百科段子 图片
- 如何递归创建Ttee的Node
- 将数组中值为0的项去掉,将不为0的值存入一个新的数组,生成新数组
- spring MVC的实现原理