import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import com.enqualcomm.support.Config;
+import com.enqualcomm.support.Constants;
import com.enqualcomm.support.CoreService;
import com.enqualcomm.support.R;
import com.enqualcomm.support.bean.Alarm;
import java.io.File;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
public protocol_anan(Connection connect, Runtime runtime) {
mConnection = connect;
mRuntime = runtime;
- getPhoneStatus();
+ getPhoneStatus(runtime);
//注册佩戴状态改变的监听
registerWearStateReceiver();
}
public static final int STATE_ANTI_ON = 0;
public static final int STATE_ANTI_OFF = 1;
+
+ /*LBS+WiFi混合定位*/
+ public static StringMessage AP02(Runtime ds) {
+ //示例数据:IWAP02,
+ // zh_cn,
+ // 0,
+ // 7,
+ // 460,0,
+ // 9520|3671|13,9520|3672|12,9520|3673|11,9520|3674|10,9520|3675|9,9520|3676|8,9520|3677|7,
+ // 4,
+ // 1|D8-24-BD-79-FA-1F|59&2|3C-46-D8-6D-CE-01|81&3|0C-4C-39-1A-7C-65|69&4|70-A8-E3-5D-D7-C0|65#
+// IW标识符
+// AP02:命令字
+// zh_cn: 语言标志
+// 0:回复标识,为0时不回复地址,为 1 时,服务器回复地址信息
+// 7: 表示共有7组基站
+// 460: MCC 国家码
+// 0: MNC运营商代码
+// 9520|3671|10: LAC|CID|dbm表示一组基站信息,后面数量需和基站组数地应 10:dbm为信号强度多基站信号强度建议从高到低排列后上传,信号强度转正数:150 – abs(dbm)
+// 4: 表示WIFI组数,
+// 1|D8-24-BD-79-FA-1F|59: ssid|mac地址|信号强度,信号强度转正数:150 – abs(信号强度)
+
+ int apsum = 0;
+ String wifiinfo = ds.getWifiInfo();
+ if (!wifiinfo.isEmpty()) {
+ String[] list = wifiinfo.split("&");
+ apsum = list.length;
+ }
+
+ String wifiInfo = ds.getWifiInfo();
+ ICLogger.i("Wifi ap sum " + apsum);
+ return genStringMessage(cmdMap.get(CMD_TYPE.AP02),
+ new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP02)).append(CMDSPLIT)
+ .append(ds.getLanguage()).append(CMDSPLIT)
+ .append(0).append(CMDSPLIT) //为0时不回复地址
+ .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据
+ .append(apsum).append(TextUtils.isEmpty(wifiInfo) ? "" : CMDSPLIT).append(TextUtils.isEmpty(wifiInfo) ? "" : wifiInfo)
+ .append(CMDEND).toString()); //wifi信息数据
+ }
+
private void registerWearStateReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.ic.ACTION_ANTIOFF");
BP15/*GPRS定位数据上传时间间隔*/,
BP68/*设置绑定状态*/,
BP84/* 白名单开关*/,
+ BPTQ/* 天气数据来了*/,
BPFD/*交好友响应*/,
BP07/*语音上行响应*/,
BP95/*语音上行给好友响应*/,
AP32/*拨号上行*/,
APSW/*定位开关上行*/,
AP98/*计步目标设置上行*/,
- BPHT/*心率血压上传结果*/
+ AP26,
+ BPHT/*心率血压上传结果*/,
+ BP10/*天气的回应*/,
+ AP02,
+ BP02,
+ BP01/*GPS的*/,
+ BP00/*登录包*/,
+ BP03/*心跳*/
}
private final static HashMap<CMD_TYPE, String> cmdMap;
cmdMap.put(CMD_TYPE.BPXY, "BPXY");
cmdMap.put(CMD_TYPE.BP98, "BP98");
cmdMap.put(CMD_TYPE.BP84, "BP84");
+ cmdMap.put(CMD_TYPE.BPTQ, "BPTQ");
cmdMap.put(CMD_TYPE.BPFD, "BPFD");
cmdMap.put(CMD_TYPE.BP87, "BP87");
cmdMap.put(CMD_TYPE.BPNT, "BPNT");
cmdMap.put(CMD_TYPE.BP88, "BP88");
cmdMap.put(CMD_TYPE.BP99, "BP99");
+ cmdMap.put(CMD_TYPE.AP02, "AP02");
+ cmdMap.put(CMD_TYPE.BP02, "BP02");
cmdMap.put(CMD_TYPE.BPSW, "BPSW");
cmdMap.put(CMD_TYPE.BP95, "BP95");
cmdMap.put(CMD_TYPE.BP28, "BP28");
cmdMap.put(CMD_TYPE.APXL, "APXL");
cmdMap.put(CMD_TYPE.APSW, "APSW");
cmdMap.put(CMD_TYPE.AP98, "AP98");
+ cmdMap.put(CMD_TYPE.BP00, "BP00");
+ cmdMap.put(CMD_TYPE.AP26, "AP26");
+ cmdMap.put(CMD_TYPE.BP03, "BP03");
}
/*登录*/
public static StringMessage AP00(Runtime runTime) {
+ if (TextUtils.isEmpty(runTime.getIccid()) || TextUtils.isEmpty(runTime.getImsi())) {
+ String phoneStatus = getPhoneStatus(runTime);
+ ICLogger.d("phoneStatus == > " + phoneStatus);
+ return null;
+ }
//示例数据:IWAP00102002020001871,898600A7189443197156,9460077731997156#
return genStringMessage(cmdMap.get(CMD_TYPE.AP00),
new StringBuffer(CMDHEADER).append(
cmdMap.get(CMD_TYPE.AP00)
).append(runTime.IMEI())
+ .append(CMDSPLIT)
.append(runTime.getIccid())
+ .append(CMDSPLIT)
.append(runTime.getImsi())
.append(CMDEND).toString());
}
if (!lang.contains("zh")) {
language = 1;
}
- return genStringMessage("APTQ", new StringBuffer(CMDHEADER).append(cmdMap.get(protocol_ic.CMD_TYPE.APTQ))
+ return genStringMessage("APTQ", new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.APTQ))
.append(CMDSPLIT).append(runtime.getLocationInstance().getMCC())
.append(CMDSPLIT).append(runtime.getLocationInstance().getMNC())
.append(CMDSPLIT).append(runtime.getLocationInstance().getLAC())
* zh-cn:设备语言
* 00:第一个0:是否需要回复地址信息,0:不回复,1回复.
*/
+ String wifiInfo = ds.getWifiInfo();
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())
+ .append(TimeUtil.getShortTime())
.append(String.format("%03d", abs(ds.getSignalStrength())))
.append(ds.getGPSLocationStarNums())
.append(ds.getBattery()).append("0")
.append(ds.getLBSData()).append(CMDSPLIT)
.append(ds.getAlarmType()).append(CMDSPLIT)
.append(ds.getLanguage()).append(CMDSPLIT)
- .append("00").append(CMDSPLIT) //不回复地址
- .append(ds.getWifiInfo()).append(CMDEND).toString());
-
+ .append("00").append(TextUtils.isEmpty(wifiInfo) ? "" : CMDSPLIT) //不回复地址
+ .append(TextUtils.isEmpty(wifiInfo) ? "" : wifiInfo.replace("AP","HOME")).append(CMDEND).toString());
}
public static StringMessage AP03(Runtime ds) {
// 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,#
+ String wifiInfo = ds.getWifiInfo();
return genStringMessage(cmdMap.get(CMD_TYPE.AP01),
new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.AP01))
.append(TimeUtil.getShortDate())
.append(ds.getBattery()).append("0")
.append(ds.getProtection())
.append(ds.getWorkModeStr()).append(CMDSPLIT)
- .append(ds.getLBSData()).append(CMDSPLIT)
- .append(ds.getWifiInfo()).append(CMDEND).toString());
+ .append(ds.getLBSData()).append(TextUtils.isEmpty(wifiInfo) ? "" : CMDSPLIT)
+ .append(TextUtils.isEmpty(wifiInfo) ? "" : wifiInfo).append(CMDEND).toString());
}
.append(runtime.getHRS().getBPL()/*收缩压*/)
.append(CMDSPLIT)
.append(runtime.getHRS().getBPL()/*舒张压*/)
+ .append(CMDSPLIT)
+ .append(0.0/*腕部温度*/)
+ .append(CMDSPLIT)
+ .append(0.0/*温度*/)
+ .append(CMDSPLIT)
+ .append(0/*采集编号*/)
.append(CMDEND).toString());
}
- public String getPhoneStatus() {
+ public static String getPhoneStatus(Runtime mRuntime) {
TelephonyManager tm = (TelephonyManager) mRuntime
.getContextProxy().context.getSystemService(Context.TELEPHONY_SERVICE);
String str = "";
handleBP84(cmd, mConnection);
ICLogger.i("收到服务器白名单命令");
break;
+ case BPTQ: //天气下发
+ handleBPTQ(mConnection, mRuntime, cmd);
+ break;
case BP07:
//收到发送的语音包
handleBP07(cmd, mConnection);
ICLogger.d("收到计步目标指令..." + cmd);
handleBP98(cmd, mConnection);
break;
- case BPHT:
- ICLogger.d("服务器收到心率血压上传...");
- break;
case BP45:
ICLogger.d("收到静音开关指令--> " + cmd);
handleBP45(cmd, mConnection);
break;
+ case BP26:
+ ICLogger.d("收到了上课时间段静音的指令");
+ handleBP26(cmd, mConnection);
+ break;
+ case BP10:
+ //报警包
+ ICLogger.d("服务器收到报警包..");
+ mConnection.DeliverCMDMessageToSystem("AP10", cmd);//通知下面线程服务器收到指令
+ break;
+ case BP01: //gps定位包
+ ICLogger.i("服务器收到定位AP01");
+ mConnection.DeliverCMDMessageToSystem("AP01", cmd);//通知下面线程服务器收到指令
+ break;
+ case BPHT:
+ ICLogger.i("服务器收到上传的心率血压APHT");
+ mConnection.DeliverCMDMessageToSystem("APHT", cmd);//通知下面线程服务器收到指令
+ break;
+ case BP02:// wifi定位包
+ ICLogger.i("服务器收到定位AP02");
+ mConnection.DeliverCMDMessageToSystem("AP02", cmd);//通知下面线程服务器收到指令
+ break;
+ case BP00: //登录包
+ handleBP00(mRuntime, cmd);
+ ICLogger.i("服务器收到登录包AP00");
+ mConnection.DeliverCMDMessageToSystem("login", cmd);//通知下面线程状态变化
+ break;
+ case BP03: //心跳包
+ ICLogger.i("服务器收到心跳包AP03");
+ mConnection.DeliverCMDMessageToSystem("heartbeat", cmd);//通知下面线程状态变化
+ break;
+ }
+ }
+
+
+ public void handleBPTQ(Connection connection, Runtime runtime, String cmd) {
+ /***
+ *
+ * IWBPTQ,20-10-11,19:32:02,6674,32,27,22,30,20-10-12,19:32:02,6674,32,27,22,30,20-10-13,19:32:02,6674,32,27,22,30,53575C71533A
+ * 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天天气
+ * 如天气编号及描述对应如下(天气描述不需要发送括号内的白天晚上)
+ * 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:局部雷阵雨
+ */
+
+ ICLogger.d("BPTQ " + cmd);
+ String[] cmdlist = cmd.split(CMDSPLIT);
+ if (cmdlist.length == 23) {
+
+ StringBuilder sb = new StringBuilder();
+ StringBuilder msg = new StringBuilder();
+ 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(";");
+ }
+ String City = Util.decodeUnicode2Utf8(cmdlist[22]);
+
+ ICLogger.i(City + " \n" + sb.toString());
+
+ msg.insert(0, City + ";");
+ 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);
+
+ } else {
+ ICLogger.i(" BPTQ Format error!");
+ }
+ }
+
+
+ //处理 登录 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.enqualcomm.support I/ICSrv.protocolAPIHelper: found cmd keyid=BP00 ,keyname=BP00 , IWBP00,20191229171933,8
+
+ if (msg.length >= 3) {
+ ICLogger.d("handleBP00 Set Datetime " + msg[1]);
+ ICLogger.d("handleBP00 Set TimeZone " + msg[2]);
+
+ try {
+ Date datetime = TimeUtil.parseDatetiime(msg[1]);
+ int timezone = Integer.parseInt(msg[2]);
+ if (datetime != null) {
+ ICLogger.i("===" + TimeUtil.getDefaultTimeZone());
+ 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
+ } catch (Exception e) {
+ ICLogger.e(e.getMessage(), e);
+ }
+ } else {
+ ICLogger.d("handleBP00 format Error");
+ }
+ }
+
+
+ /**
+ * 这个指令有点特殊,做协议的有点强行解释,不承认应用的APP做错了。那就按这个功能来吧。
+ * 这里本意是上课时间段静音,所以这个就做成静音了。其实是有静音的开关接口的。
+ *
+ * @param cmd
+ * @param mConnection
+ */
+ private void handleBP26(String cmd, Connection mConnection) {
+ String[] split = cmd.split(CMD_SPLIT);
+ //IWBP26,353456789012345,080835,1,2,123|0900@1145,456|1300@1600
+ try {
+ //1为开,0 为关
+ //修改情景模式
+ AudioManager audioManager =
+ (AudioManager) mRuntime.getContextProxy()
+ .context.getSystemService(Context.AUDIO_SERVICE);
+ String trigger = split[3];
+ ICLogger.d("trigger == > " + trigger);
+ if ("1".equals(trigger)) {
+ ProfileManager.ringModel(audioManager);
+ } else {
+ ProfileManager.ringAndVibrate(audioManager);
+ }
+ //回复服务器
+// mConnection.send(
+// genStringMessage(cmdMap.get(CMD_TYPE.AP26),)
+// );
+ } catch (Exception e) {
+ e.printStackTrace();
}
}