From: SnickerSun Date: Sun, 11 Jun 2023 15:17:40 +0000 (+0800) Subject: ICProtocol81_V964_2306112300_release.apk X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=63eb543e1808bff332b376b0b44767304b5776eb;p=protocol_srv.git ICProtocol81_V964_2306112300_release.apk 同步 L005 SMS protocolBeehome 协议 心率体温已经可以测试 --- diff --git a/app/app.iml b/app/app.iml new file mode 100644 index 00000000..2d2bd7d1 --- /dev/null +++ b/app/app.iml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f7e7931c..94d45d50 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,14 +7,14 @@ static def getApkBaseName() { } android { - compileSdkVersion 29 - buildToolsVersion "29.0.3" + compileSdkVersion 28 + buildToolsVersion "28.0.3" def currentVersionCode = getVersionCode() def currentVersionName = releaseTime() defaultConfig { applicationId "com.ic.protocolSrv" minSdkVersion 19 - targetSdkVersion 29 + targetSdkVersion 28 versionCode currentVersionCode versionName "${currentVersionName}" multiDexEnabled true diff --git a/app/release/ICProtocol81_V963_2305182354_release.apk b/app/release/ICProtocol81_V964_2306112300_release.apk similarity index 78% rename from app/release/ICProtocol81_V963_2305182354_release.apk rename to app/release/ICProtocol81_V964_2306112300_release.apk index adbacada..6d1962da 100644 Binary files a/app/release/ICProtocol81_V963_2305182354_release.apk and b/app/release/ICProtocol81_V964_2306112300_release.apk differ diff --git a/app/release/output.json b/app/release/output.json index f8f8d771..77d49738 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":963,"versionName":"2305182354","enabled":true,"outputFile":"ICProtocol81_V963_2305182354_release.apk","fullName":"release","baseName":"release"},"path":"ICProtocol81_V963_2305182354_release.apk","properties":{}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":964,"versionName":"2306112300","enabled":true,"outputFile":"ICProtocol81_V964_2306112300_release.apk","fullName":"release","baseName":"release"},"path":"ICProtocol81_V964_2306112300_release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd4d5a65..fed0ad5e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -98,6 +99,10 @@ android:protectionLevel="signature" /> + + + + @@ -203,7 +208,7 @@ " + cmd); + if (!TextUtils.isEmpty(cmd)) { + protocolAPIHelper.parseTestData(cmd); + } } } - private void updateMsgSettingsValue() { ContentValues contentValues = new ContentValues(); //分类是心率的包名 @@ -194,7 +203,15 @@ public class ICSmsManager extends BroadcastReceiver { if (locationClient != null) { locationClient.setLocationResponse(null); } - sendSMS(cell_number_to_reply, "http://maps.google.com/?q=" + locationResponseUrl); + //IMEI号,时间,电量,信号, + ICLogger.d("locationResponseUrl => " + locationResponseUrl); + String response = runtime.IMEI() + ",G:" + TimeUtil.getLocalTimeForGoogle(System.currentTimeMillis()) + + runtime.getBatterylevel() + "%" + + runtime.getSignalInfo() + + runtime.getGPSHeading() + + ",http://maps.google.com/maps?f=q&hl=en&q=" + locationResponseUrl; + ICLogger.d("response ==> " + response); + sendSMS(cell_number_to_reply, response); cell_number_to_reply = ""; } } @@ -207,6 +224,7 @@ public class ICSmsManager extends BroadcastReceiver { intentfilter.addAction(ACTION_SMSCMD_Reply); intentfilter.addAction(ACTION_SMS_RECEIVED); intentfilter.addAction(ACTION_SMSCMD); + intentfilter.addAction(ACTION_CMD_TESTER); intentfilter.addAction(ACTION_TINTERNAL_TEST); mContext.registerReceiver(this, intentfilter); ICLogger.i("ICSmsManager register filter "); @@ -272,11 +290,31 @@ public class ICSmsManager extends BroadcastReceiver { } return false; }); + //获取到配置中的短信密码 + String smsCmdPwd = Util.getSystemProperties("persist.sys.sms.pwd", Config.DefaultSMSPassword); + String ENCRYPED_HEADER = Config.getSMSPwd(mContext); + //如果没有设置密码,那么就设置一下 + if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword)) { + Config.setSMSPwd(mContext, smsCmdPwd); + } + //获取到短信中的配置密码,如果有配置就进行密码校验 } public static void sendSMS(String phoneNumber, String msg) { - if (TextUtils.isEmpty(phoneNumber)) { - ICLogger.d("phone number is null..."); + ICLogger.d("reply ==> " + msg); + if (TextUtils.isEmpty(phoneNumber) || phoneNumber.contains("Broadcast") // || phoneNumber.contains("WEB") + ) { + ICLogger.d("phone number is empty."); + return; + } + if (phoneNumber.startsWith("WEB")) { + ICLogger.d("send msg to web..."); + //拿到流水号 + String[] split = phoneNumber.split("-"); + if (split.length == 2) { + String cmdIndex = split[1]; + protocolAPIHelper.sendMsg2Web(cmdIndex, msg); + } return; } android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); @@ -294,8 +332,28 @@ public class ICSmsManager extends BroadcastReceiver { mContext.unregisterReceiver(this); } private boolean isAdminNumber(String phoneNumb) { + //如果Web的下发指令,直接让过吧 + if (phoneNumb.startsWith("WEB-") || phoneNumb.startsWith("Broadcast")) { + ICLogger.d("后台的指令,不判断管理员账号..." + phoneNumb); + return true; + } - return true; + //检查是否有设置管理员账号 + String admin_number = SharePreferenceUtil.getPrefString(mContext, "admin_number", ""); + ICLogger.d("admin_number ==> " + admin_number); + if (TextUtils.isEmpty(admin_number)) { + return true; + } + //有数据如果不一样,false,一样true,如果没有记录,返回true. + try { + boolean isSamePhoneNum = admin_number.contains(phoneNumb) || phoneNumb.contains(admin_number); + ICLogger.d("isSamePhoneNum ==> " + isSamePhoneNum); + return isSamePhoneNum; + //防止有空指针 + } catch (Exception e) { + ICLogger.e("phone number admin error...", e); + } + return false; } private static void broadCastStartFotaUpdate(Context context) { @@ -345,33 +403,36 @@ public class ICSmsManager extends BroadcastReceiver { * return false表示不是命令, true表示是命令,且已经执行 * */ public boolean handleSMS_CMD(String phoneNumber, String sms) { + + ICLogger.d("phoneNumber ==> " + phoneNumber); + //唯一一个指令,只管密码正确就可以获取到管理员的号是啥 + String admin_number = SharePreferenceUtil.getPrefString(mContext, "admin_number", ""); + String ENCRYPED_HEADER = Config.getSMSPwd(mContext); + if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword) + || phoneNumber.startsWith("WEB-") || + phoneNumber.startsWith("Broadcast")) { + ENCRYPED_HEADER = ""; + } + + if (!sms.startsWith(ENCRYPED_HEADER + "#")) { + ICLogger.d("非指令短信..."); + return false; + } + + if (sms.equals(ENCRYPED_HEADER + "#ADMIN_NUMBER#")) { + sendSMS(phoneNumber, "admin phone number is:" + admin_number); + ICLogger.d("just get admin number...success"); + return true; + } if (isAdminNumber(phoneNumber)) { if (sms == null || sms.trim().isEmpty()) return false; ICLogger.i("received SMSCMD " + sms); sms = sms.trim(); } - return handleSms(runtime, sms, phoneNumber, mHandler); - } - /** - * phoneNumber可以为空 - * Handler可以为空 - * - * @param runtime - * @param sms - * @param phoneNumber - * @param handler - * @return - */ - public static boolean handleSms(Runtime runtime, String sms, String phoneNumber, Handler handler) { - Context mContext = runtime.getContextProxy().context; - String ENCRYPED_HEADER = Config.getSMSPwd(mContext); - if (ENCRYPED_HEADER.equals(Config.DefaultSMSPassword)) { - ENCRYPED_HEADER = ""; - } if (sms.equals(ENCRYPED_HEADER + "#logctl#=upload,all")) { - sms = ENCRYPED_HEADER + "#logctl#=upload,SDLog:Android/V20"; + sms = ENCRYPED_HEADER + "#logctl#=upload,SDLog:Android/ic"; } //$HX,SSER,OK,91.201.4.79,5018,C,589883 if (sms.startsWith(ENCRYPED_HEADER + "$HX,SSER,OK,")) { @@ -381,7 +442,7 @@ public class ICSmsManager extends BroadcastReceiver { String ServerPort = tmplist[4]; String imeiend = tmplist[6]; if (runtime.IMEI().endsWith(imeiend)) { - sms = ENCRYPED_HEADER + "#IP#=" + ServeriIp + ":" + ServerPort + "#"; + sms = ENCRYPED_HEADER + "#ip#=" + ServeriIp + ":" + ServerPort + "#"; ICLogger.i("收到客户自定义 服务器IP设置命令,转化为 #IP#命令!"); } else { sendSMS(phoneNumber, imeiend + " IMEI 校验错误!"); @@ -404,6 +465,7 @@ public class ICSmsManager extends BroadcastReceiver { String apn = apnvalues[3]; String user = ""; String password = ""; + ICLogger.d("set up apn..."); if (APNUtil.addVPN(apnName, apn, mcc, mnc, user, password, mContext) == true) { sendSMS(phoneNumber, "apn add success!"); } else { @@ -446,7 +508,7 @@ public class ICSmsManager extends BroadcastReceiver { ICLogger.i("SMS " + sms + " reply " + DeviceInfoUtil.getShortDeviceInfo(runtime)); sendSMS(phoneNumber, DeviceInfoUtil.getShortDeviceInfo(runtime)); } else if (sms.startsWith(ENCRYPED_HEADER + "#status#")) { - String reply = "IMEI=" + runtime.IMEI() + "\nSW:" + DeviceInfoUtil.getVersionCode(mContext) + " " + DeviceInfoUtil.getSWVersionDisplayName() + "\nBattery:" + runtime.getBattery() + "%"; + String reply = "IMEI=" + runtime.IMEI() +"\nIMSI=" + runtime.getImsi() + "\nSW:" + DeviceInfoUtil.getVersionCode(mContext) + " " + DeviceInfoUtil.getSWVersionDisplayName() + "\nBattery:" + runtime.getBattery() + "%"; ICLogger.i("SMS " + sms + " reply \n" + reply); sendSMS(phoneNumber, reply); @@ -459,7 +521,7 @@ public class ICSmsManager extends BroadcastReceiver { } else { sendSMS(phoneNumber, "At cmd empty error!"); } - } else if (sms.startsWith(ENCRYPED_HEADER + "#imei:")) { + } else if (sms.startsWith(ENCRYPED_HEADER + "#imei:") || sms.startsWith(ENCRYPED_HEADER + "#imei=") ) { String imei = sms.substring(6); ICLogger.i("SMS " + sms + " imei=" + imei); if (imei.length() == 15) { @@ -520,12 +582,12 @@ public class ICSmsManager extends BroadcastReceiver { CoreService.getInstance().disconnect_server(); CoreService.getInstance().ReConnectToServer(); } else { - reply = sms + " falied! "; + reply = sms + " failed!"; } } } } else { - reply = sms + " falied! "; + reply = sms + " failed!"; } sendSMS(phoneNumber, reply); } else if (sms.startsWith(ENCRYPED_HEADER + "#setlocation#=") && sms.endsWith("#")) { @@ -546,7 +608,8 @@ public class ICSmsManager extends BroadcastReceiver { e.printStackTrace(); ICLogger.e(e.getMessage(), e); } - if (mod > 0 && cycle >= 30) { + //客户要求5秒的 + if (mod > 0 && cycle >= 5) { switch (mod) { case ICLocation.NORMAL_MOD: cycle = 60 * 15; @@ -614,6 +677,23 @@ public class ICSmsManager extends BroadcastReceiver { Config.setWiFiSSID(mContext, Config.DefaultWiFiSSID); Config.setWiFiPasswd(mContext, Config.DefaultWiFiPWD); sendSMS(phoneNumber, "reset Wifi Setting to SSID " + Config.getWiFiSSID(mContext) + ", WiFiPassword " + Config.getWiFiPasswd(mContext) + "!"); + } else if (tmp[1].startsWith("switch,")) { + String tmplist[] = tmp[1].split(","); + if (tmplist.length == 2) { + if (tmplist[1].trim().equalsIgnoreCase("on") || tmplist[1].trim().equalsIgnoreCase("1")) { + Util.turnOnWifiForConnect(null,runtime); + Util.setSystemProperties("persist.sys.ic.wifi_enable", "true"); + sendSMS(phoneNumber, "WiFi Switch On !"); + } else if (tmplist[1].trim().equalsIgnoreCase("off") || tmplist[1].trim().equalsIgnoreCase("0")) { + Util.turnOffWifiForSleep(null,runtime); + Util.setSystemProperties("persist.sys.ic.wifi_enable", "false"); + sendSMS(phoneNumber, "WiFi Switch Off !"); + } else { + sendSMS(phoneNumber, "WiFi Switch Control " + tmplist[1].trim() + " format error!"); + } + } else { + sendSMS(phoneNumber, "WiFi Switch Control format error!"); + } } else if (tmp[1].startsWith("connect,")) { String tmplist[] = tmp[1].split(","); if (tmplist.length == 4) { @@ -624,8 +704,8 @@ public class ICSmsManager extends BroadcastReceiver { Config.setWiFiPasswd(mContext, PWD); sendSMS(phoneNumber, "set and connect to Wifi SSID " + Config.getWiFiSSID(mContext) + ", WiFiPassword " + Config.getWiFiPasswd(mContext) + ", encryptType " + encyptType + "!"); //connect to wifi - if (handler != null) { - handler.postDelayed(new Runnable() { + if (mHandler != null) { + mHandler.postDelayed(new Runnable() { @Override public void run() { Deliver.connectToWifi(SSID, PWD, encyptType); @@ -683,8 +763,8 @@ public class ICSmsManager extends BroadcastReceiver { String sdfilelist[] = logfile.split(":"); if (sdfilelist.length == 2) { String fileOrDir = sdfilelist[1]; - if (handler != null) { - handler.postDelayed(() -> { + if (mHandler != null) { + mHandler.postDelayed(() -> { String filepath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + fileOrDir; if (new File(filepath).exists()) { Util.getDBFile(); @@ -694,7 +774,7 @@ public class ICSmsManager extends BroadcastReceiver { Util.ShowToast(runtime, "start Upload " + filepath + " to " + Config.getFtpServer(mContext) + " ..."); } String logTime = TimeUtil.getSystemTime3(); - ICHttpUtil.uploadFile(filepath, runtime, logTime, handler); + ICHttpUtil.uploadFile(filepath, runtime, logTime, mHandler); } else { sendSMS(phoneNumber, filepath + " not exist !"); if (needShowToast) { @@ -708,14 +788,14 @@ public class ICSmsManager extends BroadcastReceiver { } } else { - if (handler != null) { - handler.postDelayed(() -> { + if (mHandler != null) { + mHandler.postDelayed(() -> { String filepath = Util.getLogfilePath(runtime, logfile); if (Util.LogfileExist(runtime, logfile)) { Util.getDBFile(); sendSMS(phoneNumber, "start Upload " + logfile + " to " + Config.getFtpServer(mContext) + " ..."); String logTime = TimeUtil.getSystemTime3(); - ICHttpUtil.uploadFile(filepath, runtime, logTime, handler); + ICHttpUtil.uploadFile(filepath, runtime, logTime, mHandler); } else { sendSMS(phoneNumber, logfile + " not exist !"); } @@ -862,8 +942,22 @@ public class ICSmsManager extends BroadcastReceiver { if (!phNum3.isEmpty()) contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3)); - runtime.getDbHelper().saveContacts(contactArray, false, false, false, false, false, true); - + ICLogger.d("contactArray size ==> " + contactArray.size()); + //保存到IC的数据库上 + for (int i = 0; i < contactArray.size(); i++) { + //数据入库 + Contact contact = contactArray.get(i); + ContentValues item = new ContentValues(); + item.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.SOS); + item.put(ICDatabaseHelper.fUserName, contact.name); + item.put(ICDatabaseHelper.fPhoneNum, contact.number); + runtime.getContextProxy() + .getResolver() + .insert(Uri.parse(ICMembersProvider.MEMBERS), item); + } + runtime.getDbHelper().saveContacts(contactArray, + false, false, false, + false, false, true); sendSMS(phoneNumber, "set SOS number ok!"); } else { @@ -876,8 +970,8 @@ public class ICSmsManager extends BroadcastReceiver { } else if (sms.equals(ENCRYPED_HEADER + "#listen#")) { sendSMS(phoneNumber, "start listen !"); ICAudioManager.needMute = true; - if (handler != null) { - handler.postDelayed(new Runnable() { + if (mHandler != null) { + mHandler.postDelayed(new Runnable() { @Override public void run() { SimSignalUtil.send_at_cmd(runtime, "atd" + phoneNumber + ";"); @@ -945,8 +1039,8 @@ public class ICSmsManager extends BroadcastReceiver { cell_number_to_reply = phoneNumber; sendSMS(phoneNumber, sb.toString()); //connect to wifi - if (handler != null) { - handler.postDelayed(() -> { + if (mHandler != null) { + mHandler.postDelayed(() -> { Deliver.connectToWifi(SSID, PWD, encyptType); broadCastStartFotaUpdate(mContext); }, 500); @@ -1084,15 +1178,55 @@ public class ICSmsManager extends BroadcastReceiver { sendSMS(phoneNumber, " setprotocol cmd Format error!"); } - } else if (sms.startsWith(ENCRYPED_HEADER + "#maillog#=")) { + } else if (sms.startsWith(ENCRYPED_HEADER + "#maillog#")) { String tmp[] = sms.split("="); - if (tmp.length == 2) { + needShowToast = sms.contains("SDLogInfo"); + if(tmp.length==1){ + // String mailaddr="13554820016@163.com"; + String mailaddr="tangrixin716@163.com"; + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + String logfile = ""; + String fileOrDir = "Android/ic"; + + Util.getDBFile(); + + logfile = Util.zipfiles(fileOrDir); + if (new File(logfile).exists()) { + + sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " ..."); + if(needShowToast) + Util.ShowToast(runtime, "mail " + fileOrDir + " to " + mailaddr + " ..."); + + String logtime = TimeUtil.getSystemTime3(); + if (SendEmail.getInstance().sendLogViaMail(logfile, mailaddr, logtime,runtime.IMEI())) { + sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " success!"); + if(needShowToast) + Util.ShowToast(runtime,"mail " + fileOrDir + " to " + mailaddr + " success!"); + } else { + sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " failed!"); + if(needShowToast) + Util.ShowToast(runtime,"mail " + fileOrDir + " to " + mailaddr + " failed!"); + } + + } else { + sendSMS(phoneNumber, fileOrDir + " not exist !"); + if(needShowToast) + Util.ShowToast(runtime, fileOrDir + " not exist !"); + } + if(needShowToast) + needShowToast=false; + } + + }, 500); + }else if (tmp.length == 2) { String mailaddr = tmp[1]; if (!mailaddr.contains("@")) { sendSMS(phoneNumber, "mail address error !"); } else { - if (handler != null) { - handler.postDelayed(() -> { + if (mHandler != null) { + mHandler.postDelayed(() -> { String logfile = ""; String fileOrDir = "Android/ic"; Util.getDBFile(); @@ -1101,7 +1235,7 @@ public class ICSmsManager extends BroadcastReceiver { sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " ..."); Util.ShowToast(runtime, "mail " + fileOrDir + " to " + mailaddr + " ..."); String logtime = TimeUtil.getSystemTime3(); - if (SendEmail.getInstance().sendLogViaMail(logfile, mailaddr, logtime)) { + if (SendEmail.getInstance().sendLogViaMail(logfile, mailaddr, logtime,runtime.IMEI())) { sendSMS(phoneNumber, "mail " + fileOrDir + " to " + mailaddr + " success!"); // Util.ShowToast(runtime,"mail " + fileOrDir + " to " + mailaddr + " success!"); } else { @@ -1118,12 +1252,12 @@ public class ICSmsManager extends BroadcastReceiver { sendSMS(phoneNumber, "upload logfile format error!"); } } else if (sms.startsWith(ENCRYPED_HEADER + "#capture#")) { - if (handler != null) { - handler.post(() -> (new CameraUtil(mContext)).getPicture("capture" + TimeUtil.getSystemTime3())); + if (mHandler != null) { + mHandler.post(() -> (new CameraUtil(mContext)).getPicture("capture" + TimeUtil.getSystemTime3())); } } else if (sms.startsWith(ENCRYPED_HEADER + "#monitor#")) { - if (handler != null) { - handler.post(() -> CoreService.getInstance().DevliverStringMessage("StartMonitor", "10")); + if (mHandler != null) { + mHandler.post(() -> CoreService.getInstance().DevliverStringMessage("StartMonitor", "10")); } /*** * }else if(sms.startsWith(ENCRYPED_HEADER+"#logctl#=")){ @@ -1135,12 +1269,138 @@ public class ICSmsManager extends BroadcastReceiver { String tmp[] = sms.split("="); if (tmp.length == 2) { String cmd = tmp[1]; - handle_test_cmd(runtime, handler, cmd, ""); + handle_test_cmd(runtime, mHandler, cmd, ""); } + } else if (sms.startsWith(ENCRYPED_HEADER + "#ALARM_VOICE=") && sms.endsWith("#")) { + String tmp[] = sms.split("="); + /** + * //打开警报 + * 密码#ALARM_VOICE=1# + * //关闭警报声音 + * 密码#ALARM_VOICE=0# + */ + if (tmp.length == 2) { + String cmd = tmp[1]; + if (!TextUtils.isEmpty(cmd)) { + String replace = cmd.replace("#", ""); + //直接修改属性值即可,在com.enqualcomm.support.service.AntiMonitorService.play_notify + //播放声音的时候进行判断 + //控制字段:persist.alarm.voice=1/0,1表示开启,0表示关闭 + if ("1".equals(replace)) { + //开启 + Util.setSystemProperties("persist.sys.alarm.voice", "1"); + } else { + //关闭 + Util.setSystemProperties("persist.sys.alarm.voice", "0"); + } + sendSMS(phoneNumber, "SET ALARM_VOICE STATE " + Util.getSystemProperties("persist.sys.alarm.voice", "NONE")); + } else { + sendSMS(phoneNumber, "SET ALARM_VOICE ERROR WITH EMPTY CMD"); + } + } else { + sendSMS(phoneNumber, "SET ALARM_VOICE ERROR LENGTH"); + } + } else if (sms.startsWith(ENCRYPED_HEADER + "#WHITE_LIST=") && sms.endsWith("#")) { + ICLogger.d("收到设置白名单的短信..."); + String[] split = sms.split("="); + if (split.length == 2) { + int targetCount = 0; + String phoneList = split[1].replace("#", ""); + String[] phones = phoneList.split(","); + //清空数据库 + cleanWhiteList(); + ArrayList contactArray = new ArrayList<>(); + //第一个为管理员账号 + for (int i = 0; i < phones.length; i++) { + String[] nameWithPhone = phones[i].split("-"); + if (nameWithPhone.length == 2) { + targetCount++; + String name = nameWithPhone[0]; + String phoneNum = nameWithPhone[1]; + contactArray.add(new Contact(Contact.CATEGORY_CALL, name, phoneNum)); + //第一个是管理员账号 + if (i == 0) { + //保存成管理员号 + SharePreferenceUtil.setPrefString(mContext, "admin_number", phoneNum); + } + //数据入库 + insertWhiteListDb(name, phoneNum); + } else { + sendSMS(phoneNumber, "White format error... " + targetCount); + break; + } + } + runtime.getDbHelper().saveContacts(contactArray, false, false, true, false, false, false); + ICLogger.d("短信白名单入库完成..."); + sendSMS(phoneNumber, "SET SMS WHITE LIST ok " + targetCount); + } else { + sendSMS(phoneNumber, "SET SMS WHITE LIST error"); + } + } else if (sms.startsWith(ENCRYPED_HEADER + "#WHITE_LIST_ENABLE=") && sms.endsWith("#")) { + ICLogger.d("设置白名单开关的短信..."); + String[] split = sms.split("="); + if (split.length == 2) { + String value = split[1].replace("#", ""); + if ("1".equals(value)) { + Util.setSystemProperties("persist.sys.whitelist.enable", "true"); + } else { + Util.setSystemProperties("persist.sys.whitelist.enable", "false"); + } + //返回结果 + String result = Util.getSystemProperties("persist.sys.whitelist.enable"); + sendSMS(phoneNumber, "SET WHITE LIST ENABLE result : " + result); + } else { + //格式错误 + sendSMS(phoneNumber, "SET WHITE LIST ENABLE FORMAT error"); + } + } else if (sms.startsWith(ENCRYPED_HEADER + "#en_cutalarm_repeat#=") && sms.endsWith("#")) { + ICLogger.d("设置是否开启剪断循环报警..."); + String[] split = sms.split("="); + if (split.length == 2) { + String value = split[1].replace("#", ""); + if ("true".equals(value)) { + Util.setSystemProperties("persist.sys.en_cutalarm_repeat", "true"); + } else { + Util.setSystemProperties("persist.sys.en_cutalarm_repeat", "false"); + } + //返回结果 + String result = Util.getSystemProperties("persist.sys.en_cutalarm_repeat"); + sendSMS(phoneNumber, "SET CutAlarm repeat ENABLE result : " + result); + } else { + //格式错误 + sendSMS(phoneNumber, "SET CutAlarm repeat ENABLE FORMAT error"); + } + } else { return false; } return true; + + } + + /** + * 把名字加入到白名单 + * + * @param name + * @param phoneNum + */ + private void insertWhiteListDb(String name, String phoneNum) { + ICLogger.d("name==> " + name + " phoneNum ==> " + phoneNum); + ContentValues contentValues = new ContentValues(); + contentValues.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.WHITE_LIST); + contentValues.put(ICDatabaseHelper.fPhoneNum, phoneNum); + contentValues.put(ICDatabaseHelper.fID, phoneNum); + contentValues.put(ICDatabaseHelper.fUserName, name); + contentValues.put(ICDatabaseHelper.fCreateTime, System.currentTimeMillis()); + contentValues.put(ICDatabaseHelper.fUpdateTime, System.currentTimeMillis()); + //保存联系人列表,类型为白名单 + runtime.getContextProxy().getResolver().insert(Uri.parse(ICMembersProvider.MEMBERS), contentValues); + } + + private void cleanWhiteList() { + ICLogger.d("clear white list..."); + //保存联系人列表,类型为白名单 + runtime.getContextProxy().getResolver().delete(Uri.parse(ICMembersProvider.MEMBERS), null, null); } public final Uri SMS_MESSAGE_URI = Uri.parse("content://sms"); @@ -1283,9 +1543,11 @@ public class ICSmsManager extends BroadcastReceiver { } catch (Exception e) { freq = 0; } - ICLogger.i("收到短信指令:测量体温 " + freq + "秒一次。"); - Config.setTemperatureTestCycle(runtime, freq); + ICLogger.i("收到短信指令:测量体温 " + freq + "分钟一次。"); + Config.setTemperatureTestCycle(runtime, freq * 60); CoreService.getInstance().setTempAlarm(true); + if (runtime.check_stat_do_temp_test()) + TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER); } } else if (cmd.startsWith("BPXL")) { diff --git a/app/src/main/java/com/ic/protocolSrv/NMEAListener.java b/app/src/main/java/com/ic/protocolSrv/NMEAListener.java index 42e14c96..e1ca7cfe 100644 --- a/app/src/main/java/com/ic/protocolSrv/NMEAListener.java +++ b/app/src/main/java/com/ic/protocolSrv/NMEAListener.java @@ -1,10 +1,10 @@ package com.ic.protocolSrv; import android.location.Criteria; -import android.location.GpsStatus.NmeaListener; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; +import android.location.OnNmeaMessageListener; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; @@ -20,7 +20,7 @@ import java.text.DecimalFormat; import static android.location.LocationManager.GPS_PROVIDER; -public class NMEAListener implements NmeaListener, LocationListener { +public class NMEAListener implements LocationListener,OnNmeaMessageListener { private static boolean listening = false; private String strLatitude; private String strLongitude; @@ -60,6 +60,7 @@ public class NMEAListener implements NmeaListener, LocationListener { private static location_callback mCallback = null; + public interface location_callback { public void on_locating_changed(GPS_locationStatus gps_status); } @@ -151,7 +152,9 @@ public class NMEAListener implements NmeaListener, LocationListener { * @param paramLong * @param nmeastr */ - public void onNmeaReceived(long paramLong, String nmeastr) { + + @Override + public void onNmeaMessage(String nmeastr,long paramLong) { // EqcAlgorithmNative.native_EqcAlgorithmMethod5(paramString); ICLogger.i("Nmea :" + nmeastr + " " + paramLong); @@ -231,8 +234,13 @@ public class NMEAListener implements NmeaListener, LocationListener { String Lat = tmplist[1]; String lon = tmplist[3]; String fixed = tmplist[6]; -// ICLogger.i("GPGLL Lat="+Lat+",Lon="+lon+",fixed="+fixed); + String utctime = tmplist[5]; + try { + TimeUtil.sGpsTime = utctime.substring(0, 6); + } catch (Exception e) { + e.printStackTrace(); } + } } else if (nmeastr.startsWith("$GPRMC,") || nmeastr.startsWith("$GNRMC,") || nmeastr.startsWith("$BDRMC,")) { // GPRMC编辑 //(推荐定位信息数据格式) @@ -258,14 +266,32 @@ public class NMEAListener implements NmeaListener, LocationListener { String lon = tmplist[5]; String fixed = tmplist[2]; String speed = tmplist[7]; -// ICLogger.i("GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed); -// if (Config.LOG_TOFILE) -// FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", "GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed); - if (fixed.trim().equals("A")) { - if (speed.trim().isEmpty()) speed = "0.0"; - runtime.getLocationInstance().setSpeed(Float.valueOf(speed)); + String date = tmplist[9]; + String heading = tmplist[8]; + try { + TimeUtil.sGpsTime = utctime.substring(0, 6); + TimeUtil.sGpsDate = date; + } catch (Exception e) { + e.printStackTrace(); + } + // ICLogger.i("GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed); + // if (Config.LOG_TOFILE) + // FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", "GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed); + if (fixed.trim().equals("A")) { + if (speed.trim().isEmpty()) speed = "0.0"; + runtime.getLocationInstance().setSpeed(Float.valueOf(speed)); + //方向角是指的当前运动方向相对于正北的磁偏角,0度是正北 + if(heading.trim().isEmpty() ) heading = "0.0"; + float heading_float = 0.0f; + try{ + heading_float = Float.parseFloat(heading); + } catch (Exception e) + { + ICLogger.e(e.getMessage(),e); } - + runtime.getLocationInstance().setHeading(heading_float); + runtime.getLocationInstance().setHeadingStr(heading); + } } } else if (nmeastr.startsWith("$GPGSV,") || nmeastr.startsWith("$GLGSV,") || nmeastr.startsWith("$GAGSV,") || nmeastr.startsWith("$GBGSV,") || nmeastr.startsWith("$BDGSV,")) { @@ -392,6 +418,11 @@ public class NMEAListener implements NmeaListener, LocationListener { String hdop = tmplist[8]; String altitude = tmplist[9]; ICLogger.d("altitude ==> " + altitude); + try { + TimeUtil.sGpsTime = utctime.substring(0, 6); + } catch (Exception e) { + e.printStackTrace(); + } if ((fixed.trim().equals("1")) || (fixed.trim().equals("2")) || (fixed.trim().equals("6"))) { // 转换GPS坐标为度,以便在各种应用中可以方便查找。 diff --git a/app/src/main/java/com/ic/protocolSrv/bean/ICLocation.java b/app/src/main/java/com/ic/protocolSrv/bean/ICLocation.java index a3219f39..9af0a165 100644 --- a/app/src/main/java/com/ic/protocolSrv/bean/ICLocation.java +++ b/app/src/main/java/com/ic/protocolSrv/bean/ICLocation.java @@ -1,5 +1,6 @@ package com.ic.protocolSrv.bean; +import android.os.SystemProperties; import com.ic.protocolSrv.utils.ICLogger; import java.util.ArrayList; @@ -57,7 +58,9 @@ public class ICLocation { public String lonGPSStr; public String lat_name; public String lon_name; + public String heading_str; public float hdop; + public String google_location_url_for_last_gps_fixed_position; public float bearing; public double altitude; } @@ -104,14 +107,28 @@ public class ICLocation { public static final int MAX_GPS_NOSIGNAL_COUNT = 15; public static final int MAX_GPS_SEARCH_TIMEOUT = 120; + public void setLastWorkingMode(int wkmod) { + last_workmode = wkmod; + } + public void setWorkingMod(int wkmod) { mworkingMod = wkmod; + SystemProperties.set("persist.sys.location_mode", String.valueOf(wkmod)); + + } + + public int getLastWorkingMode() { + return last_workmode; } public void setLocation_cycle(int _locatCycle) { location_cycle = _locatCycle; + + SystemProperties.set("persist.sys.location_cycle", String.valueOf(_locatCycle)); } + private static int last_workmode = NORMAL_MOD; //上一次工作模式,主要用来EMERGENCY_MODE 结束后返回 使用。 + public int getWorkingMod() { return mworkingMod; } @@ -137,6 +154,27 @@ public class ICLocation { public void setLocationStat(LOCATION_STAT stat) { this.currentStat = stat; + //赋值最后一次gps坐标给google查询url + if(stat == LOCATION_STAT.LOCATION_FIXED) + { + String latStr = this.getLocation().latGPSStr; + String lonStr = this.getLocation().lonGPSStr; + String latname = this.getLocation().lat_name; + String lonname = this.getLocation().lon_name; + if (latname.equals("N")) + { + latname=""; + }else{ + latname="-"; + } + if(lonname.equals("E")) + { + lonname=""; + }else{ + lonname="-"; + } + this.getLocation().google_location_url_for_last_gps_fixed_position = String.format("%s%s,%s%s",latname , latStr, lonname ,lonStr ); + } } private void init_data() { @@ -221,10 +259,20 @@ public class ICLocation { currentLP.heading = heding; } + + public void setHeadingStr(String hedingstr) { + currentLP.heading_str = hedingstr; + } + + public float getheading() { return currentLP.heading; } + public String getheadingStr() { + return currentLP.heading_str; + } + public void setUsedStarts(int starts) { currentLP.used_gps_numbs = starts; } @@ -312,7 +360,8 @@ public class ICLocation { } public void setLAC(int lac) { - if(lac!=lastLAC) { + ICLogger.d("lac ==> " + lac); + if(lac!=lastLAC) { ICLogger.d("LAC==> " + lac); LAC = lac; dataChanged = true; @@ -320,6 +369,7 @@ public class ICLocation { } public void setCID(int cid) { + ICLogger.d("cid===> " + cid); if(cid!=lastCID) { CID = cid; dataChanged = true; diff --git a/app/src/main/java/com/ic/protocolSrv/bean/Runtime.java b/app/src/main/java/com/ic/protocolSrv/bean/Runtime.java index 7cf2b84a..f21200d5 100644 --- a/app/src/main/java/com/ic/protocolSrv/bean/Runtime.java +++ b/app/src/main/java/com/ic/protocolSrv/bean/Runtime.java @@ -25,7 +25,7 @@ import java.io.File; import java.util.List; public class Runtime { - private boolean debugflag = false; + private boolean debugflag = true; public int temp_test_Cycle_Seconds = 60 * 60; diff --git a/app/src/main/java/com/ic/protocolSrv/provider/ICGlobalSettingsProvider.java b/app/src/main/java/com/ic/protocolSrv/provider/ICGlobalSettingsProvider.java index 34410472..7a2b4e8f 100644 --- a/app/src/main/java/com/ic/protocolSrv/provider/ICGlobalSettingsProvider.java +++ b/app/src/main/java/com/ic/protocolSrv/provider/ICGlobalSettingsProvider.java @@ -21,7 +21,8 @@ import com.ic.protocolSrv.utils.ICLogger; public class ICGlobalSettingsProvider extends ContentProvider { public static final String PATH = "settings"; - public static final String AUTHORITY = "com.ic.protocolSrv.settings"; + //public static final String AUTHORITY = "com.ic.protocolSrv.settings"; + public static final String AUTHORITY = "com.ic.fzd.settings"; public static final String SETTINGS = "content://" + AUTHORITY + "/" + PATH; private ICDatabaseHelper mDatabase; diff --git a/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java b/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java index 89ce1f53..c721d236 100644 --- a/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java +++ b/app/src/main/java/com/ic/protocolSrv/service/HeartRateManager.java @@ -134,18 +134,23 @@ public class HeartRateManager extends AbstractInvokeHandlerService { private HeartRateManager() { + + } + public void bindServer(){ //这是4.4的ICWorkService //绑定远程服务 + ICLogger.d(" start bind service..."); Intent intent = new Intent(); intent.setAction(ACTION_HEART_RATE); - intent.setPackage(ICApplication.sContext.getPackageName()); + //intent.setPackage(ICApplication.sContext.getPackageName()); + intent.setPackage("com.ic.work"); 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"); + intent8541.setAction(ACTION_HEART_RATE); + intent8541.setPackage("com.ic.work"); ICApplication.sContext.bindService(intent8541, mRemoteConnection8541, Context.BIND_AUTO_CREATE); } @@ -157,7 +162,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService { @Override public void onServiceConnected(ComponentName name, IBinder service) { try { - ICLogger.d("iBloodRemoteService8521 ... on service connected..."); + ICLogger.d("iBloodRemoteService8541 ... on service connected..."); iBloodRemoteService8521 = IBloodRemoteService.Stub.asInterface(service); iBloodRemoteService8521.registerBloodListener(mCallback8541); } catch (Exception e) { @@ -167,6 +172,7 @@ public class HeartRateManager extends AbstractInvokeHandlerService { @Override public void onServiceDisconnected(ComponentName name) { + ICLogger.d("iBloodRemoteService8541 ... on service disconnected..."); iBloodRemoteService8521 = null; } }; @@ -497,6 +503,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService { ICLogger.d("from == > " + from); new Thread(() -> { try { + if(heartRateSensorService == null) + bindServer(); if (heartRateSensorService != null) { //判断类型,如果不是GH301的硬件,直接走全部测试 String isGh301 = Util.getSystemProperties("persist.sys.is_gh301", "false"); @@ -521,6 +529,8 @@ public class HeartRateManager extends AbstractInvokeHandlerService { if (iBloodRemoteService8521 != null) { ICLogger.d("iBloodRemoteService8521...start measure..."); iBloodRemoteService8521.startMeasure(TEST_TIME_OUT); + }else{ + ICLogger.d("iBloodRemoteService8521...null..."); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/ic/protocolSrv/service/SilentManager.java b/app/src/main/java/com/ic/protocolSrv/service/SilentManager.java index 041fa919..3bed5e2e 100644 --- a/app/src/main/java/com/ic/protocolSrv/service/SilentManager.java +++ b/app/src/main/java/com/ic/protocolSrv/service/SilentManager.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.ContentObserver; +import android.database.Cursor; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; @@ -24,6 +25,7 @@ import com.ic.protocolSrv.bean.NoticeContent; import com.ic.protocolSrv.bean.Runtime; import com.ic.protocolSrv.bean.Silent; import com.ic.protocolSrv.bean.StheartRate; +import com.ic.protocolSrv.provider.ICAlarmProvider; import com.ic.protocolSrv.provider.ICContentProvider; import com.ic.protocolSrv.service.base.AbstractInvokeHandlerService; import com.ic.protocolSrv.utils.AlarmHelper; @@ -41,11 +43,14 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import static android.telephony.TelephonyManager.CALL_STATE_OFFHOOK; import static android.telephony.TelephonyManager.CALL_STATE_RINGING; import static com.ic.protocolSrv.Constants.ACTION_ALARM_ALARM_CHANGE; +import static com.ic.protocolSrv.Constants.ACTION_ALARM_DELETE_ALARM; +import static com.ic.protocolSrv.Constants.ACTION_ALARM_DELETE_ALARM_RESULT; import static com.ic.protocolSrv.Constants.ACTION_ANTIOFF_ALARM_CHANGE; import static com.ic.protocolSrv.Constants.ACTION_IC_ALARM; import static com.ic.protocolSrv.Constants.ACTION_CLOSE_UNREAD_MSG; @@ -69,7 +74,6 @@ public class SilentManager extends AbstractInvokeHandlerService { static { mHandler = new Handler(EventLooperHandlerThread.getInstance().makeLooper()); } - ContentObserver mContentObserver = new ContentObserver(mHandler) { public void onChange(boolean var1) { ICLogger.i("静默有变化"); @@ -202,7 +206,7 @@ public class SilentManager extends AbstractInvokeHandlerService { } - private void cancelAlarm(List var1) { + public void cancelAlarm(List var1) { Iterator var2 = var1.iterator(); while (var2.hasNext()) { @@ -826,12 +830,13 @@ public class SilentManager extends AbstractInvokeHandlerService { this.voiceNotice = this.queryNotice(); runtime.getContextProxy().context.getContentResolver().registerContentObserver(ICContentProvider.SILENT_URI, false, this.mContentObserver); this.mAlarmReceiver = new SilentManager.AlramReceiver(); - IntentFilter var5 = new IntentFilter(); - var5.addAction(ACTION_NOTICE_ALARM_CHANGE); - var5.addAction(ACTION_ALARM_ALARM_CHANGE); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(ACTION_NOTICE_ALARM_CHANGE); + intentFilter.addAction(ACTION_ALARM_ALARM_CHANGE); + intentFilter.addAction(ACTION_ALARM_DELETE_ALARM); // var5.addAction("com.ic.protocolSrv.STHEART_RATE_ALARM_CHANGE"); // var5.addAction("com.ic.heartrate.action.RESULT"); - this.mContext.registerReceiver(this.mAlarmReceiver, var5); + this.mContext.registerReceiver(this.mAlarmReceiver, intentFilter); runtime.getContextProxy().getTelephonyManager().listen(this.phoneStateListener, 32); } @@ -917,12 +922,12 @@ public class SilentManager extends AbstractInvokeHandlerService { AlramReceiver() { } - public void onReceive(Context var1, Intent var2) { - String action = var2.getAction(); - StringBuilder var3 = new StringBuilder(); - var3.append("action = "); - var3.append(action); - ICLogger.i(var3.toString()); + public void onReceive(Context var1, Intent intent) { + String action = intent.getAction(); + StringBuilder sb = new StringBuilder(); + sb.append("action = "); + sb.append(action); + ICLogger.i(sb.toString()); if (ACTION_NOTICE_ALARM_CHANGE.equals(action)) { SilentManager.this.voiceNotice = SilentManager.this.queryNotice(); } else if (ACTION_ALARM_ALARM_CHANGE.equals(action)) { @@ -937,9 +942,9 @@ public class SilentManager extends AbstractInvokeHandlerService { SilentManager.this.getStartAndEndStheartRateTime(); SilentManager.this.isStheartRateTime(false); } else if ("com.ic.heartrate.action.RESULT".equals(action)) { - String time = var2.getStringExtra("time"); - int var4 = var2.getIntExtra("value", 0); - int var5 = var2.getIntExtra("type", 0); + String time = intent.getStringExtra("time"); + int var4 = intent.getIntExtra("value", 0); + int var5 = intent.getIntExtra("type", 0); StringBuilder var7 = new StringBuilder(); var7.append("("); var7.append(time); @@ -954,8 +959,44 @@ public class SilentManager extends AbstractInvokeHandlerService { SilentManager.this.sAntioffList = SilentManager.this.queryAntioff(); SilentManager.this.getStartAndEndSantioffTime(); SilentManager.this.mIsNeedAntioff = SilentManager.this.isAntioffTime(false); + } else if (ACTION_ALARM_DELETE_ALARM.equals(action)) { + //刪除闹钟 + //获取到闹钟的ID,然后进行删除 + String alarmId = intent.getStringExtra("alarmId"); + ICLogger.d("delete alarmId ==> " + alarmId); + //查询出来,然后进行删除 + Cursor query = mContext.getContentResolver().query(Uri.parse(ICAlarmProvider.ALARMS), + null, "_id=?", new String[]{alarmId}, null); + if (query != null) { + while (query.moveToNext()) { + Alarm item = new Alarm(); + String id = query.getString(0); + String time = query.getString(1); + String week = query.getString(2); + String ring = query.getString(3); + String status = query.getString(4); + String name = query.getString(5); + String notifyLager = query.getString(6); + item.id = id; + item.time = time; + item.week = week; + item.ring = ring; + item.status = status; + item.name = name; + item.laterRing = notifyLager; + ICLogger.d("alarm is == > " + item); + List alarmlist= new ArrayList(); + alarmlist.add(item); + SilentManager.this.cancelAlarm(alarmlist); + int delete = mContext.getContentResolver().delete(Uri.parse(ICAlarmProvider.ALARMS), + "_id=?", new String[]{alarmId}); + ICLogger.d("delete alarm ==|||=> " + delete); + //通知UI更新 + mContext.sendBroadcast(new Intent(ACTION_ALARM_DELETE_ALARM_RESULT)); + } + query.close(); + } } - } } } \ No newline at end of file diff --git a/app/src/main/java/com/ic/protocolSrv/toolActivity.java b/app/src/main/java/com/ic/protocolSrv/toolActivity.java index 3c8e1da7..0a2b7ea1 100644 --- a/app/src/main/java/com/ic/protocolSrv/toolActivity.java +++ b/app/src/main/java/com/ic/protocolSrv/toolActivity.java @@ -115,7 +115,7 @@ public class toolActivity extends Activity { @Override public void onClick(View view) { Intent intent = new Intent(); - intent.putExtra("smsCmd", "#logctl#=upload,SDLogInfo:Android/V20"); + intent.putExtra("smsCmd", "#maillog#"); CoreService.getInstance().runtime.getContextProxy().sendBroadcast("com.ic.protocolSrv.SMSCMD", intent); } }); diff --git a/app/src/main/java/com/ic/protocolSrv/utils/CellInfoUtil.java b/app/src/main/java/com/ic/protocolSrv/utils/CellInfoUtil.java index 02efdc81..8cac2387 100644 --- a/app/src/main/java/com/ic/protocolSrv/utils/CellInfoUtil.java +++ b/app/src/main/java/com/ic/protocolSrv/utils/CellInfoUtil.java @@ -21,6 +21,8 @@ import android.telephony.gsm.GsmCellLocation; //import com.android.internal.telephony.CallStateException; //import com.android.internal.telephony.Phone; //import com.android.internal.telephony.PhoneFactory; +import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneFactory; import com.ic.protocolSrv.Config; import com.ic.protocolSrv.bean.Runtime; //import com.sprd.internal.telephony.SprdCallManager; @@ -30,8 +32,38 @@ import java.util.Comparator; import java.util.Iterator; import java.util.List; +import rx.Single; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; + +import static com.ic.protocolSrv.Config.DEFAULT_MCCMNC; + public class CellInfoUtil { + public static String getPhoneStatus(Runtime mRuntime) { + TelephonyManager tm = (TelephonyManager) mRuntime + .getContextProxy().context.getSystemService(Context.TELEPHONY_SERVICE); + String str = ""; + //noinspection ConstantConditions + str += "DeviceId(IMEI) = " + tm.getDeviceId() + "\n"; + str += "DeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion() + "\n"; + str += "Line1Number = " + tm.getLine1Number() + "\n"; + str += "NetworkCountryIso = " + tm.getNetworkCountryIso() + "\n"; + str += "NetworkOperator = " + tm.getNetworkOperator() + "\n"; + str += "NetworkOperatorName = " + tm.getNetworkOperatorName() + "\n"; + str += "NetworkType = " + tm.getNetworkType() + "\n"; + str += "PhoneType = " + tm.getPhoneType() + "\n"; + str += "SimCountryIso = " + tm.getSimCountryIso() + "\n"; + str += "SimOperator = " + tm.getSimOperator() + "\n"; + str += "SimOperatorName = " + tm.getSimOperatorName() + "\n"; + str += "SimSerialNumber = " + tm.getSimSerialNumber() + "\n"; + mRuntime.setIccid(tm.getSimSerialNumber()); + str += "SimState = " + tm.getSimState() + "\n"; + str += "SubscriberId(IMSI) = " + tm.getSubscriberId() + "\n"; + mRuntime.setImsi(tm.getSubscriberId()); + str += "VoiceMailNumber = " + tm.getVoiceMailNumber(); + return str; + } public static void dialSilent(Context context, String dialnumber) { // Single.just(null).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() { @@ -68,8 +100,29 @@ public class CellInfoUtil { // } // } // }); + Single.just(null).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() { + public void call(Object param1Object) { + + PhoneFactory.makeDefaultPhones(context); + + Phone p = PhoneFactory.getDefaultPhone(); - } + //SprdCallManager cm = (SprdCallManager) SprdCallManager.getInstance(); + + // cm.registerPhone(p); + + // Phone phone = cm.getDefaultPhone(); + + try { + // phone.dial(dialnumber); + } catch (Exception e) { + ICLogger.PrintExceptionStackTrace(e); + ICLogger.e(e.getMessage(), e); + } + } + }); + + } public static int getSignal(TelephonyManager tm, Runtime runtime) { if (tm == null) return 5; @@ -85,17 +138,17 @@ public class CellInfoUtil { CellSignalStrengthGsm cigsm = ((CellInfoGsm) cinfo).getCellSignalStrength(); ICLogger.i("gsm signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel()); runtime.setSignalInfo("gsm signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel()); - return cigsm.getDbm(); + return cigsm.getDbm() == Integer.MAX_VALUE ? 5 : cigsm.getDbm(); } else if (cinfo instanceof CellInfoLte) { CellSignalStrengthLte cigsm = ((CellInfoLte) cinfo).getCellSignalStrength(); //ICLogger.i("lte signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel()); runtime.setSignalInfo("lte signal dbm =" + cigsm.getDbm() + ",level=" + cigsm.getLevel()); - return cigsm.getDbm(); + return cigsm.getDbm() == Integer.MAX_VALUE ? 5 : cigsm.getDbm(); } else if (cinfo instanceof CellInfoWcdma) { CellSignalStrengthWcdma cicdma = ((CellInfoWcdma) cinfo).getCellSignalStrength(); // ICLogger.i("wcdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel()); runtime.setSignalInfo("wcdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel()); - return cicdma.getDbm(); + return cicdma.getDbm() == Integer.MAX_VALUE ? 5 : cicdma.getDbm(); } } return 2; @@ -105,7 +158,7 @@ public class CellInfoUtil { CellSignalStrengthCdma cicdma = ((CellInfoCdma) cinfo).getCellSignalStrength(); ICLogger.i("cdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel()); runtime.setSignalInfo("cdma signal dbm =" + cicdma.getDbm() + ",level=" + cicdma.getLevel()); - return cicdma.getDbm(); + return cicdma.getDbm() == Integer.MAX_VALUE ? 5 : cicdma.getDbm(); } } return 3; @@ -151,6 +204,11 @@ public class CellInfoUtil { Util.mSleep(5000); mccmnc = telephonyManager.getSimOperator(); } + if(mccmnc == null || (mccmnc != null && mccmnc.trim().isEmpty())){ + mccmnc = DEFAULT_MCCMNC ; + } + if(mccmnc.length()>=6) + mccmnc = mccmnc.substring(0, 5); ICLogger.i("LBS mccmnc " + mccmnc); runtime.setmccmnc(mccmnc); diff --git a/app/src/main/java/com/ic/protocolSrv/utils/DeviceInfoUtil.java b/app/src/main/java/com/ic/protocolSrv/utils/DeviceInfoUtil.java index 1fb4f8f9..7f1d8dc6 100644 --- a/app/src/main/java/com/ic/protocolSrv/utils/DeviceInfoUtil.java +++ b/app/src/main/java/com/ic/protocolSrv/utils/DeviceInfoUtil.java @@ -240,13 +240,16 @@ public class DeviceInfoUtil { SimSignalUtil sim = SimSignalUtil.getInstance(runtime.getContextProxy().context); double wrist_temp; + TelephonyManager tm = runtime.getContextProxy().getTelephonyManager(); + String sim_mccmnc = tm.getSimOperator(); + String network_mccmnc = tm.getNetworkOperator(); // wrist_temp=TemperatureUtil.get_temp_value_adjusted(); return new StringBuilder() .append(TimeUtil.getLocalTime2()).append(" ").append(DeviceInfoUtil.getSWVersionDisplayName()).append("\n") .append(DeviceInfoUtil.getVersionCode(runtime.getContextProxy().context)) .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context) ? " SIM " : " NoSIM ") .append(sim.getNetworkType() == SimSignalUtil.IS_2G ? "2G" : (sim.getNetworkType() == SimSignalUtil.IS_3G) ? "3G" : (sim.getNetworkType() == SimSignalUtil.IS_4G ? "4G" : "unknown")) - .append(" [").append(runtime.getSignalStrength()).append(",").append(runtime.getSignalInfo()).append("] ") + .append(" [").append(runtime.getSignalStrength()).append(",").append(runtime.getSignalInfo()).append("] ").append(" : sim:"+sim_mccmnc+",net:"+network_mccmnc) .append(runtime.IMEI()) .append("\n Srv [P").append(Config.protocol_no).append(" ").append(runtime.getHost()).append(":").append(runtime.getPort()).append("]").append(KeepAlive.isConnected).append(" , HBcycle ").append(runtime.getHeartBeatCycle()) .append("\n ServerConnected is ").append(runtime.isServerProtocolConnected()) @@ -258,13 +261,13 @@ public class DeviceInfoUtil { .append("\n Working Mode ").append(runtime.getLocationInstance().getWorkingMod()) .append(" \n Location Cycle ").append(runtime.getLocationInstance().getLocation_cycle()).append("s") .append(" \n LocationType ").append(runtime.getLocationInstance().getLocationType()) - .append(" at ").append(runtime.getLocationInstance().getLocationTime()) + .append(" at ").append((runtime.getLocationInstance().getLocationTime() !=null &&runtime.getLocationInstance().getLocationTime().length()>2 )?runtime.getLocationInstance().getLocationTime().substring(2):"0") .append(" \n PPGTestCycle ").append(runtime.getPpgTestCycleInMinutes()).append("m") .append("\n LastPPG ").append(runtime.getHRS().getPPG()) .append(",bph ").append(runtime.getHRS().getBPH()) .append(",bpl ").append(runtime.getHRS().getBPL()) - .append(" at ").append(runtime.getHRS().getTestTime()) - .append(" \n TempTestCycle ").append(runtime.temp_test_Cycle_Seconds).append("s") + .append(" at ").append((runtime.getHRS().getTestTime()!=null && runtime.getHRS().getTestTime().length()>2)?runtime.getHRS().getTestTime().substring(2):"0") + .append(" \nTempTestCycle ").append(runtime.temp_test_Cycle_Seconds).append("s") .append("\nrealimei:").append(PhoneUtils.getIMEI(runtime.getContextProxy().context)) .append("\n").append(runtime.getLBSMultiStationData()) .append("\nWiFi Status ").append(Util.isWifiIsOpen(runtime.getContextProxy().context, runtime)) @@ -274,6 +277,11 @@ public class DeviceInfoUtil { public static String getShortDeviceInfo(Runtime runtime) { SimSignalUtil sim = SimSignalUtil.getInstance(runtime.getContextProxy().context); + TelephonyManager tm = runtime.getContextProxy().getTelephonyManager(); + //getNetworkOperatorName()得到的却是拨号卡的运营商名称 + ////getSimOperator()得到的是上网卡运营商名称 + String sim_mccmnc = tm.getSimOperator(); + String network_mccmnc = tm.getNetworkOperator(); // double wrist_temp=TemperatureUtil.get_temp_value_adjusted(); return new StringBuilder("Firmware ") .append(DeviceInfoUtil.getSWVersionDisplayName()).append("\nProtocol ") @@ -282,7 +290,7 @@ public class DeviceInfoUtil { .append("\n" + TimeUtil.getLocalTime()).append("\nNetwork ") .append(SimSignalUtil.hasSimCard(runtime.getContextProxy().context) ? " " : " NoSIM ") .append(sim.getNetworkType() == SimSignalUtil.IS_2G ? "2G" : (sim.getNetworkType() == SimSignalUtil.IS_3G) ? "3G" : (sim.getNetworkType() == SimSignalUtil.IS_4G ? "4G" : "unknown")) - .append("[").append(runtime.getSignalInfo()).append("]") + .append("[").append(runtime.getSignalInfo()).append("]").append(" : sim:"+sim_mccmnc+",net:"+network_mccmnc) .append("\nHeartbeat[P").append(Config.protocol_no).append(" ").append(runtime.getSrvIP()).append(":").append(runtime.getPort()).append(",").append(runtime.isServerProtocolConnected()).append(",").append(runtime.getHeartBeatCycle()) .append("]\nBat").append(runtime.getBattery()).append(",").append(runtime.getBatteryVotage()) .append(" charged ").append(runtime.isPowerConnected()) diff --git a/app/src/main/java/com/ic/protocolSrv/utils/SendEmail.java b/app/src/main/java/com/ic/protocolSrv/utils/SendEmail.java index 4f6789b4..b180f4df 100644 --- a/app/src/main/java/com/ic/protocolSrv/utils/SendEmail.java +++ b/app/src/main/java/com/ic/protocolSrv/utils/SendEmail.java @@ -39,16 +39,20 @@ public class SendEmail { public SendEmail() { - // + /* + + + + */ mailInfo = new MailSenderInfo(); - mailInfo.setMailServerHost("smtp.163.com"); - mailInfo.setMailServerPort("25"); + mailInfo.setMailServerHost("smtp.dreamhost.com"); + mailInfo.setMailServerPort("587"); mailInfo.setValidate(true); - mailInfo.setUserName("sms_sender_jc@163.com"); - mailInfo.setPassword("exstjnzrykytfvnc");// - mailInfo.setFromAddress("sms_sender_jc@163.com"); - mailInfo.setToAddress("snickersun@qq.com"); - mailInfo.setSubject("ICProtocol_MSG"); + mailInfo.setUserName("rick.tang@demo.traxbean.com"); + mailInfo.setPassword("Top@2022");// + mailInfo.setFromAddress("rick.tang@demo.traxbean.com"); + mailInfo.setToAddress("tangrixin716@163.com"); + mailInfo.setSubject("Protocol_MSG"); mailInfo.setContent("Protocollog"); // @@ -57,14 +61,14 @@ public class SendEmail { } public static SendEmail getInstance() { - // if (mSendEmail==null) + if (mSendEmail==null) mSendEmail=new SendEmail(); if (rwl == null) rwl = new ReentrantReadWriteLock(); return mSendEmail; } - public boolean sendLogViaMail(String filename,String mailaddr,String logtime){ + public boolean sendLogViaMail(String filename,String mailaddr,String logtime,String IMEI){ String zipfile=filename; boolean compressSuccess=false; @@ -76,7 +80,7 @@ public class SendEmail { new ZipOutputStream(new CheckedOutputStream(new FileOutputStream(zipfile),new CRC32())) , filename)) { compressSuccess=true; - startSendHtmlEmail(mailaddr,"ICProtocol "+ DeviceInfoUtil.getSWVersionDisplayName() +" at "+logtime,"Log date in "+zipfile+" at " +logtime,new String[]{zipfile}); + startSendHtmlEmail(mailaddr,"ICProtocol="+ DeviceInfoUtil.getSWVersionDisplayName() +",IMEI="+IMEI+","+logtime,"Log date in "+zipfile+" IMEI="+IMEI+" at " +logtime,new String[]{zipfile}); } }catch (Exception e){ diff --git a/app/src/main/java/com/ic/protocolSrv/utils/StorageUtils.java b/app/src/main/java/com/ic/protocolSrv/utils/StorageUtils.java index 19a0e673..8be52954 100644 --- a/app/src/main/java/com/ic/protocolSrv/utils/StorageUtils.java +++ b/app/src/main/java/com/ic/protocolSrv/utils/StorageUtils.java @@ -42,14 +42,14 @@ public final class StorageUtils { public static String getExternalStorageLogDir() { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - File dir = new File(Environment.getExternalStorageDirectory().getPath(), "Android/V20/ic/icprotocol"); + File dir = new File(Environment.getExternalStorageDirectory().getPath(), "Android/ic/icprotocol"); String path = dir.getPath(); if (!dir.exists()) { dir.mkdirs(); } return path; } - return "/storage/emulated/0/Android/V20/ic/icprotocol"; + return "/storage/emulated/0/Android/ic/icprotocol"; } /** * Returns application cache directory. Cache directory will be created on SD card diff --git a/app/src/main/java/com/ic/protocolSrv/utils/TemperatureUtil.java b/app/src/main/java/com/ic/protocolSrv/utils/TemperatureUtil.java index e316e3f0..a0917fd2 100644 --- a/app/src/main/java/com/ic/protocolSrv/utils/TemperatureUtil.java +++ b/app/src/main/java/com/ic/protocolSrv/utils/TemperatureUtil.java @@ -8,6 +8,7 @@ import android.content.Intent; import android.content.ServiceConnection; import android.net.Uri; import android.os.IBinder; +import android.os.RemoteException; import android.util.Log; import com.ic.protocolSrv.Config; @@ -35,9 +36,12 @@ public class TemperatureUtil { private ITempSensorService temperatureRemoteService; private TemperatureUtil() { + + } + public void bind_server(){ Intent intent = new Intent(); intent.setAction(ACTION_TEMPERATURE); - intent.setPackage(ICApplication.sContext.getPackageName()); + intent.setPackage("com.ic.work"); //绑定远程服务 ICApplication.sContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); } @@ -78,6 +82,11 @@ public class TemperatureUtil { private final ITempSensorCallback.Stub mRemoteCallback = new ITempSensorCallback.Stub() { + @Override + public void onTemperatureTestError(String message, int code) throws RemoteException { + + } + @Override public void onTemperatureGet(Temperature temperature) { ICLogger.d("on temperature test end..." + temperature); @@ -156,7 +165,7 @@ public class TemperatureUtil { private void createWarningNotification(String title, String type) { ContentValues contentValues = new ContentValues(); //分类是心率的包名 - contentValues.put(ICDatabaseHelper.notification_category, "com.ic.temperature"); + contentValues.put(ICDatabaseHelper.notification_category, "com.ic.temp"); contentValues.put(ICDatabaseHelper.notification_title, title); contentValues.put(ICDatabaseHelper.notification_type, type); contentValues.put(ICDatabaseHelper.notification_date, System.currentTimeMillis()); @@ -211,16 +220,21 @@ public class TemperatureUtil { * @param from */ public void DoTempTest(int from) { - ICLogger.d("DoTempTest..." + from + " " + Log.getStackTraceString(new Throwable())); + ICLogger.d("DoTempTest..." + from + " " );//+ Log.getStackTraceString(new Throwable())); if (CoreService.getInstance() != null && CoreService.getInstance().getRuntime().Anti_off_flag == 1) { ICLogger.i("未佩戴,取消TempTest!" + from); return; } new Thread(() -> { try { + if(temperatureRemoteService == null) + bind_server(); + if (temperatureRemoteService != null) { ICLogger.d("get temperature info..."); temperatureRemoteService.getTemperatureInfo(from, TemperatureUtil.class.getName()); + }else{ + ICLogger.d("get temperature temperatureRemoteService null..."); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/ic/protocolSrv/utils/TimeUtil.java b/app/src/main/java/com/ic/protocolSrv/utils/TimeUtil.java index 2525cc2d..7b775abd 100644 --- a/app/src/main/java/com/ic/protocolSrv/utils/TimeUtil.java +++ b/app/src/main/java/com/ic/protocolSrv/utils/TimeUtil.java @@ -4,6 +4,8 @@ import android.app.AlarmManager; import android.content.Context; import android.provider.Settings; import android.text.format.DateFormat; +import android.util.Log; + import java.text.ParseException; import java.text.SimpleDateFormat; @@ -15,6 +17,22 @@ import java.util.TimeZone; import static android.content.Context.ALARM_SERVICE; public class TimeUtil { + public static String default_device_date_str = "20230101000000"; + public static Date default_device_date = parseDatetiime(default_device_date_str,TimeZone.getDefault()); + public static void check_and_set_default_time(Context context) + { + + long minutes_current = System.currentTimeMillis()/60000; + long minutes_default = default_device_date.getTime()/60000; + + if(minutes_current < minutes_default){ + setSysDefaultDateTime(context,default_device_date); + ICLogger.d("check_and_set_default_time set DefaultTime"); + }else{ + ICLogger.d("check_and_set_default_time time is currect , skip DefaultTime"); + } + + } public static String getLocalTime() { return getLocalTime(System.currentTimeMillis()); } @@ -23,6 +41,10 @@ public class TimeUtil { return (new SimpleDateFormat("yyyy/MM/dd,HH:mm:ss")).format(new Date(paramLong)); } + public static String getLocalTimeForGoogle(long paramLong) { + return (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date(paramLong)); + } + public static String getLocalTime2() { return getLocalTime2(System.currentTimeMillis()); } @@ -35,6 +57,12 @@ public class TimeUtil { return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date(System.currentTimeMillis())); } + public static String getUTCTimeForCameraMark() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00")); + return simpleDateFormat.format(new Date()); + } + public static String getSystemTime() { return getSystemTime(System.currentTimeMillis()); } @@ -84,14 +112,34 @@ public class TimeUtil { return (new SimpleDateFormat("yyMMddHHmmss")).format(new Date(System.currentTimeMillis())); } + //这个是GPS的时间,修改位置在NMEAListener上 + public static String sGpsDate = "220101"; + public static String getUTCSystemDateYYMMDD() { - return (new SimpleDateFormat("yyMMdd")).format(new Date(System.currentTimeMillis() - TimeZone.getDefault().getRawOffset())); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyMMdd"); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00")); + //如果当前的时间是2022年以前的,那么就使用GPS的时间 + if (System.currentTimeMillis() < 1640966400000L) { + return sGpsDate; + } + return simpleDateFormat.format(new Date()); } + //这个时间在NMEAListener里修改,GPS的时间 + public static String sGpsTime = "000000"; + public static String getUTCSystemTimeHHmmss() { - return (new SimpleDateFormat("HHmmss")).format(new Date(System.currentTimeMillis() - TimeZone.getDefault().getRawOffset())); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HHmmss"); + simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+00:00")); + if (System.currentTimeMillis() < 1640966400000L) { + return sGpsTime; + } + String format = simpleDateFormat.format(new Date()); + ICLogger.d("getUTCSystemTimeHHmmss ==> " + format); + return format; } - public static Date parsetiime( String time) { + + public static Date parseDatetiime( String time) { SimpleDateFormat df1 = new SimpleDateFormat("HH:mm");//需要转化成的时间格式 08:00:00,2016-01-12 Date date1 = null; try { @@ -128,19 +176,26 @@ public class TimeUtil { } - public static Date parseDatetiime(String datetimeStr) { + public static Date parseDatetiime(String datetimeStr, TimeZone timeZone) { // SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);//输入的被转化的时间格式 // SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式 // SimpleDateFormat df2 = new SimpleDateFormat("yyyyMMddHHmmssSSS"); SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMddHHmmss"); + df3.setTimeZone(timeZone); Date date1 = null; try { + String id = timeZone.getID(); + ICLogger.d("format id ==> " + id); date1 = df3.parse(datetimeStr); + ICLogger.d(datetimeStr + " date1 ==> " + date1.getTime()); + long time = date1.getTime(); + String format = df3.format(time); + ICLogger.d("format ==> " + format); return date1; } catch (ParseException e) { e.printStackTrace(); - ICLogger.e(e.getMessage(), e); + Log.d("test", e.getMessage(), e); return null; } // String str1 = df1.format(date1); @@ -264,7 +319,39 @@ public class TimeUtil { android.provider.Settings.Global.putInt(mContext.getContentResolver(), android.provider.Settings.Global.AUTO_TIME, checked); } - public static void setSysDateTime(Context mContext, Date datetime, String timezoneStr, boolean addtimezoneToTime) { + public static void setSysDefaultDateTime(Context mContext, Date datetime) { + AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); + Locale.getDefault().getDisplayCountry(); + boolean addtimezoneToTime = true; + TimeZone tz = TimeZone.getDefault(); + ICLogger.i("====set timezone " + tz.getDisplayName()); + + Calendar c = Calendar.getInstance(); + + ICLogger.i("====origin time " + c.getTime().toString() + " time zone " + c.getTimeZone()); + c.setTime(datetime); + + c.setTimeZone(tz); + +// alarmManager.setTimeZone(); + long when = c.getTimeInMillis(); + if (when / 1000 < Integer.MAX_VALUE) { + //SystemClock.setCurrentTimeMillis(when); + alarmManager.setTime(when); + } + + Calendar d = Calendar.getInstance(); + long now = d.getTimeInMillis(); + //Log.d(TAG, "set tm="+when + ", now tm="+now); + + if (now - when > 1000) { + ICLogger.i("====set time failed now(" + now + ")-when(" + when + ") > 1000 !"); + } + + ICLogger.i("====set time to " + d.getTime().toString() + " time zone " + d.getTimeZone()); + + } + public static void setSysDateTime(Context mContext, Date datetime, String timezoneStr, boolean addtimezoneToTime) { AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); Locale.getDefault().getDisplayCountry(); String timezone_name = ""; @@ -320,10 +407,31 @@ public class TimeUtil { } + + public static void setSysDateTime(Context mContext, Date datetime, int timezone, boolean addtimezoneToTime) { + //Log.d(TAG, "set tm="+when + ", now tm="+now); + ICLogger.d("timezone ==> " + timezone); + Calendar d = Calendar.getInstance(); + ICLogger.d("====before " + d.getTime().toString() + " time zone " + d.getTimeZone()); + doTimeSet(mContext, datetime, timezone, addtimezoneToTime); + Calendar c = Calendar.getInstance(); + ICLogger.d("====aftert " + c.getTime().toString() + " time zone " + c.getTimeZone()); + //当前系统时间 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long l = System.currentTimeMillis(); + ICLogger.d("current time ==> " + l); + TimeZone timeZone = simpleDateFormat.getTimeZone(); + ICLogger.d("timeZone after ==> " + timeZone.getID()); + String format = simpleDateFormat.format(l); + ICLogger.d("format == " + format); + String utcSystemTimeHHmmss = getUTCSystemTimeHHmmss(); + ICLogger.d("utcSystemTimeHHmmss ==> " + utcSystemTimeHHmmss); + } + + private static void doTimeSet(Context mContext, Date datetime, int timezone, boolean addtimezoneToTime) { AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); - Locale.getDefault().getDisplayCountry(); String timezone_name = ""; if (timezone > 0) { timezone_name = String.format("GMT+%1$02d:00", Math.abs(timezone)); @@ -331,38 +439,38 @@ public class TimeUtil { } else { timezone_name = String.format("GMT-%1$02d:00", Math.abs(timezone)); } - TimeZone tz = TimeZone.getTimeZone(timezone_name); - ICLogger.i("====set timezone " + tz.getDisplayName()); + ICLogger.d("dataTime ==> " + datetime.getTime()); + ICLogger.d("timezone_name ==> " + timezone_name); + Date date = convertTimezone(datetime, TimeZone.getTimeZone(timezone_name)); + long time = date.getTime(); + ICLogger.d("time ==> " + time); + alarmManager.setTimeZone(timezone_name); + alarmManager.setTime(time); + } - Calendar c = Calendar.getInstance(); + public static Date convertTimezone(Date sourceDate, TimeZone targetTimezone) { - ICLogger.i("====origin time " + c.getTime().toString() + " time zone " + c.getTimeZone()); - c.setTime(datetime); - if (addtimezoneToTime) { - if (is24Hour(mContext)) { - c.add(Calendar.HOUR_OF_DAY, timezone);//24小时制 - } else { - c.add(Calendar.HOUR, timezone);//12小时制 - } - c.setTimeZone(tz); - } -// alarmManager.setTimeZone(); - long when = c.getTimeInMillis(); - if (when / 1000 < Integer.MAX_VALUE) { - //SystemClock.setCurrentTimeMillis(when); - alarmManager.setTime(when); - } + // targetDate - sourceDate=targetTimezone-sourceTimezone + // ---> + // targetDate=sourceDate + (targetTimezone-sourceTimezone) - Calendar d = Calendar.getInstance(); - long now = d.getTimeInMillis(); - //Log.d(TAG, "set tm="+when + ", now tm="+now); - if (now - when > 1000) { - ICLogger.i("====set time failed now(" + now + ")-when(" + when + ") > 1000 !"); - } + Calendar calendar = Calendar.getInstance(); + // date.getTime() 为时间戳, 为格林尼治到系统现在的时间差,世界各个地方获取的时间戳是一样的, + // 格式化输出时,因为设置了不同的时区,所以输出不一样 + long sourceTime = sourceDate.getTime(); - ICLogger.i("====set time to " + d.getTime().toString() + " time zone " + d.getTimeZone()); + + calendar.setTimeZone(targetTimezone); + calendar.setTimeInMillis(sourceTime);// 设置之后,calendar会计算各种filed对应的值,并保存 + + //获取源时区的到UTC的时区差 + int sourceZoneOffset = calendar.get(Calendar.ZONE_OFFSET); + ICLogger.d("sourceZoneOffset ==> " + sourceZoneOffset); + long targetTime = sourceTime + sourceZoneOffset; + ICLogger.d("targetTime ==> " + targetTime); + return new Date(targetTime); } @@ -513,8 +621,8 @@ public class TimeUtil { } public static long diffBetween2DateInMinutes(String dateBefore_yyyyMMDDhhmmss, String dateAfter_yyyyMMDDhhmmss) { - long date1_ms = parseDatetiime(dateBefore_yyyyMMDDhhmmss).getTime(); - long date2_ms = parseDatetiime(dateAfter_yyyyMMDDhhmmss).getTime(); + long date1_ms = parseDatetiime(dateBefore_yyyyMMDDhhmmss, TimeZone.getDefault()).getTime(); + long date2_ms = parseDatetiime(dateAfter_yyyyMMDDhhmmss, TimeZone.getDefault()).getTime(); return (date2_ms - date1_ms) / 60000; } diff --git a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java index 172b3f39..ae4af6d7 100644 --- a/app/src/main/java/com/ic/protocols/protocolAPIHelper.java +++ b/app/src/main/java/com/ic/protocols/protocolAPIHelper.java @@ -79,6 +79,8 @@ public class protocolAPIHelper { case Config.PROTOCOL_JIAI: break; case Config.PROTOCOL_BEEHOME: + //TODO:获取天气信息 + connection.send(protocol_beehome.APTQ(runtime)); break; case Config.PROTOCOL_IC: break; @@ -102,6 +104,83 @@ public class protocolAPIHelper { } } + public static StringMessage getJustBloodPresureMsg(Runtime runtime) { + if (is_protocol_not_Initialled()) return null; + StringMessage ret = null; + + if (runtime == null || runtime.getHRS().getBPH() <= 0) { + ICLogger.d(" 血压 值 <=0 跳过异常数据!"); + return null; + } + switch (Config.protocol_no) { + case Config.PROTOCOL_BEEHOME: + ret = protocol_beehome.APJK(1, runtime); + break; + } + return ret; + } + + public static boolean parseTestData(String cmd) { + if (is_protocol_not_Initialled()) return false; + switch (Config.protocol_no) { + case Config.PROTOCOL_BEEHOME: + protocolbeehome_handler.parserTesterCmdStr(cmd); + break; + } + return true; + } + + public static StringMessage getJustBloodOxygenMsg(Runtime runtime) { + if (is_protocol_not_Initialled()) return null; + StringMessage ret = null; + + if (runtime == null || runtime.getHRS().getBPH() <= 0) { + ICLogger.d(" 血压 值 <=0 跳过异常数据!"); + return null; + } + switch (Config.protocol_no) { + case Config.PROTOCOL_BEEHOME: + ret = protocol_beehome.APJK(4, runtime); + break; + } + return ret; + } + + public static boolean sendMsg2Web(String cmdIndex, String msg) { + //只要服务器收到消息,就认为服务器是联通的,保存联通的时间 + Runtime.lastLinkReceiveStamp = System.currentTimeMillis(); + if (is_protocol_not_Initialled()) return false; + switch (Config.protocol_no) { + case Config.PROTOCOL_JIAI: + break; + case Config.PROTOCOL_BEEHOME: + protocolbeehome_handler.sendMsg2Web(cmdIndex, msg); + break; + case Config.PROTOCOL_IC: + break; + case Config.PROTOCOL_FZD: + break; + case Config.PROTOCOL_MQTT: + break; + case PROTOCOL_ANAN: + break; + case Config.PROTOCOL_S123: + break; + case Config.PROTOCOL_GATOR: + break; + } + return true; + } + + public static boolean requestWeTalkMsg() { + if (is_protocol_not_Initialled()) return false; + switch (Config.protocol_no) { + case Config.PROTOCOL_BEEHOME: + protocolbeehome_handler.doAP05(); + break; + } + return true; + } public static void sendShutdownMsg() { switch (Config.protocol_no) { case Config.PROTOCOL_JIAI: @@ -447,7 +526,7 @@ public class protocolAPIHelper { ret = protocol_jiai.AP50(runtime); break; case Config.PROTOCOL_BEEHOME: - ret = protocol_beehome.APTP(temp_adusted, body_temp); + ret = protocol_beehome.APJK(3, runtime); break; case Config.PROTOCOL_IC: ret = protocol_ic.APTP(temp_adusted, body_temp, tempout); @@ -669,6 +748,7 @@ public class protocolAPIHelper { case Config.PROTOCOL_JIAI: break; case Config.PROTOCOL_BEEHOME: + protocolbeehome_handler.sendVoice(duration, remoteNum, content, voiceId); break; case Config.PROTOCOL_IC: break; @@ -734,7 +814,14 @@ public class protocolAPIHelper { ret = protocol_jiai.AP07(packetTime, count, index, datalen, amrdata); break; case Config.PROTOCOL_BEEHOME: - ret = protocol_beehome.AP07(packetTime, count, index, datalen, amrdata); + ICLogger.d("fileType ==> " + filetype); + ICLogger.d("dataType ==> " + datatype); + if (filetype == 1 && datatype == 3) { + //对讲用的类型 + ret = protocol_beehome.AP07(packetTime, count, index, datalen, amrdata); + } else { + ret = protocol_beehome.AP42(packetTime, count, index, datalen, amrdata); + } break; case Config.PROTOCOL_IC: /*** @@ -790,7 +877,7 @@ public class protocolAPIHelper { ret = protocol_jiai.APHT(runtime); break; case Config.PROTOCOL_BEEHOME: - ret = protocol_beehome.APHT(runtime); + ret = protocol_beehome.APJK(2, runtime); break; case Config.PROTOCOL_IC: ret = protocol_ic.APHP(runtime); @@ -1226,7 +1313,7 @@ public class protocolAPIHelper { ret = null; break; case Config.PROTOCOL_BEEHOME: - ret = null; + ret = protocol_beehome.genUD2FromUD(msg); break; case Config.PROTOCOL_IC: ret = null; diff --git a/app/src/main/java/com/ic/protocols/protocol_beehome.java b/app/src/main/java/com/ic/protocols/protocol_beehome.java index 830f5503..6d829047 100644 --- a/app/src/main/java/com/ic/protocols/protocol_beehome.java +++ b/app/src/main/java/com/ic/protocols/protocol_beehome.java @@ -1,36 +1,64 @@ package com.ic.protocols; +import android.Manifest; import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Environment; +import android.os.Handler; +import android.os.HandlerThread; +import android.support.v4.app.ActivityCompat; +import android.text.TextUtils; +import android.widget.Toast; import com.ic.protocolSrv.Config; +import com.ic.protocolSrv.Constants; import com.ic.protocolSrv.CoreService; +import com.ic.protocolSrv.LocationClient; import com.ic.protocolSrv.bean.Alarm; import com.ic.protocolSrv.bean.Contact; -import com.ic.protocolSrv.bean.Content; import com.ic.protocolSrv.bean.ICLocation; import com.ic.protocolSrv.bean.Runtime; import com.ic.protocolSrv.bean.StringMessage; import com.ic.protocolSrv.bean.VoiceContent; import com.ic.protocolSrv.bean.voicePacket; +import com.ic.protocolSrv.provider.ICAlarmProvider; +import com.ic.protocolSrv.provider.ICDatabaseHelper; +import com.ic.protocolSrv.provider.ICMembersProvider; +import com.ic.protocolSrv.provider.WeTalkMessageProvider; import com.ic.protocolSrv.service.HeartRateManager; +import com.ic.protocolSrv.service.SilentManager; +import com.ic.protocolSrv.utils.CameraUtil; +import com.ic.protocolSrv.utils.CellInfoUtil; import com.ic.protocolSrv.utils.Connection; import com.ic.protocolSrv.utils.DeviceInfoUtil; +import com.ic.protocolSrv.utils.HeartRateOxygenTestType; import com.ic.protocolSrv.utils.ICLogger; import com.ic.protocolSrv.utils.TemperatureUtil; import com.ic.protocolSrv.utils.TimeUtil; + + import com.ic.protocolSrv.utils.Util; +import com.ic.s123.GenericWeatherInfo; import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.List; +import java.util.TimeZone; +import static com.ic.protocolSrv.Constants.ACTION_ALARM_ALARM_CHANGE; +import static com.ic.protocolSrv.Constants.DIALOG_ACTION; import static com.ic.protocolSrv.Constants.FROM_SERVER; import static com.ic.protocolSrv.LocationClient.LOCATION_MODE; -import static com.ic.protocolSrv.bean.Contact.GROUP_ALL; import static java.lang.Math.abs; public class protocol_beehome { @@ -41,6 +69,73 @@ public class protocol_beehome { private static final String CMDSPLIT = ","; public static final String defaultServerIP = "en.beehome360.com"; public static final int defaultServerPort = 5018; + private Handler mHandler = null; + + + public static byte[] AP42(String packetTime, int count, int index, int datalen, byte[] amrdata) { + String sb = new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP42)) + .append(CMDSPLIT).append(packetTime) + .append(CMDSPLIT).append(count) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(datalen * 2) + .append(CMDSPLIT).toString(); + byte[] sentbuf = new byte[sb.length() + datalen * 2 + 1]; + byte[] amrdata2 = Util.bytesToHexString(amrdata).getBytes(); + System.arraycopy(sb.getBytes(), 0, sentbuf, 0, sb.length()); + System.arraycopy(amrdata2, 0, sentbuf, sb.length(), datalen * 2); + sentbuf[sb.length() + datalen * 2] = '#'; + return sentbuf; + } + + public static StringMessage genUD2FromUD(StringMessage ud) { + String data, tmp; + tmp = ud.isFromCache(); + if (isCmdStr(tmp).equals("AP01")) { + tmp = ud.isFromCache().replace("]", ""); + int index = tmp.indexOf("AP01,"); + data = tmp.substring(index + 3); + return genStringMessage("APH1 ", data); + } else { + return null; + } + } + + /** + * 解析测试指令 + * + * @param cmd + */ + public void parserTesterCmdStr(String cmd) { + if (cmd.length() < 4) { + ICLogger.d("cmd length error..." + cmd); + return; + } + + ICLogger.d("cmd ==> " + cmd); + String cmdKey = cmd.substring(2, 6); + ICLogger.d("cmdKey ==> " + cmdKey); + CMD_TYPE cmd_type = cmdMap.get(cmdKey); + handleCmd(cmd_type, cmd); + } + + public void sendMsg2Web(String cmdIndex, String msg) { + //返回的消息在短信处理之后进行返回 + mConnection.send(genStringMessage(cmdStrMap.get(CMD_TYPE.APSM), + new StringBuffer(CMDHEADER) + .append(cmdStrMap.get(CMD_TYPE.APSM)) + .append(CMDSPLIT) + .append(cmdIndex) + .append(CMDSPLIT) + .append(msg) + .toString())); + } + + public void doAP05() { + ICLogger.d("doAP05..."); + String ap05Msg = AP05(true); + StringMessage stringMessage = genStringMessage(cmdStrMap.get(CMD_TYPE.AP05), ap05Msg); + mConnection.send(stringMessage); + } public enum CMD_TYPE { /*终端发起*/ @@ -87,6 +182,8 @@ public class protocol_beehome { BP28, //语音下行 AP31, BP31,//关机 + BP32,//拨号指令 + AP32, AP33, BP33,//工作模式 AP34, @@ -107,6 +204,8 @@ public class protocol_beehome { BP85,//设置闹钟 AP86, BP86,//绑定解绑 + AP87,//二维码获取 + BP87, AP88, BP88,//查找手表 AP89, @@ -124,90 +223,241 @@ public class protocol_beehome { UNKNOWN_CMD, BPTF,//时间设置 APTF,//时间设置 - } - - private static HashMap cmdMap = null; + BPSQ,//设置体征信息监测间隔 + APSQ, + BPMC,//专门控制skipmovecheck + APMC,// + BPPH,//拨号功能开关 + APPH, + APJK,//上传健康数据,用这个接口,可以去掉体温心率的接口了 + BPJK,//平台响应 + BPSM,//平台下发短信指令 + APSM,//设备回复是否收到平台短信指令 + APTQ,//天气信息请求 + BPTQ,//天气信息响应 + BP75,//闹钟数据下发 + AP75,//闹钟数据回复 + AP46,//立即拍照 + BP46, + AP42,//图片上传 + BP42, + APH1,//无网络状态下的定位数据 + BPH1, + BPOX, //IWBPOX,IMEI,流水号,1# + APOX, + } + + private static HashMap cmdStrMap = null; + private static HashMap cmdMap = null; static { - cmdMap = new HashMap(); - cmdMap.put(CMD_TYPE.AP00, "AP00"); - cmdMap.put(CMD_TYPE.BP00, "BP00"); - cmdMap.put(CMD_TYPE.AP01, "AP01"); - cmdMap.put(CMD_TYPE.BP01, "BP01"); - cmdMap.put(CMD_TYPE.AP02, "AP02"); - cmdMap.put(CMD_TYPE.BP02, "BP02"); - cmdMap.put(CMD_TYPE.AP92, "AP92"); - cmdMap.put(CMD_TYPE.BP92, "BP92"); - cmdMap.put(CMD_TYPE.AP03, "AP03"); - cmdMap.put(CMD_TYPE.BP03, "BP03"); - cmdMap.put(CMD_TYPE.AP05, "AP05"); - cmdMap.put(CMD_TYPE.BP05, "BP05"); - cmdMap.put(CMD_TYPE.AP07, "AP07"); - cmdMap.put(CMD_TYPE.BP07, "BP07"); - cmdMap.put(CMD_TYPE.AP10, "AP10"); - cmdMap.put(CMD_TYPE.BP10, "BP10"); - cmdMap.put(CMD_TYPE.AP49, "AP49"); - cmdMap.put(CMD_TYPE.BP49, "BP49"); - cmdMap.put(CMD_TYPE.APHT, "APHT"); - cmdMap.put(CMD_TYPE.BPHT, "BPHT"); - cmdMap.put(CMD_TYPE.APTM, "APTM"); - cmdMap.put(CMD_TYPE.BPTM, "BPTM"); - cmdMap.put(CMD_TYPE.BPVR,"BPVR"); - cmdMap.put(CMD_TYPE.APVR,"APVR"); - cmdMap.put(CMD_TYPE.AP12, "AP12"); - cmdMap.put(CMD_TYPE.BP12, "BP12"); - cmdMap.put(CMD_TYPE.AP14, "AP14"); - cmdMap.put(CMD_TYPE.BP14, "BP14"); - cmdMap.put(CMD_TYPE.AP15, "AP15"); - cmdMap.put(CMD_TYPE.BP15, "BP15"); - cmdMap.put(CMD_TYPE.AP16, "AP16"); - cmdMap.put(CMD_TYPE.BP16, "BP16"); - cmdMap.put(CMD_TYPE.AP17, "AP17"); - cmdMap.put(CMD_TYPE.BP17, "BP17"); - cmdMap.put(CMD_TYPE.AP18, "AP18"); - cmdMap.put(CMD_TYPE.BP18, "BP18"); - cmdMap.put(CMD_TYPE.AP21, "AP21"); - cmdMap.put(CMD_TYPE.BP21, "BP21"); - cmdMap.put(CMD_TYPE.AP28, "AP28"); - cmdMap.put(CMD_TYPE.BP28, "BP28"); - cmdMap.put(CMD_TYPE.AP31, "AP31"); - cmdMap.put(CMD_TYPE.BP31, "BP31"); - cmdMap.put(CMD_TYPE.AP33, "AP33"); - cmdMap.put(CMD_TYPE.BP33, "BP33"); - cmdMap.put(CMD_TYPE.AP34, "AP34"); - cmdMap.put(CMD_TYPE.BP34, "BP34"); - cmdMap.put(CMD_TYPE.AP40, "AP40"); - cmdMap.put(CMD_TYPE.BP40, "BP40"); - cmdMap.put(CMD_TYPE.AP68, "AP68"); - cmdMap.put(CMD_TYPE.BP68, "BP68"); - cmdMap.put(CMD_TYPE.APXL, "APXL"); - cmdMap.put(CMD_TYPE.BPXL, "BPXL"); - cmdMap.put(CMD_TYPE.APXY, "APXY"); - cmdMap.put(CMD_TYPE.BPXY, "BPXY"); - cmdMap.put(CMD_TYPE.APJZ, "APJZ"); - cmdMap.put(CMD_TYPE.BPJZ, "BPJZ"); - cmdMap.put(CMD_TYPE.AP84, "AP84"); - cmdMap.put(CMD_TYPE.BP84, "BP84"); - cmdMap.put(CMD_TYPE.AP85, "AP85"); - cmdMap.put(CMD_TYPE.BP85, "BP85"); - cmdMap.put(CMD_TYPE.AP86, "AP86"); - cmdMap.put(CMD_TYPE.BP86, "BP86"); - cmdMap.put(CMD_TYPE.AP88, "AP88"); - cmdMap.put(CMD_TYPE.BP88, "BP88"); - cmdMap.put(CMD_TYPE.AP89, "AP89"); - cmdMap.put(CMD_TYPE.BP89, "BP89"); - cmdMap.put(CMD_TYPE.APTE, "APTE"); - cmdMap.put(CMD_TYPE.BPTE, "BPTE"); - cmdMap.put(CMD_TYPE.APTP, "APTP"); - cmdMap.put(CMD_TYPE.BPTP, "BPTP"); - cmdMap.put(CMD_TYPE.APX1, "APX1"); - cmdMap.put(CMD_TYPE.BPX1, "BPX1"); - cmdMap.put(CMD_TYPE.APS4, "APS4"); - cmdMap.put(CMD_TYPE.BPS4, "BPS4"); - cmdMap.put(CMD_TYPE.APHP, "APHP"); - cmdMap.put(CMD_TYPE.BPHP, "BPHP"); - cmdMap.put(CMD_TYPE.BPTF, "BPTF"); - cmdMap.put(CMD_TYPE.APTF, "APTF"); + cmdStrMap = new HashMap<>(); + cmdStrMap.put(CMD_TYPE.AP00, "AP00"); + cmdStrMap.put(CMD_TYPE.BP00, "BP00"); + cmdStrMap.put(CMD_TYPE.AP01, "AP01"); + cmdStrMap.put(CMD_TYPE.BP01, "BP01"); + cmdStrMap.put(CMD_TYPE.AP02, "AP02"); + cmdStrMap.put(CMD_TYPE.BP02, "BP02"); + cmdStrMap.put(CMD_TYPE.AP92, "AP92"); + cmdStrMap.put(CMD_TYPE.BP92, "BP92"); + cmdStrMap.put(CMD_TYPE.AP03, "AP03"); + cmdStrMap.put(CMD_TYPE.BP03, "BP03"); + cmdStrMap.put(CMD_TYPE.AP05, "AP05"); + cmdStrMap.put(CMD_TYPE.BP05, "BP05"); + cmdStrMap.put(CMD_TYPE.AP07, "AP07"); + cmdStrMap.put(CMD_TYPE.BP07, "BP07"); + cmdStrMap.put(CMD_TYPE.AP10, "AP10"); + cmdStrMap.put(CMD_TYPE.BP10, "BP10"); + cmdStrMap.put(CMD_TYPE.AP49, "AP49"); + cmdStrMap.put(CMD_TYPE.BP49, "BP49"); + cmdStrMap.put(CMD_TYPE.APHT, "APHT"); + cmdStrMap.put(CMD_TYPE.BPHT, "BPHT"); + cmdStrMap.put(CMD_TYPE.APTM, "APTM"); + cmdStrMap.put(CMD_TYPE.BPTM, "BPTM"); + cmdStrMap.put(CMD_TYPE.BPVR, "BPVR"); + cmdStrMap.put(CMD_TYPE.APVR, "APVR"); + cmdStrMap.put(CMD_TYPE.AP12, "AP12"); + cmdStrMap.put(CMD_TYPE.BP12, "BP12"); + cmdStrMap.put(CMD_TYPE.AP14, "AP14"); + cmdStrMap.put(CMD_TYPE.BP14, "BP14"); + cmdStrMap.put(CMD_TYPE.AP15, "AP15"); + cmdStrMap.put(CMD_TYPE.BP15, "BP15"); + cmdStrMap.put(CMD_TYPE.AP16, "AP16"); + cmdStrMap.put(CMD_TYPE.BP16, "BP16"); + cmdStrMap.put(CMD_TYPE.AP17, "AP17"); + cmdStrMap.put(CMD_TYPE.BP17, "BP17"); + cmdStrMap.put(CMD_TYPE.AP18, "AP18"); + cmdStrMap.put(CMD_TYPE.BP18, "BP18"); + cmdStrMap.put(CMD_TYPE.AP21, "AP21"); + cmdStrMap.put(CMD_TYPE.BP21, "BP21"); + cmdStrMap.put(CMD_TYPE.AP28, "AP28"); + cmdStrMap.put(CMD_TYPE.BP28, "BP28"); + cmdStrMap.put(CMD_TYPE.AP31, "AP31"); + cmdStrMap.put(CMD_TYPE.BP31, "BP31"); + cmdStrMap.put(CMD_TYPE.BP32, "BP32"); + cmdStrMap.put(CMD_TYPE.AP32, "AP32"); + cmdStrMap.put(CMD_TYPE.AP33, "AP33"); + cmdStrMap.put(CMD_TYPE.BP33, "BP33"); + cmdStrMap.put(CMD_TYPE.AP34, "AP34"); + cmdStrMap.put(CMD_TYPE.BP34, "BP34"); + cmdStrMap.put(CMD_TYPE.AP40, "AP40"); + cmdStrMap.put(CMD_TYPE.BP40, "BP40"); + cmdStrMap.put(CMD_TYPE.AP68, "AP68"); + cmdStrMap.put(CMD_TYPE.BP68, "BP68"); + cmdStrMap.put(CMD_TYPE.APXL, "APXL"); + cmdStrMap.put(CMD_TYPE.BPXL, "BPXL"); + cmdStrMap.put(CMD_TYPE.APXY, "APXY"); + cmdStrMap.put(CMD_TYPE.BPXY, "BPXY"); + cmdStrMap.put(CMD_TYPE.APJZ, "APJZ"); + cmdStrMap.put(CMD_TYPE.BPJZ, "BPJZ"); + cmdStrMap.put(CMD_TYPE.AP84, "AP84"); + cmdStrMap.put(CMD_TYPE.BP84, "BP84"); + cmdStrMap.put(CMD_TYPE.AP85, "AP85"); + cmdStrMap.put(CMD_TYPE.BP85, "BP85"); + cmdStrMap.put(CMD_TYPE.AP86, "AP86"); + cmdStrMap.put(CMD_TYPE.BP86, "BP86"); + cmdStrMap.put(CMD_TYPE.AP88, "AP88"); + cmdStrMap.put(CMD_TYPE.BP88, "BP88"); + cmdStrMap.put(CMD_TYPE.AP89, "AP89"); + cmdStrMap.put(CMD_TYPE.BP89, "BP89"); + cmdStrMap.put(CMD_TYPE.APTE, "APTE"); + cmdStrMap.put(CMD_TYPE.BPTE, "BPTE"); + cmdStrMap.put(CMD_TYPE.APTP, "APTP"); + cmdStrMap.put(CMD_TYPE.BPTP, "BPTP"); + cmdStrMap.put(CMD_TYPE.APX1, "APX1"); + cmdStrMap.put(CMD_TYPE.BPX1, "BPX1"); + cmdStrMap.put(CMD_TYPE.APS4, "APS4"); + cmdStrMap.put(CMD_TYPE.BPS4, "BPS4"); + cmdStrMap.put(CMD_TYPE.APHP, "APHP"); + cmdStrMap.put(CMD_TYPE.BPHP, "BPHP"); + cmdStrMap.put(CMD_TYPE.BPTF, "BPTF"); + cmdStrMap.put(CMD_TYPE.APTF, "APTF"); + cmdStrMap.put(CMD_TYPE.BPSQ, "BPSQ"); + cmdStrMap.put(CMD_TYPE.APSQ, "APSQ"); + cmdStrMap.put(CMD_TYPE.BPMC, "BPMC"); + cmdStrMap.put(CMD_TYPE.APMC, "APMC"); + cmdStrMap.put(CMD_TYPE.BPPH, "BPPH"); + cmdStrMap.put(CMD_TYPE.APPH, "APPH"); + cmdStrMap.put(CMD_TYPE.APJK, "APJK"); + cmdStrMap.put(CMD_TYPE.BPJK, "BPJK"); + cmdStrMap.put(CMD_TYPE.BPSM, "BPSM"); + cmdStrMap.put(CMD_TYPE.APSM, "APSM"); + cmdStrMap.put(CMD_TYPE.APTQ, "APTQ"); + cmdStrMap.put(CMD_TYPE.BPTQ, "BPTQ"); + cmdStrMap.put(CMD_TYPE.BP75, "BP75"); + cmdStrMap.put(CMD_TYPE.AP75, "AP75"); + cmdStrMap.put(CMD_TYPE.AP46, "AP46"); + cmdStrMap.put(CMD_TYPE.BP46, "BP46"); + cmdStrMap.put(CMD_TYPE.AP42, "AP42"); + cmdStrMap.put(CMD_TYPE.BP42, "BP42"); + cmdStrMap.put(CMD_TYPE.APH1, "APH1"); + cmdStrMap.put(CMD_TYPE.BPH1, "BPH1"); + cmdStrMap.put(CMD_TYPE.BPOX, "BPOX"); + cmdStrMap.put(CMD_TYPE.APOX, "APOX"); + + // + cmdMap = new HashMap<>(); + cmdMap.put("AP00", CMD_TYPE.AP00); + cmdMap.put("BP00", CMD_TYPE.BP00); + cmdMap.put("AP01", CMD_TYPE.AP01); + cmdMap.put("BP01", CMD_TYPE.BP01); + cmdMap.put("AP02", CMD_TYPE.AP02); + cmdMap.put("BP02", CMD_TYPE.BP02); + cmdMap.put("AP92", CMD_TYPE.AP92); + cmdMap.put("BP92", CMD_TYPE.BP92); + cmdMap.put("AP03", CMD_TYPE.AP03); + cmdMap.put("BP03", CMD_TYPE.BP03); + cmdMap.put("AP05", CMD_TYPE.AP05); + cmdMap.put("BP05", CMD_TYPE.BP05); + cmdMap.put("AP07", CMD_TYPE.AP07); + cmdMap.put("BP07", CMD_TYPE.BP07); + cmdMap.put("AP10", CMD_TYPE.AP10); + cmdMap.put("BP10", CMD_TYPE.BP10); + cmdMap.put("AP49", CMD_TYPE.AP49); + cmdMap.put("BP49", CMD_TYPE.BP49); + cmdMap.put("APHT", CMD_TYPE.APHT); + cmdMap.put("BPHT", CMD_TYPE.BPHT); + cmdMap.put("APTM", CMD_TYPE.APTM); + cmdMap.put("BPTM", CMD_TYPE.BPTM); + cmdMap.put("BPVR", CMD_TYPE.BPVR); + cmdMap.put("APVR", CMD_TYPE.APVR); + cmdMap.put("AP12", CMD_TYPE.AP12); + cmdMap.put("BP12", CMD_TYPE.BP12); + cmdMap.put("AP14", CMD_TYPE.AP14); + cmdMap.put("BP14", CMD_TYPE.BP14); + cmdMap.put("AP15", CMD_TYPE.AP15); + cmdMap.put("BP15", CMD_TYPE.BP15); + cmdMap.put("AP16", CMD_TYPE.AP16); + cmdMap.put("BP16", CMD_TYPE.BP16); + cmdMap.put("AP17", CMD_TYPE.AP17); + cmdMap.put("BP17", CMD_TYPE.BP17); + cmdMap.put("AP18", CMD_TYPE.AP18); + cmdMap.put("BP18", CMD_TYPE.BP18); + cmdMap.put("AP21", CMD_TYPE.AP21); + cmdMap.put("BP21", CMD_TYPE.BP21); + cmdMap.put("AP28", CMD_TYPE.AP28); + cmdMap.put("BP28", CMD_TYPE.BP28); + cmdMap.put("AP31", CMD_TYPE.AP31); + cmdMap.put("BP31", CMD_TYPE.BP31); + cmdMap.put("AP33", CMD_TYPE.AP33); + cmdMap.put("BP33", CMD_TYPE.BP33); + cmdMap.put("AP34", CMD_TYPE.AP34); + cmdMap.put("BP34", CMD_TYPE.BP34); + cmdMap.put("AP40", CMD_TYPE.AP40); + cmdMap.put("BP40", CMD_TYPE.BP40); + cmdMap.put("AP68", CMD_TYPE.AP68); + cmdMap.put("BP68", CMD_TYPE.BP68); + cmdMap.put("APXL", CMD_TYPE.APXL); + cmdMap.put("BPXL", CMD_TYPE.BPXL); + cmdMap.put("APXY", CMD_TYPE.APXY); + cmdMap.put("BPXY", CMD_TYPE.BPXY); + cmdMap.put("APJZ", CMD_TYPE.APJZ); + cmdMap.put("BPJZ", CMD_TYPE.BPJZ); + cmdMap.put("AP84", CMD_TYPE.AP84); + cmdMap.put("BP84", CMD_TYPE.BP84); + cmdMap.put("AP85", CMD_TYPE.AP85); + cmdMap.put("BP85", CMD_TYPE.BP85); + cmdMap.put("AP86", CMD_TYPE.AP86); + cmdMap.put("BP86", CMD_TYPE.BP86); + cmdMap.put("AP88", CMD_TYPE.AP88); + cmdMap.put("BP88", CMD_TYPE.BP88); + cmdMap.put("AP89", CMD_TYPE.AP89); + cmdMap.put("BP89", CMD_TYPE.BP89); + cmdMap.put("APTE", CMD_TYPE.APTE); + cmdMap.put("BPTE", CMD_TYPE.BPTE); + cmdMap.put("APTP", CMD_TYPE.APTP); + cmdMap.put("BPTP", CMD_TYPE.BPTP); + cmdMap.put("APX1", CMD_TYPE.APX1); + cmdMap.put("BPX1", CMD_TYPE.BPX1); + cmdMap.put("APS4", CMD_TYPE.APS4); + cmdMap.put("BPS4", CMD_TYPE.BPS4); + cmdMap.put("APHP", CMD_TYPE.APHP); + cmdMap.put("BPHP", CMD_TYPE.BPHP); + cmdMap.put("BPTF", CMD_TYPE.BPTF); + cmdMap.put("APTF", CMD_TYPE.APTF); + cmdMap.put("BPSQ", CMD_TYPE.BPSQ); + cmdMap.put("APSQ", CMD_TYPE.APSQ); + cmdMap.put("BPMC", CMD_TYPE.BPMC); + cmdMap.put("APMC", CMD_TYPE.APMC); + cmdMap.put("BPPH", CMD_TYPE.BPPH); + cmdMap.put("APPH", CMD_TYPE.APPH); + cmdMap.put("APJK", CMD_TYPE.APJK); + cmdMap.put("BPJK", CMD_TYPE.BPJK); + cmdMap.put("BPSM", CMD_TYPE.BPSM); + cmdMap.put("APSM", CMD_TYPE.APSM); + cmdMap.put("BPTQ", CMD_TYPE.BPTQ); + cmdMap.put("APTQ", CMD_TYPE.APTQ); + cmdMap.put("AP75", CMD_TYPE.AP75); + cmdMap.put("BP75", CMD_TYPE.BP75); + cmdMap.put("BP46", CMD_TYPE.BP46); + cmdMap.put("AP46", CMD_TYPE.AP46); + cmdMap.put("BP42", CMD_TYPE.BP42); + cmdMap.put("AP42", CMD_TYPE.AP42); + cmdMap.put("APH1", CMD_TYPE.APH1); + cmdMap.put("BPH1", CMD_TYPE.BPH1); + cmdMap.put("BPOX", CMD_TYPE.BPOX); + cmdMap.put("APOX", CMD_TYPE.APOX); + } @@ -217,7 +467,11 @@ public class protocol_beehome { public protocol_beehome(Connection connect, Runtime runtime) { mConnection = connect; mRuntime = runtime; - + if (mHandler == null) { + HandlerThread handlerThread = new HandlerThread("ic:protocol_s123-handler-thread"); + handlerThread.start(); + mHandler = new Handler(handlerThread.getLooper()); + } } private StringBuffer cmdbuf = new StringBuffer(); @@ -239,10 +493,10 @@ public class protocol_beehome { return ""; } - for (CMD_TYPE key : cmdMap.keySet()) { - if (msg.startsWith(CMDHEADER + cmdMap.get(key))) { - ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key)); - return cmdMap.get(key); + for (CMD_TYPE key : cmdStrMap.keySet()) { + if (msg.startsWith(CMDHEADER + cmdStrMap.get(key))) { + ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdStrMap.get(key)); + return cmdStrMap.get(key); } } @@ -258,14 +512,14 @@ public class protocol_beehome { } - /**/ public static StringMessage genStringMessage(String cmdName, String msg) { + ICLogger.d("msg ==> " + msg); //设置cmdName,在这里配置进去的msg没有实际用到 StringMessage sm = new StringMessage(new String[]{cmdName, msg}); //用此函数设置要发送的内容 sm.refresh(msg); //设置信息创建时间 - sm.setDate(TimeUtil.getSystemDateYYMMDD(), TimeUtil.getSystemTimeHHmmss()); + sm.setDate(TimeUtil.getUTCSystemDateYYMMDD(), TimeUtil.getUTCSystemTimeHHmmss()); return sm; } @@ -280,10 +534,10 @@ public class protocol_beehome { boolean ret = true; String last_inCompletecmd = ""; String cmd_msgbuf = new String(bytes); - log("bytes.size " + bytes.length); + ICLogger.d("bytes.size " + bytes.length); // cmdbuf.append(cmd_msgbuf); cmdbuf.append(cmd_msgbuf); - log("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); + ICLogger.d("cmdbuf.size " + cmdbuf.length() + " " + cmdbuf.toString()); /* 如果不是 #结尾,就认为 接收数据不全,置位。 */ @@ -292,29 +546,35 @@ public class protocol_beehome { } String[] cmdlist = cmd_msgbuf.split(CMDEND); int listlen = cmdlist.length; - log("listlen " + listlen); + ICLogger.d("listlen " + listlen); /* 如果解析出来的cmdlist不是空,且数据不是完整cmd则保留 最后一条数据到last_inCompletecmd */ if (cmdlist.length > 0 && iscmdComplete == false) { listlen -= 1; last_inCompletecmd = cmdlist[listlen]; - log("cmd not complete , " + last_inCompletecmd); + ICLogger.d("cmd not complete , " + last_inCompletecmd); } for (int i = 0; i < listlen; i++) { - for (CMD_TYPE key : cmdMap.keySet()) { - if (cmdlist[i].startsWith(CMDHEADER + cmdMap.get(key))) { - log("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdlist[i]); - if (key == CMD_TYPE.BP28) { - //如果是BP28则 后面的数据是音频,需要保留 - byte[] amrBuf; - int amrLen = getBP28Amrlen(cmdlist[i]); - if (bytes.length > amrLen) { - handleCmd(key, cmdlist[i], bytes); - } - } else { - handleCmd(key, cmdlist[i]); + String cmdItem = cmdlist[i]; + if (cmdItem.startsWith(CMDHEADER)) { + //获取到指令 + String cmdStr = cmdItem.substring(2, 6); + ICLogger.d("cmdStr ==> " + cmdStr); + CMD_TYPE key = cmdMap.get(cmdStr); + if (key == null) { + ICLogger.d("不支持该指令==> " + cmdlist[i]); + return false; + } + ICLogger.d("found cmd keyid=" + key + " ,keyname=" + cmdStrMap.get(key) + " , " + cmdlist[i]); + if (key == CMD_TYPE.BP28) { + //如果是BP28则 后面的数据是音频,需要保留 + int amrLen = getBP28Amrlen(cmdlist[i]); + if (bytes.length > amrLen) { + handleCmd(key, cmdlist[i], bytes); } + } else { + handleCmd(key, cmdlist[i]); } } } @@ -323,6 +583,43 @@ public class protocol_beehome { return ret; } + + public void handleBP42(String cmd, Connection connection) { + /*** + * 平台响应 + * IWBP42,20140818064408,6,1,1# + * IW:标识符 + * BP42 : 命令字符 + * 20220217174924:语音图片文字目标 + * 11:内容总包数 + * 1:当前包序号 + */ + String[] cmdlist = cmd.split(CMDSPLIT); + if (cmdlist.length == 5) { + try { + String time = cmdlist[1]; + String count = cmdlist[2]; + String index = cmdlist[3]; + String success = cmdlist[4]; + int packetCount = Integer.parseInt(count); + int packetIndex = Integer.parseInt(index); + ICLogger.d("是否成功===>" + success); + ICLogger.i("服务器在收到 index " + time + " " + packetIndex + "/" + packetCount); + //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送 + if ("1".equals(success)) { + voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); + //voicePacket.getInstanceSent().setFileType(ftype,dtype); + } + //发送消息,再次检查要发送的语音包,确认其发送完毕 + connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentBPFilePacket"); + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); + } + } else { + ICLogger.i(" BPTU Format error!"); + } + } + public int getBP28Amrlen(String cmd) { String Name; @@ -348,8 +645,6 @@ public class protocol_beehome { .append(",packetCount = ").append(packetCount) .append(",currentId = ").append(currentId) .append(",packetLen = ").append(packetLen); - - log(stringBuffer.toString()); return packetLen; } catch (Exception e) { @@ -365,33 +660,42 @@ public class protocol_beehome { /*登录*/ public static StringMessage AP00(Runtime ds) { //示例数据:IWAP00867155030001063# - return genStringMessage(cmdMap.get(CMD_TYPE.AP00), - new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP00)) - .append(ds.IMEI()) - .append(CMDEND).toString()); +// IWAP00860315002003375,12345678901234567890,9466970701492096# 三个参数分别是IMEI,ICCID,IMSI + CellInfoUtil.getPhoneStatus(ds);//获取IMSI,ICCID + StringBuffer cmdbuf = new StringBuffer(CMDHEADER); + cmdbuf.append(cmdStrMap.get(CMD_TYPE.AP00)).append(ds.IMEI()) + .append(CMDSPLIT).append(ds.getIccid()) + .append(CMDSPLIT).append(ds.getImsi()) + .append(CMDEND); + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP00), cmdbuf.toString()); } //处理 登录 BP00 public void handleBP00(Runtime runtime, String cmd) { String[] msg = cmd.split(CMDSPLIT); -// get Msg :IWBP00,20191229171933,8# (size)24 -// 12-30 01:19:33.861 6492-6492/com.ic.protocolSrv I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8 - + //get Msg :IWBP00,20191229171933,8# (size)24 + //12-30 01:19:33.861 6492-6492/com.ic.protocolSrv + //I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8 if (msg.length >= 3) { log("handleBP00", "Set Datetime " + msg[1]); log("handleBP00", "Set TimeZone " + msg[2]); try { - Date datetime = TimeUtil.parseDatetiime(msg[1]); int timezone = Integer.parseInt(msg[2]); + String timezone_name = ""; + if (timezone > 0) { + timezone_name = String.format("GMT+%1$02d:00", Math.abs(timezone)); + + } else { + timezone_name = String.format("GMT-%1$02d:00", Math.abs(timezone)); + } + Date datetime = TimeUtil.parseDatetiime(msg[1], TimeZone.getTimeZone(timezone_name)); if (datetime != null) { ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - TimeUtil.setTimeZone(runtime.getContextProxy().context, timezone); - + //TimeUtil.setTimeZone(runtime.getContextProxy().context, timezone); ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); TimeUtil.setSysDateTime(runtime.getContextProxy().context, datetime, timezone, true); ICLogger.i("===" + TimeUtil.getDefaultTimeZone()); - } // Set Datetime 20200505112734 // Set TimeZone 8 @@ -403,6 +707,37 @@ public class protocol_beehome { } } + /** + * 发送语音数据 + * + * @param duration + * @param remoteNum + * @param content + * @param voiceId + */ + public void sendVoice(int duration, String remoteNum, String content, String voiceId) { + // IWAP07,353456789012345,080835,20140818064408 ,135xxx,0,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# + File file = new File(content); + if (!file.exists()) { + ICLogger.d("语音文件不存在."); + return; + } + if (remoteNum == null || remoteNum.isEmpty()) { + remoteNum = "0"; + } + ICLogger.d("remoteNum =====> " + remoteNum); + //这个分类目前用不了,用号码就是单聊,没号码就是群聊 + final VoiceContent voiceContent = + VoiceContent.placeHolderOut(1, remoteNum, String.format("%04X", duration), content, 1, 3); + // 把voiceContent拆解成1024的分包 + Util.parseToVoicePacketSent(voiceContent, 1024); + //trigger 分包发送 + if (CoreService.getInstance().getConnection() != null) { + CoreService.getInstance().getConnection() + .DeliverCMDMessageToSystem("SentVoicePacket", ""); + } + } + public static StringMessage AP03(Runtime ds) { //示例数据:IWAP03,06000908000102,5555,30# IWAP03,000000null00000,0,0# @@ -420,10 +755,16 @@ public class protocol_beehome { //02为工作模式 ,(设防,工作模式如果为00,则代表无或未设置) //5555: 计步步数,每次到达 9999 后重 0 开始计 (此处 9999 为示例,可以为2字节int 然后溢出归零) //30: 翻滚次数 - return genStringMessage(cmdMap.get(CMD_TYPE.AP03), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d", abs(ds.getSignalStrength()))) + //定位模式 + //定位周期cycle 单位秒 + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP03), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP03)).append(CMDSPLIT).append(String.format("%03d", abs(ds.getSignalStrength()))) .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) - .append(ds.getTotalStepCount()).append(CMDSPLIT).append(ds.getRolltimes()).append(CMDEND).toString()); + .append(ds.getTotalStepCount()).append(CMDSPLIT) + .append(ds.getRolltimes()).append(CMDSPLIT) + .append(ds.getLocationInstance().getWorkingMod()).append(CMDSPLIT) + .append(ds.getLocationInstance().getLocation_cycle()) + .append(CMDEND).toString()); } //处理 心跳 BP03 @@ -445,8 +786,8 @@ public class protocol_beehome { * 00:第一个0:是否需要回复地址信息,0:不回复,1回复. * HOME|74-DE-2B-44-88-8C|97&HOME1|74-DE-2B-44-88-8C|97&HOME2|74-DE-2B-44-88-8C|97&HOME3|74-DE-2B-44-88-8C|97# */ - return genStringMessage(cmdMap.get(CMD_TYPE.AP10), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP10)).append(TimeUtil.getShortDate()) - .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP10), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP10)).append(TimeUtil.getUTCSystemDateYYMMDD()) + .append(ds.getGPSData()).append(TimeUtil.getUTCSystemTimeHHmmss()).append(ds.getGPSHeading()) .append(String.format("%03d", abs(ds.getSignalStrength()))) .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) @@ -464,11 +805,13 @@ public class protocol_beehome { // 460,0,9520,3671, // Home|74-DE-2B-44-88-8C|97& Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97& Home3|74-DE-2B-44-88-8C|97# // IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,# - return genStringMessage(cmdMap.get(CMD_TYPE.AP01), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01)).append(TimeUtil.getShortDate()) - .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d", abs(ds.getSignalStrength()))) - .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") - .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) - .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP01), + new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP01)).append(TimeUtil.getUTCSystemDateYYMMDD()) + .append(ds.getGPSData()) + .append(TimeUtil.getUTCSystemTimeHHmmss()).append(ds.getGPSHeading()).append(String.format("%03d", abs(ds.getSignalStrength()))) + .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0") + .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT) + .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString()); } //处理 定位 BP01 @@ -506,7 +849,7 @@ public class protocol_beehome { } ICLogger.i("Wifi ap sum " + apsum); - return genStringMessage(cmdMap.get(CMD_TYPE.AP02), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP02), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP02)).append(CMDSPLIT) .append(ds.getLanguage()).append(CMDSPLIT) .append(0).append(CMDSPLIT) //为0时不回复地址 .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据 @@ -522,11 +865,10 @@ public class protocol_beehome { public static StringMessage APXL(String id) { //设备响应: IWAPXL,080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.APXL), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXL)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APXL), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APXL)) .append(CMDSPLIT).append(id) .append(CMDEND).toString()); } - /** * 测量心率 * @@ -554,10 +896,42 @@ public class protocol_beehome { } + + public static StringMessage APOX(String id,String cmdname) { +//设备响应: IWAPOX,080835,1# + //080835:指令流水号 + return genStringMessage(cmdStrMap.get(CMD_TYPE.APOX), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APOX)) + .append(CMDSPLIT).append(id) + .append(CMDSPLIT).append(cmdname) + .append(CMDEND).toString()); + } + /** + * 测量血氧 + * + * @param cmd + * @param connection + */ + public void handleBPOX(String cmd, Connection connection) { + //IWBPOX,353456789012345,080835,1# + //IWBPOX,IMEI,流水号,1# + + String[] list = cmd.split(CMDSPLIT); + if (list.length == 4) { + String index = list[2]; + String imei = list[1]; + String cmdname = list[3]; + ICLogger.i("Handle BPOX IMEI " + imei + ",index " + index +",cmdname "+cmdname); + connection.send(APOX(index,cmdname)); + } else { + ICLogger.i("BPOX format error!"); + } + + } + public static StringMessage APXY(String id) { //设备响应: IWAPXY,080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.APXY), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APXY)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APXY), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APXY)) .append(CMDSPLIT).append(id) .append(CMDEND).toString()); } @@ -594,7 +968,7 @@ public class protocol_beehome { //设备响应: IWAPJZ,792997,120,85,42,1# //792997:指令流水号 // 高压120,低压85,年龄42,1 男性 - return genStringMessage(cmdMap.get(CMD_TYPE.APJZ), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APJZ)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APJZ), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APJZ)) .append(CMDSPLIT).append(id) .append(CMDSPLIT).append(BPH) .append(CMDSPLIT).append(BPL) @@ -647,7 +1021,7 @@ public class protocol_beehome { public static StringMessage AP18(String index) { - return genStringMessage(cmdMap.get(CMD_TYPE.AP18), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP18)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP18), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP18)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } @@ -665,7 +1039,7 @@ public class protocol_beehome { //恢复出厂设置 public static StringMessage AP17(String index) { - return genStringMessage(cmdMap.get(CMD_TYPE.AP17), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP17)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP17), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP17)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } @@ -675,35 +1049,50 @@ public class protocol_beehome { // IWBP17,867155030001063,161723 String[] cmdlist = cmd.split(CMDSPLIT); if (cmdlist.length == 3) { - connection.send(AP17(cmdlist[2])); - } } - //关机 - + /** + * 1.   请求天气(上行协议号:APTQ,响应:BPTQ)(不支持国外) + * 示例: + * IWAPTQ,460,0,9520,3671,0# + * 说明: + * IW:标识符APTQ : 命令字符460,0,9520,3671基站信息0:语言标志位   0 默认为中文,1为英文 + * + * @param runtime + * @return + */ + public static StringMessage APTQ(Runtime runtime) { + //IWAPTQ,460,0,9520,3671,0# + return genStringMessage(cmdStrMap.get(CMD_TYPE.APTQ), + new StringBuffer(CMDHEADER) + .append(cmdStrMap.get(CMD_TYPE.APTQ)) + .append(CMDSPLIT) + .append(runtime.getLBSMultiStationData()) + .append(CMDSPLIT) + .append("0")//中文 + .toString()); + } + //关机 public static StringMessage AP31(String index) { - return genStringMessage(cmdMap.get(CMD_TYPE.AP31), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP31)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP31), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP31)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } public void handleBP31(Connection connection, String cmd) { - - // IWBP31,867155030001063,161723 + //IWBP31,867155030001063,161723 String[] cmdlist = cmd.split(CMDSPLIT); if (cmdlist.length == 3) { - connection.send(AP31(cmdlist[2])); - } } //设置SOS号码 public static StringMessage AP12(String index, String phNum1, String phNum2, String phNum3) { - return genStringMessage(cmdMap.get(CMD_TYPE.AP12), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP12)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP12), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP12)) .append(CMDSPLIT).append(index) .append(CMDSPLIT).append(phNum1) .append(CMDSPLIT).append(phNum2) @@ -714,25 +1103,40 @@ public class protocol_beehome { //设置SOS号码 public void handleBP12(Connection connection, String cmd, Runtime runtime) { // IWBP12,353456789012345,080835,135XXXXXXXX,135XXXXXXXX,135XXXXXXXX# - String[] cmdlist = cmd.split(CMDSPLIT); - if (cmdlist.length >= 3) { - String index = cmdlist[2]; - String phNum1 = cmdlist.length == 3 ? "" : cmdlist[3]; - String phNum2 = cmdlist.length > 3 ? (cmdlist.length == 4 ? "" : cmdlist[4]) : ""; - String phNum3 = (cmdlist.length > 4) ? (cmdlist.length == 5 ? "" : cmdlist[5]) : ""; + String[] cmdList = cmd.split(CMDSPLIT); + if (cmdList.length >= 3) { + String index = cmdList[2]; + String phNum1 = cmdList.length == 3 ? "" : cmdList[3]; + String phNum2 = cmdList.length > 3 ? (cmdList.length == 4 ? "" : cmdList[4]) : ""; + String phNum3 = (cmdList.length > 4) ? (cmdList.length == 5 ? "" : cmdList[5]) : ""; ICLogger.i(new StringBuffer().append("get Emegency Numbs " + phNum1 + "," + phNum2 + "," + phNum3).toString()); connection.send(AP12(index, phNum1, phNum2, phNum3)); - - ArrayList contactArray = new ArrayList(); - if (!phNum1.isEmpty()) + runtime.getContextProxy() + .getResolver().delete(Uri.parse(ICMembersProvider.MEMBERS), + ICDatabaseHelper.fType + "=?", new String[]{String.valueOf(ICDatabaseHelper.MemberType.SOS)}); + ArrayList contactArray = new ArrayList<>(); + if (!phNum1.isEmpty()) { contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", phNum1)); - if (!phNum2.isEmpty()) + } + if (!phNum2.isEmpty()) { contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos2", phNum2)); - if (!phNum3.isEmpty()) + } + if (!phNum3.isEmpty()) { contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos3", phNum3)); - + } + //保存到IC的数据库上 + for (int i = 0; i < contactArray.size(); i++) { + //数据入库 + Contact contact = contactArray.get(i); + ContentValues item = new ContentValues(); + item.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.SOS); + item.put(ICDatabaseHelper.fUserName, contact.name); + item.put(ICDatabaseHelper.fPhoneNum, contact.number); + runtime.getContextProxy() + .getResolver() + .insert(Uri.parse(ICMembersProvider.MEMBERS), item); + } runtime.getDbHelper().saveContacts(contactArray, false, false, false, false, false, true); - } else { ICLogger.i(" BP12 format error!"); } @@ -740,37 +1144,38 @@ public class protocol_beehome { public static StringMessage AP14(String index, String[] phnumbs) { - return genStringMessage(cmdMap.get(CMD_TYPE.AP14), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP14)) - .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(phnumbs[0]) - .append(CMDSPLIT).append(phnumbs[1]) - .append(CMDSPLIT).append(phnumbs[2]) - .append(CMDSPLIT).append(phnumbs[3]) - .append(CMDSPLIT).append(phnumbs[4]) - .append(CMDSPLIT).append(phnumbs[5]) - .append(CMDSPLIT).append(phnumbs[6]) - .append(CMDSPLIT).append(phnumbs[7]) - .append(CMDSPLIT).append(phnumbs[8]) - .append(CMDSPLIT).append(phnumbs[9]) - .append(CMDEND).toString()); + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP14), + new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP14)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(phnumbs[0]) + .append(CMDSPLIT).append(phnumbs[1]) + .append(CMDSPLIT).append(phnumbs[2]) + .append(CMDSPLIT).append(phnumbs[3]) + .append(CMDSPLIT).append(phnumbs[4]) + .append(CMDSPLIT).append(phnumbs[5]) + .append(CMDSPLIT).append(phnumbs[6]) + .append(CMDSPLIT).append(phnumbs[7]) + .append(CMDSPLIT).append(phnumbs[8]) + .append(CMDSPLIT).append(phnumbs[9]) + .append(CMDEND).toString()); } //设置通讯录,白名单(10个) public void handleBP14(Connection connection, String cmd, Runtime runtime) { -// IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, -/** - * IWBP14,353456789012345,080835, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx, - * D3590D54|135xxxxxxxxxx# - */ + //IWBP14,867155030001063,357444,9b44529b|13554820016,,,,,,,,, + /** + * IWBP14,353456789012345,080835, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx, + * D3590D54|135xxxxxxxxxx# + */ String[] cmdlist = cmd.split(CMDSPLIT); String[] phnums = new String[]{"", "", "", "", "", "", "", "", "", ""}; StringBuffer sb = new StringBuffer().append("recv phone Numbs "); @@ -817,31 +1222,33 @@ public class protocol_beehome { String[] tmp = phnums[i].split("\\|"); if (tmp.length == 2) { String name = Util.decodeUnicode2Utf8(tmp[0]); - String phonem = tmp[1]; - ICLogger.i("phnums[" + i + "]=" + phnums[i] + ",split = " + tmp.length + " , name=" + name + ",-" + phonem); - contactArray.add(new Contact(Contact.CATEGORY_CALL, name, phonem)); + String phoneNum = tmp[1]; + //保存到数据库中 + ICLogger.i(i / 2 + " 姓名 " + name + ", 电话 " + phoneNum); + contactArray.add(new Contact(Contact.CATEGORY_CALL, name, phoneNum)); + ContentValues contentValues = new ContentValues(); + contentValues.put(ICDatabaseHelper.fType, ICDatabaseHelper.MemberType.WHITE_LIST); + contentValues.put(ICDatabaseHelper.fPhoneNum, phoneNum); + contentValues.put(ICDatabaseHelper.fID, phoneNum); + contentValues.put(ICDatabaseHelper.fUserName, name); + contentValues.put(ICDatabaseHelper.fCreateTime, System.currentTimeMillis()); + contentValues.put(ICDatabaseHelper.fUpdateTime, System.currentTimeMillis()); + //保存联系人列表,类型为白名单 + runtime.getContextProxy().getResolver().insert(Uri.parse(ICMembersProvider.MEMBERS), contentValues); } else { - ICLogger.i("phnums[" + i + "]=" + phnums[i] + ",split = " + tmp.length); - + ICLogger.i("phoneNumber[" + i + "]=" + phnums[i] + ",split = " + tmp.length); } } -// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666")); -// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666")); -// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666")); -// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666")); - - runtime.getDbHelper().saveContacts(contactArray, false, false, true, false, false, false); - + runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false); } else { ICLogger.i(" BP14 format error!"); } - } public static StringMessage AP85(Runtime ds, String cmddata) { //示例数据:IWAP49,68## - return genStringMessage(cmdMap.get(CMD_TYPE.AP85), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP85)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP85), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP85)) .append(CMDSPLIT).append(cmddata) .append(CMDEND).toString()); @@ -849,20 +1256,20 @@ public class protocol_beehome { //设置闹钟 public void handleBP85(String cmd, Connection connection, Runtime runtime) { -// IWBP85,867155030001063,155312,1,1,0235,12,1,1 -// IWBP85,867155030002145,945166,1,0, -// IWBP85,867155030001064,265960,1,1,1130,,1,1 -// IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# -//353456789012345:IMEI号,设备唯一ID -//080835 :指令流水号 -//1: 表示闹钟总开关,1为开,0 为关 -//3: 表示闹钟个数 -//0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 -//1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 -//1表示吃药提醒 -//2 表示喝水提醒 -//3 表示久坐提醒 -//多组闹钟之间用”@”符号分隔 + // IWBP85,867155030001063,155312,1,1,0235,12,1,1 + // IWBP85,867155030002145,945166,1,0, + // IWBP85,867155030001064,265960,1,1,1130,,1,1 + // IWBP85,353456789012345,080835,1,3, 0900,135,1,1@0900 ,135,1,2@0900 ,135,1,3# + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //1: 表示闹钟总开关,1为开,0 为关 + //3: 表示闹钟个数 + //0900 ,135,1,1,表示一组闹钟,0900表示早上09:00, 135表示周一周三周五,使用24小时制 + //1表示该组闹钟开启或关闭状态 1表示开启 0表示关闭 + //1表示吃药提醒 + //2 表示喝水提醒 + //3 表示久坐提醒 + //多组闹钟之间用”@”符号分隔 String imei = "", cmdindex = "0"/*指令流水号*/; int all_alarmswitch = 0 /*总开关 1为开,0 为关*/, @@ -924,7 +1331,7 @@ public class protocol_beehome { .append(", alarmtype=").append(alarmtype) .toString() ); - + //TODO: alarmlist.add(new Alarm("ST" + alarmtime.substring(0, 2) + "." + alarmtime.substring(2), "W" + repeat, "CON", alarmswitch == 1 ? "ON" : "OFF", "闹铃")); } else { @@ -933,15 +1340,11 @@ public class protocol_beehome { } }//循环获取alarm数据结束 - runtime.getDbHelper().saveAlarm(alarmlist); - - //do clean and set alarm things } catch (Exception e) { ICLogger.e(e.getMessage(), e); } } -//IWBP85,867155030002145,410385,1,0,# - + //IWBP85,867155030002145,410385,1,0,# String replacement = new StringBuilder("IWBP85,").append(imei).append(",").toString(); String replycmd = cmd.replace(replacement, ""); ICLogger.i("gen reply " + replacement + " " + replycmd); @@ -949,93 +1352,90 @@ public class protocol_beehome { } -// AP05命令L02服务器不适用 -// public static String AP05(boolean recvFlag){ -// -//// IWAP05,1# -// return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP05)) -// .append(CMDSPLIT).append(recvFlag?1:0) -// .append(CMDEND).toString(); -// -// } -// -// -// public void handleBP05(String cmd){ -//// IWBP05,6# -// String[] cmdlist=cmd.split(CMDSPLIT); -// if (cmdlist.length>1){ -// ICLogger.i(" 服务器有 " +cmdlist[1]+" 条语音未接收!"); -// } -// } - - - public static byte[] AP07(String packetTime, int count, int index, int datalen, byte[] amrdata) { -//IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# -//说明: -//IW:标识符 -//AP07 : 命令字符 -//20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间 -//6:语音包分包总数 -//1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 -//1024 :语音包长度 -//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 -//语音包上传规则: -//按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 -//收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 -//如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 - - - String sb = new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP07)) + // AP05命令L02服务器不适用 + public static String AP05(boolean recFlat) { + return new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP05)) + .append(CMDSPLIT).append(recFlat ? 1 : 0) + .append(CMDEND).toString(); + } + + public void handleBP05(String cmd) { + String[] cmdList = cmd.split(CMDSPLIT); + if (cmdList.length > 1) { + ICLogger.i(" 服务器有 " + cmdList[1] + " 条语音未接收!"); + } + } + + + public static byte[] AP07(String packetTime, int count, int index, int dataLen, byte[] amrData) { + //IWAP07,20140818064408,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# + //说明: + //IW:标识符 + //AP07 : 命令字符 + //20140818064408 :yyyyMMddHHmmss 格式的年月日时分秒,设备录音时间 + //6:语音包分包总数 + //1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 + //1024 :语音包长度 + //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 + //语音包上传规则: + //按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 + //收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 + //如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 + String sb = new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP07)) .append(CMDSPLIT).append(packetTime) .append(CMDSPLIT).append(count) .append(CMDSPLIT).append(index) - .append(CMDSPLIT).append(datalen) + .append(CMDSPLIT).append(dataLen) .append(CMDSPLIT).toString(); - byte[] sentbuf = new byte[sb.length() + datalen + 1]; - System.arraycopy(sb.getBytes(), 0, sentbuf, 0, sb.length()); - System.arraycopy(amrdata, 0, sentbuf, sb.length(), datalen); - sentbuf[sb.length() + datalen] = '#'; + byte[] sentBuf = new byte[sb.length() + dataLen + 1]; + System.arraycopy(sb.getBytes(), 0, sentBuf, 0, sb.length()); + System.arraycopy(amrData, 0, sentBuf, sb.length(), dataLen); + sentBuf[sb.length() + dataLen] = '#'; - return sentbuf; + return sentBuf; } - - public void handleBP07(String cmd, Connection connection) { -//平台响应: IWBP07,20140818064408,6,1,1# -//20140818064408:设备语音时间,yyyyMMddHHmmss 格式的年月日时分秒 -//6:语音包分包总数 -//1:当前设备收到的是第几个包 -//1:表示服务器接受数据成功,0表示服务器接受数据失败 - String[] cmdlist = cmd.split(CMDSPLIT); - if (cmdlist.length == 5) { + //IWBP07,20211222103621,6,1,1# + public void handleBP07(String cmd) { + //TODO:判断是否要进行下一个包发送 + String[] split = cmd.split(CMDSPLIT); + if (split.length == 5) { try { - String time = cmdlist[1]; - int packetCount = Integer.parseInt(cmdlist[2]); - int packetIndex = Integer.parseInt(cmdlist[3]); - int receiveSuccess = Integer.parseInt(cmdlist[4]); - ICLogger.i("服务器在" + time + " 收到语音 " + packetIndex + "/" + packetCount + " " + (receiveSuccess == 1 ? "成功" : "失敗")); - if (receiveSuccess == 1) { - //如果服务器接收 语音成功,则设置下一个要发送的语音包Index,当index == packetCount的时候表示所有包发送完毕,停止继续发送 + String totalPackageCount = split[2]; + ICLogger.d("totalPackageCount ==> " + totalPackageCount); + String currentPackage = split[3]; + ICLogger.d("currentPackage ==> " + currentPackage); + String isSuccessStr = split[4]; + ICLogger.d("是否接收成功:" + isSuccessStr); + if ("1".equals(isSuccessStr) && !currentPackage.equals(totalPackageCount)) { + int packetIndex = Integer.parseInt(currentPackage); + //发送下一包 voicePacket.getInstanceSent().setCurrentIndexToSent(packetIndex); } - //发送消息,再次检查要发送的语音包,确认其发送完毕 - connection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket"); + + //如果不成功则重发 + if (!currentPackage.equals(totalPackageCount)) { + ICLogger.d("发送下一包数据..." + currentPackage); + mConnection.DeliverCMDMessageToSystem("SentVoicePacket", "SentVoicePacket"); + } } catch (Exception e) { - ICLogger.e(e.getMessage(), e); + e.printStackTrace(); } } else { - ICLogger.i(" BP07 Format error!"); + ICLogger.d("parse BP07 error."); } + //平台收到语音数据 + ICLogger.d("平台收到语音数据" + cmd); } public static StringMessage AP33(String cmdindex, int workMode) { -//IWAP33,080835,1# -//080835:指令流水号 -//1:设置信息,供服务器同步 - return genStringMessage(cmdMap.get(CMD_TYPE.AP33), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP33)) + //IWAP33,080835,1# + //080835:指令流水号 + //1:设置信息,供服务器同步 + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP33), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP33)) .append(CMDSPLIT).append(cmdindex) .append(CMDSPLIT).append(workMode) .append(CMDEND).toString()); @@ -1044,18 +1444,18 @@ public class protocol_beehome { //设置工作模式 public void handleBP33(Connection connection, Runtime runtime, String cmd) { -// IWBP33,867155030001063,560555,1 -// IW:标识符 -// BP33 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835:指令流水号 -// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 + //IWBP33,867155030001063,560555,1 + //IW:标识符 + //BP33 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835:指令流水号 + //1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 - String[] cmdlist = cmd.split(","); - if (cmdlist.length == 4) { - log("com.ic.work mode " + cmdlist[3]); + String[] cmdList = cmd.split(","); + if (cmdList.length == 4) { + log("com.ic.work mode " + cmdList[3]); try { - int mod = Integer.parseInt(cmdlist[3]); + int mod = Integer.parseInt(cmdList[3]); int Cycle = 900; switch (mod) { case ICLocation.NORMAL_MOD: @@ -1068,10 +1468,8 @@ public class protocol_beehome { case ICLocation.REALTIME_MOD: Cycle = 60; break; - } - - StringMessage msg = AP33(cmdlist[2], mod); + StringMessage msg = AP33(cmdList[2], mod); //设定当前工作模式及循环频率 connection.send(msg); log("reply msg " + msg); @@ -1080,7 +1478,7 @@ public class protocol_beehome { Config.setLocationCycle(runtime.getContextProxy().context, Cycle); runtime.getLocationInstance().setLocation_cycle(Cycle); runtime.getLocationInstance().setWorkingMod(mod); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 } catch (Exception e) { ICLogger.e(e.getMessage(), e); @@ -1091,10 +1489,10 @@ public class protocol_beehome { public static StringMessage AP34(String cmdindex, int workMode) { -//IWAP34,588854,1# -//080835:指令流水号 -//8:模式 - return genStringMessage(cmdMap.get(CMD_TYPE.AP34), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP34)) + //IWAP34,588854,1# + //080835:指令流水号 + //8:模式 + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP34), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP34)) .append(CMDSPLIT).append(cmdindex) .append(CMDSPLIT).append(workMode) .append(CMDEND).toString()); @@ -1103,24 +1501,22 @@ public class protocol_beehome { //设置自定义工作模式 public void handleBP34(Connection connection, Runtime runtime, String cmd) { -// IWBP34,867155030001063,588854,8,900,1# -// IW:标识符 -// BP33 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835:指令流水号 -// 1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 - - String[] cmdlist = cmd.split(","); - if (cmdlist.length == 6) { - + //IWBP34,867155030001063,588854,8,900,1# + //IW:标识符 + //BP33 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835:指令流水号 + //1:设备工作模式,1:正常模式,2:省电模式,3:紧急模式 - log("com.ic.work mode " + cmdlist[3]); + String[] cmdList = cmd.split(","); + if (cmdList.length == 6) { + log("com.ic.work mode " + cmdList[3]); try { - int mod = Integer.parseInt(cmdlist[3]); - int Cycle = Integer.parseInt(cmdlist[4]); - int gpson = Integer.parseInt(cmdlist[5]); + int mod = Integer.parseInt(cmdList[3]); + int Cycle = Integer.parseInt(cmdList[4]); + int gpson = Integer.parseInt(cmdList[5]); - StringMessage msg = AP34(cmdlist[2], mod); + StringMessage msg = AP34(cmdList[2], mod); //设定当前工作模式及循环频率 connection.send(msg); @@ -1135,7 +1531,7 @@ public class protocol_beehome { Config.setLocationCycle(runtime.getContextProxy().context, Cycle); runtime.getLocationInstance().setLocation_cycle(Cycle); runtime.getLocationInstance().setWorkingMod(mod); -// CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); + //CoreService.getInstance().setLocationAlarm(runtime.getLocationInstance().getWorkingMod()); //此处设置好配置后,会在LocationClient通过消息开始执行及时定位操作。 } catch (Exception e) { ICLogger.e(e.getMessage(), e); @@ -1146,26 +1542,24 @@ public class protocol_beehome { public void handleBP40(Connection connection, Runtime runtime, String cmd) { -// IWBP40,353456789012345,080835,XXXXXXXXXXXXXX# -// IW:标识符 -// BP40 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835 :指令流水号 -// XXXXXXXXXXXX : 表示文字内容GB2312编码 - - - String[] cmdlist = cmd.split(","); - if (cmdlist.length == 4) { - String cmdindex = cmdlist[2]; - String txtmsg = cmdlist[3]; - - txtmsg = Util.UrlGB2312ToUTF8(txtmsg); - StringMessage msg = AP40(cmdindex, 1); + //IWBP40,353456789012345,080835,XXXXXXXXXXXXXX# + //IW:标识符 + //BP40 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 + //XXXXXXXXXXXX : 表示文字内容GB2312编码 + + String[] cmdList = cmd.split(","); + if (cmdList.length == 4) { + String cmdIndex = cmdList[2]; + String txtMsg = cmdList[3]; + txtMsg = Util.UrlGB2312ToUTF8(txtMsg); + StringMessage msg = AP40(cmdIndex, 1); //设定当前工作模式及循环频率 connection.send(msg); - ICLogger.i("received Txt Msg " + txtmsg); - runtime.getContextProxy().sendMsgBroadcast(txtmsg, 0); - runtime.getContextProxy().saveMstToSMSDB(txtmsg); + ICLogger.i("received Txt Msg " + txtMsg); + runtime.getContextProxy().sendMsgBroadcast(txtMsg, 0); + runtime.getContextProxy().saveMstToSMSDB(txtMsg); } else { ICLogger.i("BP40 format error!"); } @@ -1176,7 +1570,7 @@ public class protocol_beehome { // IWAP40,080835,1# // 080835:指令流水号 // 1:表示设备接受数据成功,0表示设备接受数据失败 - return genStringMessage(cmdMap.get(CMD_TYPE.AP40), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP40)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP40), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP40)) .append(CMDSPLIT).append(cmdindex) .append(CMDSPLIT).append(success) .append(CMDEND).toString()); @@ -1191,7 +1585,7 @@ public class protocol_beehome { */ public static StringMessage AP49(Runtime ds) { //示例数据:IWAP49,68## - return genStringMessage(cmdMap.get(CMD_TYPE.AP49), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP49)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP49), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP49)) .append(CMDSPLIT).append(ds.getHRS().getPPG()) .append(CMDEND).toString()); @@ -1214,7 +1608,7 @@ public class protocol_beehome { //85 : 血压低压 [舒张压] //平台响应: IWBPHT# //表示平台已接收,可不作响应 - return genStringMessage(cmdMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHT)) .append(CMDSPLIT).append(ds.getHRS().getPPG()) .append(CMDSPLIT).append(ds.getHRS().getBPH()) .append(CMDSPLIT).append(ds.getHRS().getBPL()) @@ -1231,7 +1625,7 @@ public class protocol_beehome { //85 : 血压低压 [舒张压] //平台响应: IWBPHT# //表示平台已接收,可不作响应 - return genStringMessage(cmdMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHT)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APHT), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHT)) .append(CMDSPLIT).append(ppg) .append(CMDSPLIT).append(bph) .append(CMDSPLIT).append(bpl) @@ -1241,22 +1635,22 @@ public class protocol_beehome { //立即定位反馈 public static StringMessage AP16(String cmdindex) { -//IWAP16,080835# -//080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.AP16), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP16)) + //IWAP16,080835# + //080835:指令流水号 + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP16), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP16)) .append(CMDSPLIT).append(cmdindex) .append(CMDEND).toString()); } - // 立即定位指令(长链接有效) + //立即定位指令(长链接有效) public void handleBP16(Connection connection, Runtime runtime, String cmd) { //示例数据:IWBP16,867155030001063,335386 -// IWBP16,353456789012345,080835# -// 说明: -// IW:标识符 -// BP16 : 命令字符 -// 353456789012345:IMEI号,设备唯一ID -// 080835 :指令流水号 + //IWBP16,353456789012345,080835# + //说明: + //IW:标识符 + //BP16 : 命令字符 + //353456789012345:IMEI号,设备唯一ID + //080835 :指令流水号 String[] cmdlist = cmd.split(","); if (cmdlist.length == 3) { log("imei " + cmdlist[1] + ", cmdindex " + cmdlist[2]); @@ -1279,7 +1673,7 @@ public class protocol_beehome { //9750: LAC //3613: CID - return genStringMessage(cmdMap.get(CMD_TYPE.APTM), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTM)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APTM), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APTM)) .append(CMDSPLIT).append(ds.getLocationInstance().getMCC()) .append(CMDSPLIT).append(ds.getLocationInstance().getMNC()) .append(CMDSPLIT).append(ds.getLocationInstance().getLAC()) @@ -1313,7 +1707,7 @@ public class protocol_beehome { //IMEI: /// Version String - return genStringMessage(cmdMap.get(CMD_TYPE.APVR), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APVR)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APVR), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APVR)) .append(CMDSPLIT).append(ds.IMEI()) .append(CMDSPLIT).append(DeviceInfoUtil.getSWVersionDisplayName()) .append(CMDEND).toString()); @@ -1323,7 +1717,7 @@ public class protocol_beehome { public static StringMessage AP15(String index) { //IWAP15, 080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.AP15), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP15)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP15), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP15)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } @@ -1359,45 +1753,46 @@ public class protocol_beehome { } - /*语音下行反馈*/ - public static StringMessage AP28(String name, String msg, int packagecount, int currentpackageindex, int received_success) { + public static StringMessage AP28(String name, String msg, int packageCount, int currentPackageIndex, int received_success) { //示例数据:IWAP28,D3590D54,xxxx,6,1,1# - return genStringMessage(cmdMap.get(CMD_TYPE.AP28), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP28)) - .append(CMDSPLIT).append(name) - .append(CMDSPLIT).append(msg) - .append(CMDSPLIT).append(packagecount) - .append(CMDSPLIT).append(currentpackageindex) - .append(CMDSPLIT).append(received_success) - .append(CMDEND).toString()); + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP28), + new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP28)) + .append(CMDSPLIT).append(name) + .append(CMDSPLIT).append(msg) + .append(CMDSPLIT).append(packageCount) + .append(CMDSPLIT).append(currentPackageIndex) + .append(CMDSPLIT).append(received_success) + .append(CMDEND).toString()); } + //处理 BP28 语音消息 - public void handleBP28(Connection connection, String cmd, Runtime runtime, byte[] bytes) { + public void handleBP28(Connection connection, String cmd, byte[] bytes) { //log("handleBP28 msg"+cmd); -/** - * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# - * 说明: - * IW:标识符 - * BP28 : 命令字符 - * D3590D54:UNICODE编码,发送者名称 - * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号 - * 6:语音包分包总数 - * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 - * 1024 :语音包长度 - * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 - * 语音包上传规则: - * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 - * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 - * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 - * 设备响应: IWAP28,D3590D54,XXXX,6,1,1# - * D3590D54:UNICODE编码,发送者名称 - * XXXX: 附加信息,原样返回 - * 6:语音包分包总数 - * 1:当前设备收到的是第几个包 - * 1:表示设备接受数据成功,0表示设备接受数据失败 - */ - String Name; + /** + * IWBP28, D3590D54,XXXX,6,1,1024,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# + * 说明: + * IW:标识符 + * BP28 : 命令字符 + * D3590D54:UNICODE编码,发送者名称 + * XXXX: 附加信息,在响应数据包时,将附加信息原样响应,类似流水号 + * 6:语音包分包总数 + * 1 :当前包数,第一包为1,第二包为2,。。。。。。同一个语音包的语音时间相同 + * 1024 :语音包长度 + * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:当前音频数据, 每个音频数据包大小为1024字节,最后一包不足1024的取实际字节数 + * 语音包上传规则: + * 按包次序依次上传,上传后如果没有收到服务器的响应包,则继续上传该语音包。 + * 收到设备回复确认数据包接收成功状态后,继续开始依次上传下一个数据包。。。。。。 + * 如果设备回复确认数据包接收失败状态,则重复发送上一个数据包 + * 设备响应: IWAP28,D3590D54,XXXX,6,1,1# + * D3590D54:UNICODE编码,发送者名称 + * XXXX: 附加信息,原样返回 + * 6:语音包分包总数 + * 1:当前设备收到的是第几个包 + * 1:表示设备接受数据成功,0表示设备接受数据失败 + */ + String name; String appendIndex; int packetCount; int currentId; @@ -1408,7 +1803,13 @@ public class protocol_beehome { if (msg.length >= 6) { try { - Name = msg[1]; + String originalName = msg[1]; +// if (TextUtils.isEmpty(originalName)) { +// name = "group"; +// } else { +// name = Util.decodeUnicode2Utf8(originalName); +// } + name = "group"; appendIndex = msg[2]; packetCount = Integer.parseInt(msg[3]); currentId = Integer.parseInt(msg[4]); @@ -1416,50 +1817,110 @@ public class protocol_beehome { packetData = Util.subArray(bytes, msg[0].length() + msg[1].length() + msg[2].length() + msg[3].length() + msg[4].length() + msg[5].length() + 6, bytes.length - 1); StringBuffer stringBuffer = new StringBuffer(); - stringBuffer.append("recv BP28 name = ").append(Name) + stringBuffer.append("recv BP28 name = ").append(name) .append(",appendIndex = ").append(appendIndex) .append(",packetCount = ").append(packetCount) .append(",currentId = ").append(currentId) .append(",packetLen = ").append(packetLen) - .append(",packetDatalen = ").append(packetData.length); + .append(",packetDataLen = ").append(packetData.length); log(stringBuffer.toString()); - connection.send(AP28(Name, appendIndex, packetCount, currentId, 1)); - voicePacket.getInstance().appendVoice(Name, appendIndex, packetCount, currentId, packetLen, packetData); + connection.send(AP28(originalName, appendIndex, packetCount, currentId, 1)); + voicePacket.getInstance().appendVoice(name, appendIndex, packetCount, currentId, packetLen, packetData); log("================" + voicePacket.getInstance().toString()); if (voicePacket.getInstance().isFinished()) { - String dir = Environment.getExternalStorageDirectory() + "/Android/VoiceCache"; String amrFilepath = Util.saveFile(voicePacket.getInstance().getVoicePacketBytes(), 0, voicePacket.getInstance().getVoicePacketLen(), new File(dir), "receive_" + voicePacket.getInstance().getPacketTime() + ".amr"); ICLogger.i("save Amr file to " + amrFilepath); voicePacket.getInstance().clearPacket(); - VoiceContent voiceContent = VoiceContent.placeHolderIn(Content.CONTACT_CATEGORY_GROUP, GROUP_ALL, amrFilepath); - - - final Uri uri2 = runtime.getDbHelper().insertMessage(voiceContent); - - //回复UI消息,表示已经接收到 - voiceContent.status = 3; - voiceContent.serverTime = TimeUtil.getSystemTime3(); - voiceContent.preview = String.valueOf(Util.getDuration(voiceContent.content)); - runtime.getDbHelper().updateMessage(voiceContent, uri2); - -// runtime.getContextProxy().sendBroadcast(ACTION_IMESSAGE, runtime); - + message2Db("", amrFilepath, ICDatabaseHelper.MessageType.VOICE); connection.DeliverCMDMessageToSystem("NewVoice", amrFilepath);//通知下面线程状态变化 } } catch (Exception e) { ICLogger.e(e.getMessage(), e); } - } else { - log("handleBP28", "format Error"); -// connection.send(genStringMessage("AP28",AP28(Name,appendIndex,packetCount,currentId,0))); + ICLogger.d("format Error"); + } + + } + + private void message2Db(String remoteId, String amrFilepath, int type) { + //计算文件时长 + int amrDuration = 0; + if (type == ICDatabaseHelper.MessageType.VOICE || + type == ICDatabaseHelper.MessageType.FRIEND_VOICE) { + try { + File file = new File(amrFilepath); + amrDuration = getAmrDuration(file); + } catch (Exception e) { + e.printStackTrace(); + } } + ContentResolver resolver = mRuntime.getContextProxy().getResolver(); + ContentValues contentValues = new ContentValues(); + //路径 + contentValues.put("content", amrFilepath); + //类型为声音 + contentValues.put("type", type); + //状态:0表示未读 + contentValues.put("state", 0); + //文件时长 + contentValues.put("duration", amrDuration); + //接受还是发送,1表示来信 + contentValues.put("in_or_out", 1); + //对方号码是没有的 + contentValues.put("remote_num", remoteId); + contentValues.put("create_time", System.currentTimeMillis()); + contentValues.put("update_time", System.currentTimeMillis()); + resolver.insert(Uri.parse(WeTalkMessageProvider.MESSAGES), contentValues); + } + /** + * 获取声音时长,代码来源于网络,单位:秒 + * + * @param file + * @return + * @throws IOException + */ + public int getAmrDuration(File file) throws IOException { + long duration = -1; + int[] packedSize = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, + 0, 0}; + RandomAccessFile randomAccessFile = null; + try { + randomAccessFile = new RandomAccessFile(file, "rw"); + // 文件的长度 + long length = file.length(); + // 设置初始位置 + int pos = 6; + // 初始帧数 + int frameCount = 0; + int packedPos = -1; + // 初始数据值 + byte[] data = new byte[1]; + while (pos <= length) { + randomAccessFile.seek(pos); + if (randomAccessFile.read(data, 0, 1) != 1) { + duration = length > 0 ? ((length - 6) / 650) : 0; + break; + } + packedPos = (data[0] >> 3) & 0x0F; + pos += packedSize[packedPos] + 1; + frameCount++; + } + // 帧数*20 + duration += frameCount * 20; + } finally { + if (randomAccessFile != null) { + randomAccessFile.close(); + } + } + return (int) ((duration / 1000) + 1); } + public void sendBroadcast(String cmd, Runtime dev) { ComponentName componentName = new ComponentName("com.ic.watch", "com.ic.watch.launcher.ChatActivity"); @@ -1477,7 +1938,7 @@ public class protocol_beehome { //设备响应: IWAP80,080835,1# //080835:指令流水号 //1:表示设备执行成功,0 表示设备执行失败 - return genStringMessage(cmdMap.get(CMD_TYPE.AP84), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP84)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP84), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP84)) .append(CMDSPLIT).append(index) .append(CMDSPLIT).append(success) .append(CMDEND).toString()); @@ -1493,21 +1954,17 @@ public class protocol_beehome { //080835 :指令流水号 //1: 表示白名单开,0 表示白名单关 String[] list = cmd.split(CMDSPLIT); - if (list.length == 4) { String index = list[2]; String whitelist_switch = list[3]; connection.send(AP84(index, 1)); - if (whitelist_switch.equals("1")) { Util.setSystemProperties("persist.sys.whitelist.enable", "true"); } else { Util.setSystemProperties("persist.sys.whitelist.enable", "false"); } ICLogger.i("收到服务器指令:白名单" + (whitelist_switch.equals("1") ? "开" : "关")); - } else { - ICLogger.i("BP84 format error!"); } @@ -1518,7 +1975,7 @@ public class protocol_beehome { //设备响应: IWAP86, 080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP68)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP68), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP68)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } @@ -1553,7 +2010,7 @@ public class protocol_beehome { //设备响应: IWAP86, 080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.AP86), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP86)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP86), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP86)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } @@ -1597,7 +2054,7 @@ public class protocol_beehome { public static StringMessage AP88(String index) { //设备响应: IWAP88, 080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.AP88), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP88)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP88), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP88)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } @@ -1605,12 +2062,10 @@ public class protocol_beehome { public static void handleBP88(String cmd, Connection connection) { // IWBP88,080835# String[] list = cmd.split(CMDSPLIT); - if (list.length == 2) { String index = list[1]; connection.send(AP88(index)); ICLogger.i("收到服务器消息:查询设备"); - } else { ICLogger.i("BP88 format error!"); } @@ -1621,7 +2076,7 @@ public class protocol_beehome { //设备响应: IWAP89, 080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.AP89), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP89)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP89), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP89)) .append(CMDSPLIT).append(index) .append(CMDEND).toString()); } @@ -1664,7 +2119,7 @@ public class protocol_beehome { //设备响应: IWAPTE,080835,60# //080835:指令流水号 //1:表示设备接受数据成功,0表示设备接受数据失败 - return genStringMessage(cmdMap.get(CMD_TYPE.APTE), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTE)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APTE), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APTE)) .append(CMDSPLIT).append(index) .append(CMDSPLIT).append(freq) .append(CMDEND).toString()); @@ -1681,18 +2136,25 @@ public class protocol_beehome { //080835 :指令流水号 //60 : 上传间隔,单位分钟(60分钟上传一次体温,终端收到后立即开始测量一次并重置定时器) String[] list = cmd.split(CMDSPLIT); - if (list.length == 4) { + if (list.length >= 3) { try { String index = list[2]; - String freqstr = list[3]; + + String freqstr = "0"; + if (list.length == 4) + freqstr =list[3]; + int freq = Integer.parseInt(freqstr); connection.send(APTE(index, freq)); ICLogger.i("收到服务器指令:测量体温 " + freq + "分钟一次。"); - Config.setTemperatureTestCycle(runtime, freq * 60); + //if(freq>0) { + Config.setTemperatureTestCycle(runtime, freq * 60); + //} CoreService.getInstance().setTempAlarm(true); + //setTempAlarm中执行温度检测,下面无需再执行了! - if (runtime.check_stat_do_temp_test()) - TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER); + //if (runtime.check_stat_do_temp_test()) + // TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER); } catch (Exception e) { ICLogger.e(e.getMessage(), e); } @@ -1703,7 +2165,7 @@ public class protocol_beehome { // connection.send(genStringMessage("APTP",temperatureMsg)); // ICLogger.i("发送体温测量值 "+temperatureMsg); } else { - ICLogger.i("BP89 format error!"); + ICLogger.i("BPTE format error!"); } } @@ -1716,8 +2178,8 @@ public class protocol_beehome { //APTP : 命令字符 //35.3:测量体温 (摄氏度) //33,132:温补用的参数,此处不用,可以用0 来代替。 - return genStringMessage(cmdMap.get(CMD_TYPE.APTP), - new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTP)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APTP), + new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APTP)) .append(CMDSPLIT).append(String.format("%1$.2f", body_temp)) .append(CMDSPLIT).append(String.format("%1$.2f", wrist_temp)) .append(CMDSPLIT).append(0) @@ -1734,7 +2196,7 @@ public class protocol_beehome { public static StringMessage APX1(String id) { //设备响应: IWAPX1, 080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.APX1), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APX1)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APX1), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APX1)) .append(CMDSPLIT).append(id) .append(CMDEND).toString()); } @@ -1792,7 +2254,7 @@ public class protocol_beehome { public static StringMessage APS4(String id) { //设备响应: IWAPS4,080835# //080835:指令流水号 - return genStringMessage(cmdMap.get(CMD_TYPE.APS4), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APS4)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APS4), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APS4)) .append(CMDSPLIT).append(id) .append(CMDEND).toString()); } @@ -1811,9 +2273,9 @@ public class protocol_beehome { ICLogger.d("is24Hour == > " + is24Hour); TimeUtil.set24Hour(mRuntime.getContextProxy().context, is24Hour); mConnection.send( - genStringMessage(cmdMap.get(CMD_TYPE.APTF), + genStringMessage(cmdStrMap.get(CMD_TYPE.APTF), new StringBuilder(CMDHEADER) - .append(cmdMap.get(CMD_TYPE.APTF)) + .append(cmdStrMap.get(CMD_TYPE.APTF)) .append(CMDSPLIT) .append(split[2]).append(CMDEND).toString()) ); @@ -1881,17 +2343,390 @@ public class protocol_beehome { } } + public static StringMessage APSQ(String id, int type, int cycle) { + //设备响应: IWAPSQ,080835,1,60# + //080835:指令流水号 + return genStringMessage(cmdStrMap.get(CMD_TYPE.APSQ), + new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APSQ)) + .append(CMDSPLIT).append(id) + .append(CMDSPLIT).append(type) + .append(CMDSPLIT).append(cycle) + .append(CMDEND).toString()); + } + + /** + * 上传健康数据,IWAPJK,2021-05-29 13:00:00,1,69|120# + * + * @param type 1表示血压,2表示心率,3表示体温 + * @return + */ + public static StringMessage APJK(int type, Runtime runtime) { + StringBuilder sb = new StringBuilder(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APJK)); + sb.append(CMDSPLIT); + //添加时间 + sb.append(TimeUtil.getUTCTimeForCameraMark()).append(CMDSPLIT); + sb.append(type).append(CMDSPLIT); + if (type == 1) { + //血压 + sb.append(runtime.getHRS().getBPL()).append("|").append(runtime.getHRS().getBPH()); + } else if (type == 2) { + //心率 + sb.append(runtime.getHRS().getPPG()); + } else if (type == 3) { + sb.append(String.format("%1$.2f", runtime.tempInfo.currentBodyTemp)); + } else if (type == 4) { + sb.append(runtime.getHRS().getSpo2()); + } + sb.append(CMDEND); + String s = sb.toString(); + ICLogger.d("apjk ==> " + s); + return genStringMessage(cmdStrMap.get(CMD_TYPE.APTP), s); + } + + private void handleBPMC(String cmd) { + //指令,IMEI,流水,值:0,1,2。 + //0表示关闭,1表示打开,2表示获取当前的状态,不做设置,只返回 + //IWBPMC,353456789012345,080835,1# + String[] split = cmd.split(CMDSPLIT); + if (split.length == 4) { + String index = split[2]; + String value = split[3]; + ICLogger.d("BPMC index ==> " + index + " value==> " + value); + //判断value,返回内容 + boolean responseValue = false; + if ("0".equals(value)) { + responseValue = false; + LocationClient.setSkipMoveCheck(false); + Config.setSkipMoveCheckFlagGlobal(mRuntime.getContextProxy().context, false); + } else if ("1".equals(value)) { + responseValue = true; + LocationClient.setSkipMoveCheck(true); + Config.setSkipMoveCheckFlagGlobal(mRuntime.getContextProxy().context, true); + } else if ("2".equals(value)) { + responseValue = LocationClient.getSkipMoveCheck(); + } + //返回结果 + StringMessage apmc = APMC(index, responseValue); + ICLogger.d("apmc ==> " + apmc); + mConnection.send(apmc); + } else { + ICLogger.d("parse error ==> " + cmd); + } + } + + private StringMessage APMC(String index, boolean responseValue) { + return genStringMessage(cmdStrMap.get(CMD_TYPE.APMC), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APMC)) + .append(CMDSPLIT).append(index) + .append(CMDSPLIT).append(responseValue) + .append(CMDEND).toString()); + } + + /** + * 处理天气信息 + * 平台响应: IWBPTQ, 16-09-24,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-25,11:00:00,b6e0d4c6,2,-5,-12,22,16-09-26,11:00:00,b6e0d4c6,2,-5,-12,22,316df15733# + * å¹´-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,å¹´-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,å¹´-月-日,时:分:秒,天气描述,天气编号,当前温度,最低温,最高温,城市名注:天气描述用Unicode编码,城市名使用Unicode编码, + * 第一组为当天,后2组依次为后续2天天气如天气编号及描述对应如下 + * (天气描述不需要发送括号内的白天晚上) + * 因天气接口的变更 返 + * 回天气类型暂时支持 11 16 26 32 + * 0:龙卷风1:热带风暴2:飓风3:严重的雷暴4:雷暴5:混合雨雪6:混合降雨和冰雹7:混合雪和雨夹雪8:冻结小雨9:小雨10:冻雨11:阵雨12:阵雨13:雪飘雪14:小雪阵雨15:吹雪16:雪17:冰雹18:雨夹雪19:尘埃20:雾21:霾22:黑烟23:大风24:风25:低温26:多云27:多云(晚上)28:多云(白天)29:局部多云(晚上)30:局部多云(天)31:清爽(晚)32:晴天33:晴朗(晚)34:晴朗(天)35:混合雨和冰雹36:热37:局部地区性雷暴38:零星雷暴39:零星雷暴40:零星阵雨41:大雪42:零星阵雪43:大雪44:多云45:雷阵雨46:阵雪47:局部雷阵雨       + * + * @param cmd + */ + private void handleBPTQ(String cmd) { + //对指令进行切割 + String[] cmdList = cmd.split(CMDSPLIT); + if (cmdList.length == 23) { + + StringBuilder sb = new StringBuilder(); + StringBuilder msg = new StringBuilder(); + String cityName = Util.decodeUnicode2Utf8(cmdList[22]); + List weatherInfo = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + String DayTime = cmdList[1 + i * 7] + " " + cmdList[2 + i * 7]; + String date = "20" + cmdList[1 + i * 7].trim(); + String weather_name = Util.decodeUnicode2Utf8(cmdList[3 + i * 7].trim()); + String weather_id = cmdList[4 + i * 7]; + String temp_current = cmdList[5 + i * 7]; + String temp_high = cmdList[6 + i * 7]; + String temp_low = cmdList[7 + i * 7]; + + sb.append(" " + DayTime); + sb.append(",天气:" + weather_name); + sb.append(",ID " + weather_id); + sb.append(",当前温度 " + temp_current); + sb.append(",最高温度 " + temp_high); + sb.append(",最低温度 " + temp_low); + sb.append("\n"); + + msg.append(date); + msg.append("," + weather_name); + msg.append("," + weather_id); + msg.append("," + temp_current); + msg.append("," + temp_high); + msg.append("," + temp_low); + msg.append(";"); + + //返回数据给UI + GenericWeatherInfo itemFirst = new GenericWeatherInfo(DayTime, + weather_name, weather_id, temp_current, temp_low, temp_high, cityName); + //封装数据 + weatherInfo.add(itemFirst); + } + ICLogger.i(cityName + " \n" + sb.toString()); + + msg.insert(0, cityName + ";"); + String weatherStr = msg.toString(); + if (weatherStr.endsWith(";")) { + weatherStr = weatherStr.substring(0, weatherStr.lastIndexOf(";")); + } + Intent intent = new Intent(Constants.ACTION_WEATHER_RECEIVED); + intent.putExtra(Constants.KEY_Weather, weatherStr); + ICLogger.i("send Broadcast " + Constants.ACTION_WEATHER_RECEIVED + "\n" + weatherStr + "\n"); + CoreService.getInstance().sendBroadcast(intent); + mRuntime.updateS123Weather(weatherInfo); + } else { + ICLogger.i(" BPTQ Format error!"); + } + } + + public void handleBP87(String cmd, Runtime runtime) { + //IWBP87,http://cn.map20000.com/physicalReport.html?lang=zh-CN&imeis=866671044898063# + String[] list = cmd.split(CMDSPLIT); + if (list.length == 2) { + String furl = list[1];//.replace("#",""); + ICLogger.i("收到服务器指令 BP87:Qrcode url " + furl); + try { + String qrfilepath = Util.getLogfilePath(runtime, TimeUtil.getSystemDateYYMMDD()); + Util.setSystemProperties(Config.KeyQRURIFILE, qrfilepath); + FileOutputStream fos = new FileOutputStream(new File(qrfilepath)); + fos.write(furl.getBytes()); + fos.close(); + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); + } + } else { + ICLogger.i("BP87 format error!"); + } + + } + + /** + * 拨打电话(下行协议号:BP32,响应:AP32) + * IWBP32,353456789012345,080835,133xxxxxxxx# + *

+ * 响应: + * IWAP32,080835# + * + * @param cmd + */ + private void handleBP32(String cmd) { + String[] split = cmd.split(CMDSPLIT); + if (split.length == 4) { + String cmdIndex = split[2]; + //回复消息 + mConnection.send(AP32(cmdIndex)); + //开始拨号 + String targetNumber = split[3]; + ICLogger.d("target number is ==> " + targetNumber); + Intent intent = new Intent(Intent.ACTION_CALL); + intent.setData(Uri.parse("tel:" + targetNumber)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (ActivityCompat.checkSelfPermission(mRuntime.getContextProxy().context, + Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { + ICLogger.d("no permission to call..."); + return; + } + mRuntime.getContextProxy().context.startActivity(intent); + } else { + ICLogger.d("BP32 format error==> " + cmd); + } + } + + /** + * 拨号指令返回 + * + * @param cmdIndex + * @return + */ + private StringMessage AP32(String cmdIndex) { + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP32), + new StringBuilder(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP32)) + .append(CMDSPLIT).append(cmdIndex).append(CMDEND).toString()); + } + + /** + * 下发内容 + * IWBP75,353456789012345,080835,1,3,D3590D54,0900 ,135,1@D3590D54,0900 ,135,1@D3590D54,0900 ,135,1# + * 回复消息 + * IWAP75,080835, 1,3,D3590D54,0900 ,135,1@D3590D54,0900 ,135,1@D3590D54,0900 ,135,1# + * + * @param mRuntime + * @param cmd + */ + private void handleBP75(Runtime mRuntime, String cmd) { + //IWBP75,353456789012345,080835, + // 1, + // 3, + // D3590D54,0900 ,135,1 + // @ + // D3590D54,0900 ,135,1 + // @ + // D3590D54,0900 ,135,1# + //解析数据 + ICLogger.d("cmd is == > " + cmd); + String ap75Str = cmd.replace("BP75", "AP75"); + String responseMsg = + ap75Str.replace(mRuntime.IMEI() + CMDSPLIT, + "") + CMDEND; + ICLogger.d("responseMsg == > " + responseMsg); + mConnection.send(genStringMessage(cmdStrMap.get(CMD_TYPE.AP75), responseMsg)); + try { + String[] split = cmd.split(CMDSPLIT); + int cmdLen = 0; + cmdLen += split[0].length() + 1; + cmdLen += split[1].length() + 1; + String streamCode = split[2]; + cmdLen += streamCode.length() + 1; + ICLogger.d("streamCode == > " + streamCode); + String isAllOpen = split[3]; + cmdLen += isAllOpen.length() + 1; + ICLogger.d("isAllOpen == > " + isAllOpen); + String alarmCount = split[4]; + ICLogger.d("alarmCount = > " + alarmCount); + cmdLen += alarmCount.length() + 1; + String substring = cmd.substring(cmdLen); + String[] alarmItemArray = substring.split("@"); + ContentResolver resolver = mRuntime.getContextProxy().getResolver(); + //删除之前先取消已经设置的闹钟 + List oldAlarmList = mRuntime.getDbHelper().queryIcAlarm(); + //取消掉上次的闹钟,再进行设置新的 + SilentManager.getInstance().cancelAlarm(oldAlarmList); + //闹钟下发,也是要清空闹钟的 + resolver.delete(Uri.parse(ICAlarmProvider.ALARMS), null, null); + for (String itemStr : alarmItemArray) { + ICLogger.d("itemStr==> " + itemStr); + String[] itemDetail = itemStr.split(CMDSPLIT); + //第一个是名称 + String alarmName = Util.decodeUnicode2Utf8(itemDetail[0]); + ICLogger.d("alarmName == > " + alarmName); + //第二个是时间 + String alarmTime = itemDetail[1]; + ICLogger.d("alarmTime == > " + alarmTime); + //第三个是循环星期 + String weekItem = itemDetail[2]; + ICLogger.d("weekItem == > " + weekItem); + //第四个是开关,有可能是 2,如果是2的话,那么就是单次响铃 + String isOpen = itemDetail[3]; + ICLogger.d("isOpen == > " + isOpen); + //如果是全部关闭,那么所有的闹钟都会为0 + if ("0".equals(isAllOpen)) { + isOpen = "0"; + } + if (TextUtils.isEmpty(alarmTime)) { + continue; + } + //添加到闹钟数据库中 + String hour = alarmTime.substring(0, 2); + String minute = alarmTime.substring(2); + if (TextUtils.isEmpty(hour) || TextUtils.isEmpty(minute)) { + ICLogger.d("date ERROR..."); + continue; + } + String status = "ON"; + if ("0".equals(isOpen)) { + status = "OFF"; + } else if ("1".equals(isOpen)) { + status = "ON"; + } else if ("2".equals(isOpen)) { + status = "ONCE"; + } + Alarm alarmItem = new Alarm("ST" + hour + "." + minute, + "W" + weekItem, "CON", status, alarmName); + ICLogger.d("alarmItem == > " + alarmName); + //入库 + ICLogger.d(" alarmItem.name==> " + alarmItem.name); + ContentValues contentValues = new ContentValues(); + contentValues.put(ICDatabaseHelper.alarm_name, alarmItem.name); + contentValues.put(ICDatabaseHelper.alarm_week, alarmItem.week); + contentValues.put(ICDatabaseHelper.alarm_ring, alarmItem.ring); + contentValues.put(ICDatabaseHelper.alarm_time, alarmItem.time); + contentValues.put(ICDatabaseHelper.alarm_status, alarmItem.status); + contentValues.put(ICDatabaseHelper.updateTime, System.currentTimeMillis()); + contentValues.put(ICDatabaseHelper.createTime, System.currentTimeMillis()); + resolver.insert(Uri.parse(ICAlarmProvider.ALARMS), contentValues); + } + //设置闹钟 + mRuntime.getContextProxy().context.sendBroadcast(new Intent(ACTION_ALARM_ALARM_CHANGE)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void handleBPSQ(String cmd, Connection connection, Runtime runtime) { + //IWBPSQ,353456789012345,080835,1,60# + //说明: + // 080835为序列号,1,是传感器类型(1是心率,2是血压,3是体温,4是血氧),60为间隔时间,单位为秒 + String[] list = cmd.split(CMDSPLIT); + if (list.length >= 5) { + String imei = list[1]; + String index = list[2]; + String typestr = list[3].trim(); + String cyclestr = list[4].trim(); + int type = 0; + int cycle_seconds = 0; + int cycle_minutes = 0; + try { + type = Integer.parseInt(typestr); + cycle_seconds = Integer.parseInt(cyclestr); + connection.send(APSQ(index, type, cycle_seconds)); + cycle_minutes = cycle_seconds / 60; + String type_name = "未知"; + switch (type) { + case 1: + type_name = "心率"; + //发送重置PPGCycle的广播,会在CoreServer里面执行 + CoreService.getInstance().setHeartRateDetectAlarm(cycle_minutes); + break; + case 2: + type_name = "血压"; + //发送重置PPGCycle的广播,会在CoreServer里面执行 + CoreService.getInstance().setHeartRateDetectAlarm(cycle_minutes); + break; + case 3: + type_name = "体温"; + Config.setTemperatureTestCycle(runtime, cycle_seconds); + CoreService.getInstance().setTempAlarm(true); + break; + case 4: + type_name = "血氧"; + //发送重置PPGCycle的广播,会在CoreServer里面执行 + CoreService.getInstance().setHeartRateDetectAlarm(cycle_minutes); + break; + default: + type_name = "未知"; + break; + } + ICLogger.i("收到 BPSQ 指令,设置体征传感器测试周期, IMEI " + imei + ", index " + index + ", 传感器类型 " + type + " " + type_name + " 间隔" + cycle_seconds + "秒,相当于" + cycle_minutes + "分钟"); + } catch (Exception e) { + ICLogger.e(e.getMessage(), e); + } + } else { + ICLogger.i("BPSQ format error!"); + } + } + public static StringMessage APHP(Runtime ds) { //IWAPHP,60,130,85,95,90, , , , , , , , # //IW:标识符 - //APHT : 命令字符 + //APHP : 命令字符 //60 : 表示心率 //130: 血压高压 [收缩压] //85 : 血压低压 [舒张压] //95:血氧 //90:血糖 // 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 - return genStringMessage(cmdMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHP)) .append(CMDSPLIT).append(ds.getHRS().getPPG()) .append(CMDSPLIT).append(ds.getHRS().getBPH()) .append(CMDSPLIT).append(ds.getHRS().getBPL()) @@ -1908,6 +2743,140 @@ public class protocol_beehome { .append(CMDEND).toString()); } + /** + * 处理拨号开关,数据入库,进入拨号前要获取一下,是否可以拨号, + * + * @param cmd IWBPPH,353456789012345,080835,1# + * IWAPPH,080835,1# + */ + private void handleBPPH(String cmd) { + //解析数据 + String[] split = cmd.split(CMDSPLIT); + if (split.length == 4) { + try { + String id = split[2]; + String value = split[3]; + //1 : 表示设备可以拨号 0:表示设备不可拨号, 用于同步平台设置。 + Util.setSystemProperties("persist.sys.phone.enable", value); + //返回结果 + responseWithId(cmdStrMap.get(CMD_TYPE.APPH), id, value); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + ICLogger.d("handleBPPH error..."); + } + } + + /** + * 处理服务器模拟的短信指令 + * + * @param cmd + */ + private void handleBPSM(String cmd) { + //短信指令里的#要用@替换掉,逗号要用-代替(建议是平台去完成这个替换,用户还是按原指令去写) + //比如说短信指令是:#logctl#=upload,all + //改成:@logctl@=upload-all + //IWBPSM,353456789012345,080835,指令内容# + //IWBPSM:标示符 + //353456789012345:IMEI号 + //080835:流水号 + //设备回复: + //IWAPSM,080835,1/0# + //1表示成功,0表示失败 + String[] split = cmd.split(CMDSPLIT); + if (split.length == 4) { + String indexId = split[2]; + String smsContent = split[3]; + String targetSmsContent = smsContent.replaceAll("@", "#").replaceAll("-", ","); + ICLogger.d("targetSmsContent ==> " + targetSmsContent); + if (CoreService.smsManager != null) { + ICLogger.d("handle sms cmd...."); + //"WEB-"就是靠这个标记给后台发送东西的了 + CoreService.smsManager.handleSMS_CMD("WEB-" + indexId, targetSmsContent); + } + } else { + ICLogger.d("parse BPSM error.."); + } + } + + + private void responseWithId(String cmd, String id, String... args) { + StringBuilder append = new StringBuilder(CMDHEADER).append(cmd) + .append(CMDSPLIT).append(id); + for (String arg : args) { + append.append(CMDSPLIT).append(arg); + } + append.append(CMDEND); + ICLogger.d("response content ==> " + append.toString()); + StringMessage stringMessage = genStringMessage(cmd, append.toString()); + mConnection.send(stringMessage); + } + + + public void handleBP46(String cmd, Connection connection, Runtime runtime) { + /*** + * IWBP46,353456789012345,080835,1,[参数]# + * 说明: + * IW:标识符 + * BP46 : 命令字符 + * 353456789012345:IMEI号,设备唯一ID + * 080835 :指令流水号 + * 1: 表示立即拍照 + * [参数]: 此为可选项。根据不同类型设备扩展 + * #:结尾标识符 + * 设备响应: IWAP46,080835,1# + * 080835:指令流水号 + * 1 成功 0失败 + * # 结尾标识符 + */ + String[] cmdlist = cmd.split(CMDSPLIT); + + if (cmdlist.length >= 4) { + String imei = cmdlist[1]; + String id = cmdlist[2]; + String cdd = cmdlist[3]; + if (cmdlist.length == 5) { + String tmp = cmdlist[4]; + } + connection.send(AP46(id, cdd)); + Context context = mRuntime.getContextProxy().context.getApplicationContext(); + if (cdd.equals("1")) { + //delay 启动 + +// Intent intent = new Intent(context, com.ic.protocolSrv.CoreService.class); +// intent.setAction(ACTION_REMOTE_CAMERA); +// intent.putExtra("remote_number", id); +// context.startService(intent); +// runtime.getContextProxy().context.sendBroadcast(intent); + mHandler.post(new Runnable() { + @Override + public void run() { + (new CameraUtil(context)).getPicture(id); + } + }); + + } else if (cdd.equals("2")) { + Intent intent = new Intent(); + intent.setAction(DIALOG_ACTION); + intent.putExtra("takephoto", "Take Photo !"); + context.sendBroadcast(intent); + } + } else { + ICLogger.i(" BP46 Format error!"); + } + } + + + public static StringMessage AP46(String id, String cmd) { + return genStringMessage(cmdStrMap.get(CMD_TYPE.AP46), + new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.AP46)) + .append(CMDSPLIT).append(id) + .append(CMDSPLIT).append(cmd) + .append(CMDEND).toString()); + } + + public static StringMessage APHP(int ppg, int bph, int bpl, int spo2) { //IWAPHP,60,130,85,95,90, , , , , , , , # //IW:标识符 @@ -1918,7 +2887,7 @@ public class protocol_beehome { //95:血氧 //90:血糖 // 本消息适用所有终端,其中需要每项指标不一定全部有值,如果无值,则留空 - return genStringMessage(cmdMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APHP)) + return genStringMessage(cmdStrMap.get(CMD_TYPE.APHP), new StringBuffer(CMDHEADER).append(cmdStrMap.get(CMD_TYPE.APHP)) .append(CMDSPLIT).append(ppg) .append(CMDSPLIT).append(bph) .append(CMDSPLIT).append(bpl) @@ -1936,13 +2905,14 @@ public class protocol_beehome { } public void handleBPHP() { - ICLogger.i("服务器收到APHP 心率血压血氧 !"); - } public boolean handleCmd(CMD_TYPE type, String cmd) { - + if (type == null) { + ICLogger.d("type is null ==> " + cmd); + return false; + } //普通非二进制命令用此函数处理 boolean ret = true; ICLogger.i("handleCmd " + type.name() + " strLen=" + cmd.length()); @@ -1958,6 +2928,11 @@ public class protocol_beehome { ICLogger.i("服务器收到定位AP01"); mConnection.DeliverCMDMessageToSystem("AP01", cmd);//通知下面线程状态变化 break; + case BPH1: //gps定位包 + handleBP01(cmd); + ICLogger.i("服务器收到历史定位BPH1"); + mConnection.DeliverCMDMessageToSystem("BPH1", cmd);//通知下面线程状态变化 + break; case BP02:// wifi定位包 handleBP02(cmd); ICLogger.i("服务器收到定位AP02"); @@ -1968,16 +2943,14 @@ public class protocol_beehome { ICLogger.i("服务器收到心跳包AP03"); mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);//通知下面线程状态变化 break; - case BP07: //收到发送的语音包 - handleBP07(cmd, mConnection); + handleBP07(cmd); break; case BP10: //报警包 mConnection.DeliverCMDMessageToSystem("AP10", cmd);//通知下面线程状态变化 break; - case BPTM: //校时命令 handleBPTM(cmd); @@ -2005,12 +2978,6 @@ public class protocol_beehome { handleBP16(mConnection, mRuntime, cmd); mConnection.DeliverCMDMessageToSystem("StartLocate", cmd);//通知下面线程状态变化 break; - -// case BP05: //L02服务器不适用 -// //查询服务器语音 返回信息 -// API.handleBP05(cmd); -// break; - case BP12: //收到设置SOS号码 handleBP12(mConnection, cmd, mRuntime); @@ -2031,7 +2998,6 @@ public class protocol_beehome { ICLogger.i("收到服务器恢复出厂设置命令BP17"); mConnection.DeliverCMDMessageToSystem("FactoryReset", cmd);//通知下面线程状态变化 break; - case BP18: //收到重启 handleBP18(mConnection, cmd); @@ -2051,10 +3017,17 @@ public class protocol_beehome { ICLogger.i("收到服务器推送文本消息"); mConnection.DeliverCMDMessageToSystem("showTxt", cmd);//通知下面线程状态变化 break; - case BPXL: handleBPXL(cmd, mConnection); ICLogger.i("收到服务器心率检测命令"); + Config.testType = HeartRateOxygenTestType.JUST_HEART_RATE; + if (mRuntime.check_stat_do_ppg_test()) + HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER); + break; + case BPOX: + handleBPOX(cmd, mConnection); + ICLogger.i("收到服务器血氧检测命令"); + Config.testType = HeartRateOxygenTestType.JUST_OXYGEN; if (mRuntime.check_stat_do_ppg_test()) HeartRateManager.getInstance().triggerPPGTest(FROM_SERVER); break; @@ -2079,55 +3052,109 @@ public class protocol_beehome { case BP86: //绑定解绑消息 handleBP86(cmd, mConnection, mRuntime); - mConnection.DeliverCMDMessageToSystem("AP86", cmd);//通知下面线程状态变化 - + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP86", cmd); break; - case BP88: //收到查找设备消息 handleBP88(cmd, mConnection); - mConnection.DeliverCMDMessageToSystem("findDev", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("findDev", cmd); break; case BP89: //心率/血压阀值 handleBP89(cmd, mConnection); - mConnection.DeliverCMDMessageToSystem("AP89", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("AP89", cmd); break; case BPTE: //设置测试体温 handleBPTE(cmd, mConnection, mRuntime); - mConnection.DeliverCMDMessageToSystem("APTE", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APTE", cmd); break; case BPTP: handleBPTP(); - mConnection.DeliverCMDMessageToSystem("APTP", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APTP", cmd); break; case BPHP: handleBPHP(); - mConnection.DeliverCMDMessageToSystem("APHP", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APHP", cmd); break; case BPX1://设置 心率血压血氧修正值 handleBPX1(cmd, mConnection, mRuntime); ICLogger.i("收到服务器设置 心率血压血氧修正值BPX1"); - mConnection.DeliverCMDMessageToSystem("APX1", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APX1", cmd); break; case BPS4: //提醒设置(时间段) 主要为久坐设置提醒时长。 handleBPS4(cmd, mConnection, mRuntime); ICLogger.i("收到 提醒设置(时间段)"); - mConnection.DeliverCMDMessageToSystem("APS4", cmd);//通知下面线程状态变化 + //通知下面线程状态变化 + mConnection.DeliverCMDMessageToSystem("APS4", cmd); break; case BPTF: handleBPTF(cmd, mConnection, mRuntime); ICLogger.d("收到修改时间格式的指令..."); break; - } + case BPSQ: + handleBPSQ(cmd, mConnection, mRuntime); + ICLogger.d("收到设置体征信息检测间隔的指令..."); + break; + case BPMC: + ICLogger.d("收到服务器下发的修改skipmovecheck"); + handleBPMC(cmd); + break; + case BPPH: + //收到服务器拨号功能开关 + ICLogger.d("收到服务器拨号功能开关."); + handleBPPH(cmd); + break; + case BPJK: + mConnection.DeliverCMDMessageToSystem("APJK", cmd);//通知下面线程状态变化 + ICLogger.d("服务器收到健康数据上报" + cmd); + break; + case BPSM: + //收到设置短信指令的信息 + handleBPSM(cmd); + break; + case BPTQ: + //处理下发的天气信息 + handleBPTQ(cmd); + break; + case BP75: + ICLogger.d("收到闹钟设置指令BP75"); + handleBP75(mRuntime, cmd); + break; + case BP32: + ICLogger.d("收到后台下发的拨号指令BP32."); + handleBP32(cmd); + break; + case BP87: + ICLogger.d("接收到二维码的图片."); + handleBP87(cmd, mRuntime); + break; + case BP05: + ICLogger.d("收到服务器BP05"); + handleBP05(cmd); + break; + case BP46: //立即拍照 + ICLogger.i("立即拍照!"); + handleBP46(cmd, mConnection, mRuntime); + break; + case BP42: + handleBP42(cmd, mConnection); + break; + } return ret; - } + public boolean handleCmd(CMD_TYPE type, String cmd, byte[] bytes) { //只有需要传递二级制数据的才需要这个函数,目前只有BP28需要 @@ -2136,7 +3163,7 @@ public class protocol_beehome { if (Config.LOG_TOFILE) ICLogger.logToFile("APILog", " recv " + new String(bytes)); switch (type) { case BP28: - handleBP28(mConnection, cmd, mRuntime, bytes); + handleBP28(mConnection, cmd, bytes); ICLogger.i("收到服务器语音BP28"); mConnection.DeliverCMDMessageToSystem("BP28", "");//通知下面线程状态变化 break; diff --git a/app/src/main/java/com/ic/protocols/protocol_s123.java b/app/src/main/java/com/ic/protocols/protocol_s123.java index 7f68dffc..4bd564a8 100644 --- a/app/src/main/java/com/ic/protocols/protocol_s123.java +++ b/app/src/main/java/com/ic/protocols/protocol_s123.java @@ -4017,7 +4017,7 @@ public class protocol_s123 { content = content.replaceAll("%%", "#"); //把这个消息转到短信的执行流程中去 ICLogger.d("content == > " + content); - ICSmsManager.handleSms(mRuntime, content, null, null); + // ICSmsManager.handleSms(mRuntime, content, null, null); //回复 // 1:表示设备接受数据成功,0表示设备接受数据失败 responseWithId(cmdMap.get(CMD_TYPE.APSS), id, "1"); diff --git a/app/version_code.properties b/app/version_code.properties index 77631360..d75c4c44 100644 --- a/app/version_code.properties +++ b/app/version_code.properties @@ -1,2 +1,2 @@ -#Thu May 18 23:54:57 GMT+08:00 2023 -VERSION_CODE=963 +#Sun Jun 11 23:00:31 GMT+08:00 2023 +VERSION_CODE=964 diff --git a/core/core.iml b/core/core.iml new file mode 100644 index 00000000..b32a9423 --- /dev/null +++ b/core/core.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dNSCache/dNSCache.iml b/dNSCache/dNSCache.iml new file mode 100644 index 00000000..c54b500e --- /dev/null +++ b/dNSCache/dNSCache.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/protocol8.1.iml b/protocol8.1.iml new file mode 100644 index 00000000..584b44a9 --- /dev/null +++ b/protocol8.1.iml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file