|
@@ -0,0 +1,347 @@
|
|
|
+package vinno.sportinspect.devices;
|
|
|
+
|
|
|
+import androidx.annotation.Keep;
|
|
|
+
|
|
|
+import com.clj.fastble.BleManager;
|
|
|
+import com.clj.fastble.callback.BleNotifyCallback;
|
|
|
+import com.clj.fastble.callback.BleWriteCallback;
|
|
|
+import com.clj.fastble.data.BleDevice;
|
|
|
+import com.clj.fastble.exception.BleException;
|
|
|
+
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.json.JSONObject;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+
|
|
|
+import vinno.sportinspect.bean.EMPReportValueBean;
|
|
|
+import vinno.sportinspect.bean.UrineMeasureResult;
|
|
|
+import vinno.sportinspect.config.Constant;
|
|
|
+import vinno.sportinspect.config.StatusConstant;
|
|
|
+import vinno.sportinspect.minterface.OnBleConnectSuccessListener;
|
|
|
+import vinno.sportinspect.utils.log.LogUtil;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @name: SportInspect
|
|
|
+ * @author: Baka
|
|
|
+ * @time: 2024/1/18 16:13
|
|
|
+ * @version: 1.0
|
|
|
+ * @description:恩普生尿常规
|
|
|
+ */
|
|
|
+@Keep
|
|
|
+public class UrineByUi extends BaseDevices{
|
|
|
+ /// 接收的快速测试
|
|
|
+ private byte[] quickCheck = {(byte) 0x93,(byte) 0x8E,(byte) 0x04, (byte) 0x00, (byte) 0x08,(byte) 0xED,(byte) 0xF9};
|
|
|
+ private byte[] sendQuickCheck = {(byte) 0x93,(byte) 0x8E,(byte) 0x05, (byte) 0x00, (byte) 0x08,(byte) 0xED,(byte) 0x00,(byte) 0xFA};
|
|
|
+ /// 接收和发送的的自动测试
|
|
|
+ private byte[] autoCheck = {(byte) 0x93,(byte) 0x8E,(byte) 0x05, (byte) 0x00, (byte) 0x08,(byte) 0x0B,(byte) 0x00,(byte) 0x18};
|
|
|
+
|
|
|
+ private byte[] deviceVer = {(byte) 0x93, (byte) 0x8e, (byte) 0x08, (byte) 0x00, (byte) 0x08, (byte) 0x01, (byte) 0x43, (byte) 0x4F, (byte) 0x4E, (byte) 0x54, (byte) 0x45};
|
|
|
+
|
|
|
+
|
|
|
+ private byte[] testArray;
|
|
|
+ @Override
|
|
|
+ public void BLUETOOTH_CONNECT(JSONObject params ) {
|
|
|
+ super.BLUETOOTH_CONNECT(params);
|
|
|
+ connect(mac, new OnBleConnectSuccessListener() {
|
|
|
+ @Override
|
|
|
+ public void onBleConnectSuccess(BleDevice bleDevice, int isFirst) {
|
|
|
+ if( isFirst == 0 ) notifyDataChange(bleDevice);
|
|
|
+ else if( isFirst > 0 ) registerRead();
|
|
|
+
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ void notifyDataChange(BleDevice bleDevice){
|
|
|
+ BleManager.getInstance().notify(bleDevice, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, new BleNotifyCallback() {
|
|
|
+ @Override
|
|
|
+ public void onNotifySuccess() {
|
|
|
+ LogUtil.d( "bleManager--->onNotifySuccess" );
|
|
|
+ deviceVerification();
|
|
|
+ //直接同步数据
|
|
|
+// autoTest();
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void onNotifyFailure(BleException exception) {
|
|
|
+ LogUtil.d( "bleManager--->onNotifyFailure"+exception );
|
|
|
+ BleManager.getInstance().stopNotify(bleDevice, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID);
|
|
|
+ disConnectDevice();
|
|
|
+ callBack(StatusConstant.BLE_REGISTER_NOTIFY_FAIL);
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void onCharacteristicChanged(byte[] data) {
|
|
|
+ parseData( data );
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 主动获取最后一条数据
|
|
|
+ */
|
|
|
+ void registerRead(){
|
|
|
+ byte[] dataArray = new byte[7];
|
|
|
+ dataArray[0] = (byte) 0x93;
|
|
|
+ dataArray[1] = (byte) 0x8e;
|
|
|
+ dataArray[2] = (byte) 0x04;
|
|
|
+ dataArray[3] = (byte) 0x00;
|
|
|
+ dataArray[4] = (byte) 0x08;
|
|
|
+ dataArray[5] = (byte) 0x04;
|
|
|
+ dataArray[6] = (byte) 0x10;
|
|
|
+ BleManager.getInstance().write(bleDeviceConnection, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, dataArray, new BleWriteCallback() {
|
|
|
+ @Override
|
|
|
+ public void onWriteSuccess(int current, int total, byte[] justWrite) {
|
|
|
+ LogUtil.d( "bleManager--->onWriteSuccess" );
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void onWriteFailure(BleException exception) {
|
|
|
+ LogUtil.d( "bleManager--->onWriteFailure"+exception );
|
|
|
+ callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 设备确认
|
|
|
+ */
|
|
|
+ public void deviceVerification() {
|
|
|
+ byte[] dataArray = new byte[11];
|
|
|
+ dataArray[0] = (byte) 0x93;
|
|
|
+ dataArray[1] = (byte) 0x8e;
|
|
|
+ dataArray[2] = (byte) 0x08;
|
|
|
+ dataArray[3] = (byte) 0x00;
|
|
|
+ dataArray[4] = (byte) 0x08;
|
|
|
+ dataArray[5] = (byte) 0x01;
|
|
|
+ dataArray[6] = (byte) 0x43;
|
|
|
+ dataArray[7] = (byte) 0x4F;
|
|
|
+ dataArray[8] = (byte) 0x4E;
|
|
|
+ dataArray[9] = (byte) 0x54;
|
|
|
+ dataArray[10] = (byte) 0x45;
|
|
|
+ BleManager.getInstance().write(bleDeviceConnection, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, dataArray, new BleWriteCallback() {
|
|
|
+ @Override
|
|
|
+ public void onWriteSuccess(int current, int total, byte[] justWrite) {
|
|
|
+ LogUtil.d( "bleManager--->onWriteSuccess" );
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void onWriteFailure(BleException exception) {
|
|
|
+ LogUtil.d( "bleManager--->onWriteFailure"+exception );
|
|
|
+ callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自动检测
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void autoTest(){
|
|
|
+ super.autoTest();
|
|
|
+ LogUtil.d("开始尿液测试");
|
|
|
+
|
|
|
+ BleManager.getInstance().write(bleDeviceConnection, Constant.EMP_SERVER_UUID, Constant.EMP_CHARACTERISTICS_UUID, testArray, new BleWriteCallback() {
|
|
|
+ @Override
|
|
|
+ public void onWriteSuccess(int current, int total, byte[] justWrite) {
|
|
|
+ LogUtil.d( "bleManager--->onWriteSuccess" );
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void onWriteFailure(BleException exception) {
|
|
|
+ LogUtil.d( "bleManager--->onWriteFailure"+exception );
|
|
|
+ callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public void parseData(byte[] data) {
|
|
|
+ boolean isEqual = Arrays.equals(data, quickCheck) || Arrays.equals(data, autoCheck) ||Arrays.equals(data, deviceVer);
|
|
|
+ if(Arrays.equals(data, deviceVer)) {
|
|
|
+ testArray = autoCheck;
|
|
|
+ }
|
|
|
+ if(isEqual) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ /// 确认设备 || 出结果
|
|
|
+ if(data.length == 20 || data.length == 7) {
|
|
|
+ testArray = sendQuickCheck;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ UrineMeasureResult res = EMPDataAnalysis(data);
|
|
|
+ if(res == null || StringUtils.isEmpty( res.LEU ) || StringUtils.isEmpty( res.BLD ) ){
|
|
|
+ callBack(StatusConstant.BLE_MEASURE_URINE_FAIL);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ callBack(StatusConstant.BLE_MEASURE_URINE_SUCCESS,res);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //解析结果
|
|
|
+ public static UrineMeasureResult EMPDataAnalysis(byte[] bVal ){
|
|
|
+ UrineMeasureResult res = new UrineMeasureResult();
|
|
|
+
|
|
|
+ boolean empty = true;
|
|
|
+ for (byte b : bVal) {
|
|
|
+ if (b != 0xff) {
|
|
|
+ empty = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (empty) return null;
|
|
|
+ if (bVal.length == 19) {
|
|
|
+ int SN = ((bVal[7] << 8) | (bVal[6] & 0xff));
|
|
|
+ int effective = ((bVal[9] << 8) | (bVal[8] & 0xff));
|
|
|
+ int TmYear = ((bVal[10] << 8) | (bVal[11] & 0xff)) & 0x7f;
|
|
|
+ int TmMon = (((bVal[10] << 8) | (bVal[11] & 0xff)) >> 7) & 0x0f;
|
|
|
+ int TmDay = (((bVal[10] << 8) | (bVal[11] & 0xff)) >> 11) & 0x1f;
|
|
|
+ int TmHour = ((bVal[12] << 8) | (bVal[13] & 0xff)) & 0x1f;
|
|
|
+ int TmMinute = (((bVal[12] << 8) | (bVal[13] & 0xff)) >> 5) & 0x3f;
|
|
|
+ int LEU = (((bVal[12] << 8) | (bVal[13] & 0xff)) >> 11) & 0x07;
|
|
|
+ int NIT = ((bVal[14] << 8) | (bVal[15] & 0xff)) & 0x07;
|
|
|
+ int UBG = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 3) & 0x07;
|
|
|
+ int PRO = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 6) & 0x07;
|
|
|
+ int PH = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 9) & 0x07;
|
|
|
+ int BLD = (((bVal[14] << 8) | (bVal[15] & 0xff)) >> 12) & 0x07;//
|
|
|
+ int SG = ((bVal[16] << 8) | (bVal[17] & 0xff)) & 0x07;
|
|
|
+ int KET = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 3) & 0x07;
|
|
|
+ int BIL = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 6) & 0x07;
|
|
|
+ int GLU = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 9) & 0x07;//
|
|
|
+ int VC = (((bVal[16] << 8) | (bVal[17] & 0xff)) >> 12) & 0x07;//
|
|
|
+ int PF = (bVal[16] >> 7) & 0x01;
|
|
|
+ LogUtil.d("bleManager--->SN:"+SN+";effective:"+effective+";LEU:"+LEU+";"+"NIT:"+NIT+";"+"UBG:"+UBG+";"
|
|
|
+ +"PRO:"+PRO+";"+"PH:"+PH+";"+"BLD:"+BLD+";"+"SG:"+SG+";"
|
|
|
+ +"KET:"+KET+";"+"BIL:"+BIL+";"+"GLU:"+GLU+";"+"VC:"+VC+";TmYear:"+TmYear+";TmMon:"+TmMon+";TmDay:"+TmDay+";TmHour:"+TmHour+";TmMinute:"+TmMinute);
|
|
|
+ //解析为界面显示的字符串
|
|
|
+ //LEU:2;NIT:0;UBG:3;PRO:0;PH:0;BLD:0;SG:5;KET:1;BIL:0;GLU:3;VC:0;
|
|
|
+ res.LEU= getReportValue( LEU ).LEU ;
|
|
|
+ res.NIT= getReportValue( NIT ).NIT ;
|
|
|
+ res.UBG= getReportValue( UBG ).UBG ;
|
|
|
+ res.PRO= getReportValue( PRO ).PRO ;
|
|
|
+ res.PH= getReportValue( PH ).PH ;
|
|
|
+ res.BLD= getReportValue( BLD ).BLD ;
|
|
|
+ res.SG= getReportValue( SG ).SG ;
|
|
|
+ res.KET= getReportValue( KET ).KET ;
|
|
|
+ res.BIL= getReportValue( BIL ).BIL ;
|
|
|
+ res.GLU= getReportValue( GLU ).GLU ;
|
|
|
+ res.VC= getReportValue( VC ).VC ;
|
|
|
+
|
|
|
+ res.SN= String.valueOf( SN ) ;
|
|
|
+ res.effective= String.valueOf( effective ) ;
|
|
|
+ res.TmYear= String.valueOf( TmYear ) ;
|
|
|
+ res.TmMon= String.valueOf( TmMon ) ;
|
|
|
+ res.TmDay= String.valueOf( TmDay ) ;
|
|
|
+ res.TmHour= String.valueOf( TmHour ) ;
|
|
|
+ res.TmMinute= String.valueOf( TmMinute ) ;
|
|
|
+
|
|
|
+ return res;
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public static EMPReportValueBean getReportValue(int project) {
|
|
|
+ EMPReportValueBean value = new EMPReportValueBean();
|
|
|
+ switch (project) {
|
|
|
+ case 0:
|
|
|
+ value.LEU = "-";
|
|
|
+ value.NIT = "-";
|
|
|
+ value.UBG = "-";
|
|
|
+ value.PRO = "-";
|
|
|
+ value.PH = "5.0";
|
|
|
+ value.BLD = "-";
|
|
|
+ value.SG = "1.000";
|
|
|
+ value.KET = "-";
|
|
|
+ value.BIL = "-";
|
|
|
+ value.GLU = "-";
|
|
|
+ value.VC = "-";
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ value.LEU = "+-";
|
|
|
+ value.NIT = "+";
|
|
|
+ value.UBG = "+1";
|
|
|
+ value.PRO = "+-";
|
|
|
+ value.PH = "6.0";
|
|
|
+ value.BLD = "+-";
|
|
|
+ value.SG = "1.005";
|
|
|
+ value.KET = "+-";
|
|
|
+ value.BIL = "+1";
|
|
|
+ value.GLU = "+-";
|
|
|
+ value.VC = "+-";
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ value.LEU = "+1";
|
|
|
+ value.NIT = null;
|
|
|
+ value.UBG = "+2";
|
|
|
+ value.PRO = "+1";
|
|
|
+ value.PH = "6.5";
|
|
|
+ value.BLD = "+1";
|
|
|
+ value.SG = "1.010";
|
|
|
+ value.KET = "+1";
|
|
|
+ value.BIL = "+2";
|
|
|
+ value.GLU = "+1";
|
|
|
+ value.VC = "+1";
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ value.LEU = "+2";
|
|
|
+ value.NIT = null;
|
|
|
+ value.UBG = "+3";
|
|
|
+ value.PRO = "+2";
|
|
|
+ value.PH = "7.0";
|
|
|
+ value.BLD = "+2";
|
|
|
+ value.SG = "1.015";
|
|
|
+ value.KET = "+2";
|
|
|
+ value.BIL = "+3";
|
|
|
+ value.GLU = "+2";
|
|
|
+ value.VC = "+2";
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ value.LEU = "+3";
|
|
|
+ value.NIT = null;
|
|
|
+ value.UBG = null;
|
|
|
+ value.PRO = "+3";
|
|
|
+ value.PH = "7.5";
|
|
|
+ value.BLD = "+3";
|
|
|
+ value.SG = "1.020";
|
|
|
+ value.KET = "+3";
|
|
|
+ value.BIL = null;
|
|
|
+ value.GLU = "+3";
|
|
|
+ value.VC = "+3";
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ value.LEU = null;
|
|
|
+ value.NIT = null;
|
|
|
+ value.UBG = null;
|
|
|
+ value.PRO = "+4";
|
|
|
+ value.PH = "8.0";
|
|
|
+ value.BLD = null;
|
|
|
+ value.SG = "1.025";
|
|
|
+ value.KET = "+4";
|
|
|
+ value.BIL = null;
|
|
|
+ value.GLU = "+4";
|
|
|
+ value.VC = null;
|
|
|
+ break;
|
|
|
+ case 6:
|
|
|
+ value.LEU = null;
|
|
|
+ value.NIT = null;
|
|
|
+ value.UBG = null;
|
|
|
+ value.PRO = null;
|
|
|
+ value.PH = "8.5";
|
|
|
+ value.BLD = null;
|
|
|
+ value.SG = "1.030";
|
|
|
+ value.KET = null;
|
|
|
+ value.BIL = null;
|
|
|
+ value.GLU = null;
|
|
|
+ value.VC = null;
|
|
|
+ break;
|
|
|
+ case 7:
|
|
|
+ value.LEU = null;
|
|
|
+ value.NIT = null;
|
|
|
+ value.UBG = null;
|
|
|
+ value.PRO = null;
|
|
|
+ value.PH = null;
|
|
|
+ value.BLD = null;
|
|
|
+ value.SG = null;
|
|
|
+ value.KET = null;
|
|
|
+ value.BIL = null;
|
|
|
+ value.GLU = null;
|
|
|
+ value.VC = null;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+}
|