Преглед изворни кода

增加广播身高仪解析类

master
liujilai@elinkthings.com пре 1 година
родитељ
комит
4054aeb0d5

+ 3
- 3
app/build.gradle Прегледај датотеку

@@ -6,8 +6,8 @@ android {
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid"
minSdkVersion 19
targetSdkVersion 31
versionCode 18
versionName "1.10.60"
versionCode 19
versionName "1.10.61"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
@@ -42,7 +42,7 @@ dependencies {
testImplementation 'junit:junit:4.12'
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.13.1'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.3'//OTA库,需要依赖核心库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.8.3'//蓝牙解析库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.8.4'//蓝牙解析库
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'

+ 180
- 123
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/modules/broadcast_height/BroadcastHeightActivity.java Прегледај датотеку

@@ -26,14 +26,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig;

public class BroadcastHeightActivity extends BleBaseActivity implements OnCallbackDis, OnScanFilterListener {
import aicare.net.cn.sdk.ailinksdkdemoandroid.R;
import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity;
import cn.net.aicare.modulelibrary.module.broadcastheight.BroadCastHeightConfig;
import cn.net.aicare.modulelibrary.module.broadcastheight.BroadCastHeightDeviceData;

public class BroadcastHeightActivity extends BleBaseActivity implements OnCallbackDis, OnScanFilterListener,BroadCastHeightDeviceData.OnNotifyHeightData {

private Context mContext;

@@ -43,6 +45,9 @@ public class BroadcastHeightActivity extends BleBaseActivity implements OnCallba
private ArrayAdapter mListAdapter;

private String mMac;
private String mac;

private BroadCastHeightDeviceData mBroadCastHeightDeviceData;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -71,7 +76,10 @@ public class BroadcastHeightActivity extends BleBaseActivity implements OnCallba

@Override
public void unbindServices() {

if (mBroadCastHeightDeviceData != null) {
mBroadCastHeightDeviceData.clear();
mBroadCastHeightDeviceData = null;
}
}

@Override
@@ -104,127 +112,128 @@ public class BroadcastHeightActivity extends BleBaseActivity implements OnCallba
public void onScanRecord(BleValueBean bleValueBean) {
if (TextUtils.isEmpty(mMac) && bleValueBean.isBroadcastModule()) {
// 是广播模块
if (bleValueBean.getCid() == 0x03) {
if (bleValueBean.getCid() == BroadCastHeightConfig.BROAD_CAST_HEIGHT) {
// 是身高仪,进行数据解析
notifyData(bleValueBean.getManufacturerData(), bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid(), bleValueBean.getMac());
}
}
}

/**
* @param manufacturerData 自定义厂商数据0xFF后面的数据
* @param cid cid 设备类型
* @param vid vid
* @param pid pid
*/
private void notifyData(byte[] manufacturerData, int cid, int vid, int pid, String mac) {
if (manufacturerData == null) {
addText("接收到的数据:null");
return;
}
if (manufacturerData.length >= 20) {
byte sum = manufacturerData[9];
byte[] data = new byte[10];
System.arraycopy(manufacturerData, 10, data, 0, data.length);
byte newSum = cmdSum(data);
if (newSum == sum) {
// addText("接收到的数据:原始数据:" + BleStrUtils.byte2HexStr(data));
byte[] bytes;
byte[] dataOriginal = data.clone();
if (cid != 0 || vid != 0 || pid != 0) {
//数据需要解密
if (cid == BroadcastScaleBleConfig.BROADCAST_SCALE_LING_YANG_CID) {
bytes = AiLinkPwdUtil.decryptLingYang(data);
} else {
bytes = AiLinkPwdUtil.decryptBroadcast(cid, vid, pid, data);
}
} else {
bytes = data;
}

// addText("接收到的数据:" + BleStrUtils.byte2HexStr(bytes));
checkData(bytes, cid, vid, pid, mac);
} else {
addText("校验和错误");
mac = bleValueBean.getMac();
mBroadCastHeightDeviceData.onNotifyData(bleValueBean.getManufacturerData(), bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid());
// notifyData(bleValueBean.getManufacturerData(), bleValueBean.getCid(), bleValueBean.getVid(), bleValueBean.getPid(), bleValueBean.getMac());
}
}
}

// 上一次的流水号
private int mLastSerialNum = -1;

/**
* 解析数据
*
* @param hex 解密后的数据
* @param cid cid
* @param vid vid
* @param pid pid
*/
private void checkData(byte[] hex, int cid, int vid, int pid, String mac) {
// 流水号
int serialNum = hex[0];
if (serialNum == mLastSerialNum) {
return;
}
mLastSerialNum = serialNum;

// 测量标识
int flag = hex[1] & 0xff;
// 身高原始数据
int heightOrigin = (hex[2] & 0xff) << 8 | (hex[3] & 0xff);
// 身高单位 0:cm;1:inch;2:ft-in
int heightUnit = (hex[4] & 0xff) & 0x0f;
// 身高小数点
int heightDecimal = ((hex[4] & 0xff) & 0xf0) >> 4;
// 体重原始数据
int weightOrigin = (hex[5] & 0xff) << 8 | (hex[6] & 0xff);
// 体重单位 0:kg;1:斤;2:lb:oz;3:oz;4:st:lb;5:g;6:lb
int weightUnit = (hex[7] & 0xff) & 0x0f;
// 体重正负号
int weightSymbol = ((hex[7] & 0xff) & 0x10) >> 4;
// 体重小数点
int weightDecimal = ((hex[7] & 0xff) & 0xe0) >> 5;
// 电量
int battery = hex[8] & 0xff;

// 输出
String text = "";
text += "MAC地址:" + mac;
text += "\n数据解析:" + BleStrUtils.byte2HexStr(hex);
text += "\n测量标识:" + flag + ":" + getFlagStr(flag);
text += "\n身高原始数据:" + heightOrigin;
text += "\n身高单位:" + heightUnit;
text += "\n身高小数点:" + heightDecimal;
text += "\n身高最终值:" + getHeightStr(heightOrigin, heightUnit, heightDecimal);

if (weightOrigin != 0xffff) {
text += "\n体重原始数据:" + weightOrigin;
text += "\n体重单位:" + weightUnit;
text += "\n体重正负号:" + weightSymbol;
text += "\n体重小数点:" + weightDecimal;
text += "\n体重最终值:" + getWeightStr(weightOrigin, weightUnit, weightDecimal, weightSymbol);
} else {
text += "\n体重:" + "不支持";
}
if (battery != 0xff) {
text += "\n电量:" + battery;
} else {
text += "\n电量:" + "不支持";
}
addText(text);
}
// /**
// * @param manufacturerData 自定义厂商数据0xFF后面的数据
// * @param cid cid 设备类型
// * @param vid vid
// * @param pid pid
// */
// private void notifyData(byte[] manufacturerData, int cid, int vid, int pid, String mac) {
// if (manufacturerData == null) {
// addText("接收到的数据:null");
// return;
// }
// if (manufacturerData.length >= 20) {
// byte sum = manufacturerData[9];
// byte[] data = new byte[10];
// System.arraycopy(manufacturerData, 10, data, 0, data.length);
// byte newSum = cmdSum(data);
// if (newSum == sum) {
//// addText("接收到的数据:原始数据:" + BleStrUtils.byte2HexStr(data));
// byte[] bytes;
// if (cid != 0 || vid != 0 || pid != 0) {
// //数据需要解密
// if (cid == BroadcastScaleBleConfig.BROADCAST_SCALE_LING_YANG_CID) {
// bytes = AiLinkPwdUtil.decryptLingYang(data);
// } else {
// bytes = AiLinkPwdUtil.decryptBroadcast(cid, vid, pid, data);
// }
// } else {
// bytes = data;
// }
//
//// addText("接收到的数据:" + BleStrUtils.byte2HexStr(bytes));
// checkData(bytes, cid, vid, pid, mac);
// } else {
// addText("校验和错误");
// }
// }
// }
//
// // 上一次的流水号
// private int mLastSerialNum = -1;
//
// /**
// * 解析数据
// *
// * @param hex 解密后的数据
// * @param cid cid
// * @param vid vid
// * @param pid pid
// */
// private void checkData(byte[] hex, int cid, int vid, int pid, String mac) {
// // 流水号
// int serialNum = hex[0];
// if (serialNum == mLastSerialNum) {
// return;
// }
// mLastSerialNum = serialNum;
//
// // 测量标识
// int flag = hex[1] & 0xff;
// // 身高原始数据
// int heightOrigin = (hex[2] & 0xff) << 8 | (hex[3] & 0xff);
// // 身高单位 0:cm;1:inch;2:ft-in
// int heightUnit = (hex[4] & 0xff) & 0x0f;
// // 身高小数点
// int heightDecimal = ((hex[4] & 0xff) & 0xf0) >> 4;
// // 体重原始数据
// int weightOrigin = (hex[5] & 0xff) << 8 | (hex[6] & 0xff);
// // 体重单位 0:kg;1:斤;2:lb:oz;3:oz;4:st:lb;5:g;6:lb
// int weightUnit = (hex[7] & 0xff) & 0x0f;
// // 体重正负号
// int weightSymbol = ((hex[7] & 0xff) & 0x10) >> 4;
// // 体重小数点
// int weightDecimal = ((hex[7] & 0xff) & 0xe0) >> 5;
// // 电量
// int battery = hex[8] & 0xff;
//
// // 输出
// String text = "";
// text += "MAC地址:" + mac;
// text += "\n数据解析:" + BleStrUtils.byte2HexStr(hex);
// text += "\n测量标识:" + flag + ":" + getFlagStr(flag);
// text += "\n身高原始数据:" + heightOrigin;
// text += "\n身高单位:" + heightUnit;
// text += "\n身高小数点:" + heightDecimal;
// text += "\n身高最终值:" + getHeightStr(heightOrigin, heightUnit, heightDecimal);
//
// if (weightOrigin != 0xffff) {
// text += "\n体重原始数据:" + weightOrigin;
// text += "\n体重单位:" + weightUnit;
// text += "\n体重正负号:" + weightSymbol;
// text += "\n体重小数点:" + weightDecimal;
// text += "\n体重最终值:" + getWeightStr(weightOrigin, weightUnit, weightDecimal, weightSymbol);
// } else {
// text += "\n体重:" + "不支持";
// }
// if (battery != 0xff) {
// text += "\n电量:" + battery;
// } else {
// text += "\n电量:" + "不支持";
// }
// addText(text);
// }

private String getFlagStr(int flag) {
String str = "";
switch (flag) {
case 0:
case BroadCastHeightConfig.MEASURING:
str = "正在测量";
break;
case 1:
case BroadCastHeightConfig.MEASURING_STABLE:
str = "稳定身高体重";
break;
case 0xff:
case BroadCastHeightConfig.MEASURING_FAILED:
str = "测量失败";
break;
}
@@ -236,13 +245,13 @@ public class BroadcastHeightActivity extends BleBaseActivity implements OnCallba
str += getPreFloatStr((float) (heightOrigin * 1.0f / Math.pow(10, heightDecimal)), heightDecimal, 0);

switch (heightUnit) {
case 0:
case BroadCastHeightConfig.UNIT_CM:
str += "cm";
break;
case 1:
case BroadCastHeightConfig.UNIT_INCH:
str += "inch";
break;
case 2:
case BroadCastHeightConfig.UNIT_FT_IN:
try {
int ft = Integer.parseInt(str);
int f = ft / 12;
@@ -262,25 +271,25 @@ public class BroadcastHeightActivity extends BleBaseActivity implements OnCallba
str += getPreFloatStr((float) (weightOrigin * 1.0f / Math.pow(10, weightDecimal)) * (weightSymbol == 1 ? -1 : 1), weightDecimal, 0);

switch (weightUnit) {
case 0:
case BroadCastHeightConfig.UNIT_KG:
str += "kg";
break;
case 1:
case BroadCastHeightConfig.UNIT_JIN:
str += "斤";
break;
case 2:
case BroadCastHeightConfig.UNIT_LB_OZ:
str += "lb:oz";
break;
case 3:
case BroadCastHeightConfig.UNIT_OZ:
str += "oz";
break;
case 4:
case BroadCastHeightConfig.UNIT_ST_LB:
str += "st:lb";
break;
case 5:
case BroadCastHeightConfig.UNIT_G:
str += "g";
break;
case 6:
case BroadCastHeightConfig.UNIT_LB:
str += "lb";
break;
}
@@ -371,6 +380,8 @@ public class BroadcastHeightActivity extends BleBaseActivity implements OnCallba
// 权限都有了,OK
addText("权限都有,开始接收广播数据");
if (mBluetoothService != null) {
mBroadCastHeightDeviceData = BroadCastHeightDeviceData.getInstance();
mBroadCastHeightDeviceData.setOnNotifyHeightData(this);
mBluetoothService.setOnScanFilterListener(this);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST_AILINK);
}
@@ -441,4 +452,50 @@ public class BroadcastHeightActivity extends BleBaseActivity implements OnCallba
mListAdapter.notifyDataSetChanged();
list_view.smoothScrollToPosition(mList.size() - 1);
}

/**
*
* @param hex 解析后的数据
* @param flag 测量标识
* @param heightOrigin 身高原始数据
* @param heightUnit 身高单位
* @param heightDecimal 身高小数点
* @param weightOrigin 体重原始数据
* @param weightUnit 体重单位
* @param weightSymbol 体重正负号
* @param weightDecimal 体重小数点
* @param battery 体重最终值
*/
@Override
public void notifyData(byte[] hex, int flag, int heightOrigin, int heightUnit, int heightDecimal,
int weightOrigin, int weightUnit, int weightSymbol, int weightDecimal, int battery) {

// 输出
String text = "";
text += "MAC地址:" + mac;
text += "\n数据解析:" + BleStrUtils.byte2HexStr(hex);
text += "\n测量标识:" + flag + ":" + getFlagStr(flag);
text += "\n身高原始数据:" + heightOrigin;
text += "\n身高单位:" + heightUnit;
text += "\n身高小数点:" + heightDecimal;
text += "\n身高最终值:" + getHeightStr(heightOrigin, heightUnit, heightDecimal);

if (weightOrigin != 0xffff) {
text += "\n体重原始数据:" + weightOrigin;
text += "\n体重单位:" + weightUnit;
text += "\n体重正负号:" + weightSymbol;
text += "\n体重小数点:" + weightDecimal;
text += "\n体重最终值:" + getWeightStr(weightOrigin, weightUnit, weightDecimal, weightSymbol);
} else {
text += "\n体重:" + "不支持";
}
if (battery != 0xff) {
text += "\n电量:" + battery;
} else {
text += "\n电量:" + "不支持";
}
addText(text);

}
}


Loading…
Откажи
Сачувај