--- /dev/null
+package com.ic.workservice;
+/**
+ * 8.1上使用的
+ */
+interface IBloodInfoInterface {
+
+ void statusChanged(int status);
+
+ void valueChanged(int heart,int weared,int BHP,int BPL,int spo2);
+
+}
\ No newline at end of file
--- /dev/null
+package com.ic.workservice;
+import com.ic.workservice.IBloodInfoInterface;
+
+/**
+ * 8.1上使用的
+ */
+interface IBloodRemoteService {
+
+ void registerBloodListener(IBloodInfoInterface cp);
+
+ void unregisterBloodCallback(IBloodInfoInterface cb);
+
+ void sendStatus(boolean status);
+
+ void startMeasure(long timeout);
+}
\ No newline at end of file
public static boolean isUsingCustomServer = false;
public static void setCustomServer(Context context,
- boolean isusingCutomerServer,
- String serverip,
- int serverport) {
-
- if (isusingCutomerServer) {
+ boolean isUsingCustomServer,
+ String serverIp,
+ int serverPort) {
+ if (isUsingCustomServer) {
Util.setSystemProperties("persist.sys.UsingCustomServer", "true");
} else {
Util.setSystemProperties("persist.sys.UsingCustomServer", "false");
}
-
- Util.setSystemProperties("persist.sys.customserverip", serverip);
- Util.setSystemProperties("persist.sys.customserverport", String.valueOf(serverport));
- setProtocolServerHost(context, serverip);
- setProtocolServerPort(context, serverport);
+ Util.setSystemProperties("persist.sys.customserverip", serverIp);
+ Util.setSystemProperties("persist.sys.customserverport", String.valueOf(serverPort));
+ setProtocolServerHost(context, serverIp);
+ setProtocolServerPort(context, serverPort);
loadCustomServerAddr(context);
-
}
public static void loadCustomServerAddr(Context context) {
import android.database.Cursor;
import android.media.AudioManager;
import android.net.Uri;
-import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
+import com.ic.jni.ICJniUtils;
import com.ic.protocolSrv.adapter.LBSHelper;
import com.ic.protocolSrv.bean.Contact;
-import com.ic.protocolSrv.bean.ICLocation;
import com.ic.protocolSrv.bean.Runtime;
import com.ic.protocolSrv.bean.SleepInfo;
import com.ic.protocolSrv.bean.SleepRecord;
import com.ic.protocolSrv.utils.mqttConnection;
import com.ic.protocolSrv.weather.IFZDWeatherCallback;
import com.ic.protocolSrv.weather.IFZDWeatherService;
-import com.ic.jni.ICJniUtils;
import com.ic.protocols.protocolAPIHelper;
import com.ic.s123.IS123WeatherCallback;
import com.ic.s123.IS123WeatherService;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
import chestnut.ui.Toastc;
import chestnut.utils.PhoneUtils;
//开启定位
// locationClient.triggerLocationProcess();
//开启测温
- if (runtime.check_stat_do_temp_test())
+ if (runtime.check_stat_do_temp_test()) {
TemperatureUtil.getInstance().DoTempTest(FROM_ALARM);
+ }
//开启测量PPG
- if (runtime.check_stat_do_ppg_test())
+ if (runtime.check_stat_do_ppg_test()) {
HeartRateManager.getInstance().triggerPPGTest(FROM_ALARM);
+ }
}
};
}
-
-
//注册接收 时间和tiimezone 变更消息
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.TIME_SET");
Uri.parse(WeTalkMessageProvider.MESSAGES_SEND), true, weTalkMsgObserver
);
- }catch (Exception e){
- ICLogger.e(e.getMessage(),e);
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
}
shutdownFlagObserver = new ShutdownFlagObserver(mHandler, resolver);
// 试,证明网络断开的,那么KeepAlive也需要重连(心跳包)
retry_connect_count = 0;
KeepAlive.isConnected = false;
- mHandler.postDelayed(mReConnectSrvThread,5000);
+ mHandler.postDelayed(mReConnectSrvThread, 5000);
}
private final ReConnectSrvThread mReConnectSrvThread = new ReConnectSrvThread();
SimSignalUtil.send_at_to_reset_simcard(runtime); //直接下此命令不能实现断网重连,所以干脆采用关闭网络再打开的方式。
no_network_Heartbeats_Count = 0;//重置Sim卡后重置计数。防止后面多次重置Sim卡。
}
- mHandler.postDelayed(mReConnectSrvThread,20000);
+ mHandler.postDelayed(mReConnectSrvThread, 20000);
}
@Override
import com.ic.work.IHeartRateSensorCallback;
import com.ic.work.IHeartRateSensorService;
import com.ic.work.domain.HeartRate;
+import com.ic.workservice.IBloodInfoInterface;
+import com.ic.workservice.IBloodRemoteService;
import static com.ic.protocolSrv.Constants.ACTION_BROADCAST_PPG;
import static com.ic.protocolSrv.Constants.ACTION_HEATR_RATE_START;
+import static com.ic.protocolSrv.utils.BloodState.BLOOD_START_MEASURE;
+import static com.ic.protocolSrv.utils.BloodState.BLOOD_STOP_MEASURE;
public class HeartRateManager extends AbstractInvokeHandlerService {
private static final Handler mHandler = null;
public final static String ACTION_HEART_RATE = "com.ic.sensor.data.action.HEART_RATE";
+ private IBloodRemoteService iBloodRemoteService8521;
private void checkWarning() {
//ppg
private HeartRateManager() {
+ //这是4.4的ICWorkService
//绑定远程服务
Intent intent = new Intent();
intent.setAction(ACTION_HEART_RATE);
intent.setPackage(ICApplication.sContext.getPackageName());
ICApplication.sContext.bindService(intent, mRemoteConnection, Context.BIND_AUTO_CREATE);
+ //绑定8.1的WorkService
+ //使用的时候,谁不空就使用谁
+ ICLogger.d(" start bind service...");
+ Intent intent8541 = new Intent();
+ intent8541.setAction("com.ic.action.WORK_SERVICE.blood");
+ intent8541.setPackage("com.ic.workservice");
+ ICApplication.sContext.bindService(intent8541, mRemoteConnection8541, Context.BIND_AUTO_CREATE);
}
public void init(Runtime runtime) {
this.runtime = runtime;
}
+ private final ServiceConnection mRemoteConnection8541 = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ try {
+ ICLogger.d("iBloodRemoteService8521 ... on service connected...");
+ iBloodRemoteService8521 = IBloodRemoteService.Stub.asInterface(service);
+ iBloodRemoteService8521.registerBloodListener(mCallback8541);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ iBloodRemoteService8521 = null;
+ }
+ };
+
+ private int currentState = -100;
+
+ private final IBloodInfoInterface mCallback8541 = new IBloodInfoInterface.Stub() {
+ private int BHP;
+ private int heart;
+ private int BPL;
+ private int spo2;
+
+ @Override
+ public void statusChanged(int status) {
+ ICLogger.d("status==> " + status);
+ currentState = status;
+ if (status == BLOOD_START_MEASURE) {
+ //开始测量
+ ICLogger.d("开始测量...");
+ } else if (status == BLOOD_STOP_MEASURE) {
+ ICLogger.d("测量完成...");
+ if (spo2 != 0 && BHP != 0 && BPL != 0 && heart != 0) {
+ HeartRate heartRate = new HeartRate(BHP, BPL, heart, spo2);
+ handleResultData(heartRate);
+ }
+ currentState = -100;
+ }
+ }
+
+ @Override
+ public void valueChanged(int heart, int wear, int BHP, int BPL, int spo2) {
+ //处理结果
+ ICLogger.d("heart ==> " + heart);
+ ICLogger.d("wear ==> " + wear);
+ ICLogger.d("BHP ==> " + BHP);
+ ICLogger.d("BPL ==> " + BPL);
+ ICLogger.d("spo2 ==> " + spo2);
+ this.heart = heart;
+ this.BHP = BHP;
+ this.BPL = BPL;
+ this.spo2 = spo2;
+ }
+ };
+
private IHeartRateSensorService heartRateSensorService;
private final ServiceConnection mRemoteConnection = new ServiceConnection() {
public void onHeartRateGet(HeartRate heartRate) {
//处理心率结果
ICLogger.d("心率测试结果来了..." + heartRate);
- //如果为0,那么就不上传了
- if (heartRate.getHeartRate() == 0) {
- ICLogger.d("result invalidate...");
- return;
- }
- //BY TrillGates
- //判断是否有超出阀值
- //如果超出的话,插入一条警告通知
- //如果数据为0,不处理
- checkHeartRateValue(heartRate);
- runtime.getHRS().setHeartrateStat(heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_TEST_SUCCESS);
- runtime.getHRS().setLastHeartrate(heartRate.getHeartRate(), heartRate.getBloodHeight(), heartRate.getBloodLow(), heartRate.getOxygen());
- uploadResult();
+ handleResultData(heartRate);
}
@Override
}
};
+ private void handleResultData(HeartRate heartRate) {
+ //如果为0,那么就不上传了
+ if (heartRate.getHeartRate() == 0) {
+ ICLogger.d("result invalidate...");
+ return;
+ }
+ //BY TrillGates
+ //判断是否有超出阀值
+ //如果超出的话,插入一条警告通知
+ //如果数据为0,不处理
+ checkHeartRateValue(heartRate);
+ runtime.getHRS().setHeartrateStat(heartRateStatus.HEARTRATE_WORKINGSTAT.HEARTRATE_TEST_SUCCESS);
+ runtime.getHRS().setLastHeartrate(heartRate.getHeartRate(), heartRate.getBloodHeight(), heartRate.getBloodLow(), heartRate.getOxygen());
+ uploadResult();
+ }
+
private void checkHeartRateValue(HeartRate heartRate) {
int oxygenValue = heartRate.getOxygen();
int heartRateValue = heartRate.getHeartRate();
} catch (Exception e) {
e.printStackTrace();
}
- ICApplication.sContext.unbindService(mRemoteConnection);
+ if (heartRateSensorService != null) {
+ ICApplication.sContext.unbindService(mRemoteConnection);
+ }
+ if (iBloodRemoteService8521 != null) {
+ ICApplication.sContext.unbindService(mRemoteConnection8541);
+ }
}
+
public void triggerPPGTest(int from) {
if (CoreService.getInstance() != null) {
if (CoreService.getInstance().getRuntime().Anti_off_flag == 1) {
//判断类型,如果不是GH301的硬件,直接走全部测试
String isGh301 = Util.getSystemProperties("persist.sys.is_gh301", "false");
String customname = Util.getSystemProperties("persist.sys.customname");
- ICLogger.i("customname = "+customname);
+ ICLogger.i("customname = " + customname);
if (!Boolean.parseBoolean(isGh301) || customname.equals("AA")) {
heartRateSensorService.getHeartRateInfo(from, HeartRateManager.class.getName());
} else {
}
}
}
+ ICLogger.d("iBloodRemoteService8521...");
+ if (iBloodRemoteService8521 != null) {
+ ICLogger.d("iBloodRemoteService8521...start measure...");
+ iBloodRemoteService8521.startMeasure(TEST_TIME_OUT);
+ }
} catch (Exception e) {
e.printStackTrace();
ICLogger.e("exception -- > ", e);
}).start();
}
+ public static final int TEST_TIME_OUT = 1000 * 60 * 2;
+
@Override
public boolean onUserRequest(Intent paramIntent, Connection paramConnection, Runtime paramRuntime) {
--- /dev/null
+package com.ic.protocolSrv.utils;
+
+/**
+ * 8.1上使用的
+ */
+public class BloodState {
+
+ public static final int BLOOD_NOT_SUPPORT = -1;
+
+ public static final int BLOOD_NOT_DEVICE = 1001;
+
+ public static final int BLOOD_START_MEASURE = 1002;
+
+ public static final int BLOOD_ING_MEASURE = 1003;
+
+ public static final int BLOOD_PAUSE_MEASURE = 1004;
+
+ public static final int BLOOD_STOP_MEASURE = 1005;
+
+ public static final int BLOOD_TIME_OUT_MEASURE = 1006;
+}
private static final String PRIVATE_KEY = "XMQcHi0lGIdru6xzW7lygBwBT8N0c09P";
private static final String CMD_HEADER = "[";
private static final String CMD_COMPANY = "IC";
-// private static final String CMD_COMPANY = "DW";
+ // private static final String CMD_COMPANY = "DW";
private static final String CMD_END = "]";
private static final String CMD_HEADER_SPLIT = "*";
private static final String CMD_SPLIT = ",";
private static final boolean doEncryption = Util.getSystemProperties("persist.sys.encrypt_fzd", "false").equals("true");
-// public static final String defaultServerIP = "fzd.xcloudtech.com"; //测试服务器
+ // public static final String defaultServerIP = "fzd.xcloudtech.com"; //测试服务器
public static final String defaultServerIP = "api.xcloudtech.com"; //正式服务器
public static final int defaultServerPort = 9000;
private final SharedPreferences sharedPreferences;
//fos.flush();
//fos.close();
//以上代码,验证成功,说明转换是对的
-
//判断远程ID,remoteNum,如果这个不为空,那么是单聊
//如果remoteNum为空,那么是群聊
ICLogger.d("remote id == > " + remoteNum);
String cmd = cmd_msgbuf.substring(0, cmdindex);
cmd_msgbuf = cmd;
}
- ICLogger.d("cmd_msgbuf "+cmd_msgbuf);
- if (regexUtil.isFZDCompanyCMD(CMD_COMPANY,cmd_msgbuf)) {
+ ICLogger.d("cmd_msgbuf " + cmd_msgbuf);
+ if (regexUtil.isFZDCompanyCMD(CMD_COMPANY, cmd_msgbuf)) {
for (CMD_TYPE key : cmdMap.keySet()) {
- if (regexUtil.isFZDCompanyCMD(CMD_COMPANY,cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
+ if (regexUtil.isFZDCompanyCMD(CMD_COMPANY, cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
// ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));
return cmdMap.get(key);
}
}
return "";
- } else
- {
+ } else {
// ICLogger.d("not fzd cmd format !");
return "";
}
private int dataPart = 1;
private StringBuffer cmdbuf = new StringBuffer();
private byte[] totalByte;
+
/*
返回true 表示 cmd 全部解析成功
返回false表示 cmd至少有一条解析失败,失败的数据归入buffer,下一次识别接着使用
*/
public boolean parserCmd(byte[] bytes) {
ICLogger.d("bytes.size " + bytes.length);
- cmdbuf.append( new String(bytes));
+ cmdbuf.append(new String(bytes));
ICLogger.d("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString());
- while( cmdbuf.indexOf(CMD_HEADER)>=0 && cmdbuf.indexOf(CMD_END)>0 ) {
+ while (cmdbuf.indexOf(CMD_HEADER) >= 0 && cmdbuf.indexOf(CMD_END) > 0) {
String cmd_msgbuf = "";
int cmdindexHead = cmdbuf.indexOf(CMD_HEADER);
int cmdindexEnd = cmdbuf.indexOf(CMD_END);
}
}
- }else{//走到这里,已经证明是fzd格式,但未找到cmd,说明不支持cmd,跳过处理,这条数据也是必须从buffer里清除的。
+ } else {//走到这里,已经证明是fzd格式,但未找到cmd,说明不支持cmd,跳过处理,这条数据也是必须从buffer里清除的。
ICLogger.d("no cmd found ! skip cmd " + cmd_msgbuf);
cmdbuf.delete(0, cmd_msgbuf.length() + 2);
}
ICLogger.d("parserCmd done");
return true;
}
+
/**
* 图片下发
*
public void handlePOWEROFF(Connection connection) {
connection.send(POWEROFF());
}
+
public static StringMessage RESET() {
return genFZDCMD(cmdMap.get(CMD_TYPE.RESET));
}
handleHrtstart(mConnection);
ICLogger.i("收到服务器心率检测命令");
Config.testType = HeartRateOxygenTestType.JUST_HEART_RATE;
- if (mRuntime.check_stat_do_ppg_test())
+ if (mRuntime.check_stat_do_ppg_test()) {
HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER);
+ }
break;
case bldstart:
handleBldstart(mConnection);
ICLogger.d("交友结果--> " + data);
//第一种情况[XT*8800000015*000A*PP, 5F204E0,555]
//另外一种情况 情况[XT*8800000015*0001*PP,1]/[XT*8800000015*0002*PP,2]
- //
boolean contains = data.contains(CMD_SPLIT);
int result = 0;
String friendName = "";
# Location of the SDK. This is only used by Gradle.\r
# For customization when using a Version Control System, please read the\r
# header note.\r
-#Fri Aug 20 10:44:06 CST 2021\r
-sdk.dir=C\:\\Users\\incar\\AppData\\Local\\Android\\Sdk\r
+#Tue Aug 24 16:58:39 CST 2021\r
+sdk.dir=E\:\\Android\\Sdk\r