package com.ic.protocols;
import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.text.TextUtils;
import com.enqualcomm.support.Config;
import com.enqualcomm.support.CoreService;
+import com.enqualcomm.support.IFZDCallback;
import com.enqualcomm.support.bean.Contact;
import com.enqualcomm.support.bean.HealthInfo;
import com.enqualcomm.support.bean.Runtime;
private static final boolean doEncryption = Util.getSystemProperties("persist.sys.encrypt_fzd", "true").equals("true");
public static final String defaultServerIP = "api.xcloudtech.com";
public static final int defaultServerPort = 9000;
+ private final SharedPreferences sharedPreferences;
public enum CMD_TYPE {
/*终端发起*/
private Connection mConnection = null;
private Runtime mRuntime = null;
+ public static final String FZD_SP = "fzd_sp";
+
public protocol_fzd(Connection connect, Runtime runtime) {
mConnection = connect;
mRuntime = runtime;
-
+ //创建一个sp,用于保存佰锐通讯相关的临时数据
+ sharedPreferences = runtime.getContextProxy().context.getSharedPreferences(FZD_SP, Context.MODE_PRIVATE);
}
private StringBuffer cmdbuf = new StringBuffer();
// ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf);
if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动
String data = cmdbuf.toString().replace(CMDHEADER, "").replace(cmd_msgbuf, "").replace(CMDEND, "");
-// ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdbuf.toString() + " "+cmd_msgbuf + " data "+data );
-// if (key == CMD_TYPE.TK) {
-// //如果是BP28则 后面的数据是音频,需要保留
-// byte[] amrBuf;
-// int amrLen = getBP28Amrlen(cmdlist[i] );
-// if (bytes.length > amrLen) {
-// handleCmd(key, cmdlist[i], bytes);
-// }
-// } else {
if (data.startsWith(CMDSPLIT)) data = data.substring(1);
handleCmd(key, cmd_msgbuf, data);
cmdbuf.delete(0, cmdbuf.length());//处理后清空
}
+ /**
+ * [IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数]
+ * 实例:[IC*334588000000156*0014*KA,120414,50,100,100]
+ *
+ * @param runtime
+ * @return
+ */
public static StringMessage KA(Runtime runtime) {
-//[IC*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数] 实例:[IC*334588000000156*0014*KA,120414,50,100,100]
StringBuilder sb = new StringBuilder();
String cmd = cmdMap.get(CMD_TYPE.KA);
sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
}
+ /**
+ * 上课禁用时间段设置 2
+ * size 60 [IC*860314001000466*0022*SILENCETIME2,10:03-16:00-1-0111110]
+ * IC*860314001000466*0022*SILENCETIME2 10:03-16:00-1-0111110
+ * 平台发送:
+ * [IC*YYYYYYYYYYYYYYY*LEN*SILENCETIME2,时间段-开关-自定义日期,时间段-开关-自定义日期,时 间段-开关-自定义日期]
+ * 实
+ * 例 :[IC*334588000000156*0038*SILENCETIME2,7:30-21:10-1-0111110,7:30-21:10-1-0111110,7:30-21:10-0-0111110]
+ * 终端回复:
+ * [IC*YYYYYYYYYYYYYYY*LEN*SILENCETIME2]
+ * 实例:[IC*334588000000156*000C*SILENCETIME2]
+ * 说明:
+ * 设置上课禁用时间段范围,拦截终端的任何来电。格式为“起始时间-结束时间-自定义星期几”, 比如上面的 7:30-21:00-0111110,则表示周一到周五 7:30 到 21:00 之间上课禁用生效,起始时间默认大于结束时间。
+ * 总开关:0 为关,1 为开
+ * 关于自定义星期几的规则:最左边是周日,最右边是周六,即 0111110 的顺序是:周日,周一,周二,周三,周四,周五,周六(1 为打开,0 为关闭),所以上面的意思是周一至周五打开上课禁用。
+ */
public void handleSILENCETIME2(Connection connection, Runtime runtime, String cmd, String data) {
- /**
- * 上课禁用时间段设置 2
- *size 60 [IC*860314001000466*0022*SILENCETIME2,10:03-16:00-1-0111110]
- * IC*860314001000466*0022*SILENCETIME2 10:03-16:00-1-0111110
- * 平台发送:
- * [IC*YYYYYYYYYYYYYYY*LEN*SILENCETIME2,时间段-开关-自定义日期,时间段-开关-自定义日期,时 间段-开关-自定义日期]
- * 实
- * 例 :[IC*334588000000156*0038*SILENCETIME2,7:30-21:10-1-0111110,7:30-21:10-1-0111110,7:30-21:10-0-0111110]
- * 终端回复:
- * [IC*YYYYYYYYYYYYYYY*LEN*SILENCETIME2]
- * 实例:[IC*334588000000156*000C*SILENCETIME2]
- * 说明:
- * 设置上课禁用时间段范围,拦截终端的任何来电。格式为“起始时间-结束时间-自定义星期几”, 比如上面的 7:30-21:00-0111110,则表示周一到周五 7:30 到 21:00 之间上课禁用生效,起始时间默认大于结束时间。
- * 总开关:0 为关,1 为开
- * 关于自定义星期几的规则:最左边是周日,最右边是周六,即 0111110 的顺序是:周日,周一,周二,周三,周四,周五,周六(1 为打开,0 为关闭),所以上面的意思是周一至周五打开上课禁用。
- */
connection.send(SILENCETIME2(runtime));
String[] silent_items = data.split(",");
ArrayList<Silent> slist = new ArrayList<>();
return genFZDCMD(cmdMap.get(CMD_TYPE.LGZONE));
}
+ /***
+ * 平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期]
+ * 实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12]
+ */
public void handleLGZONE(Runtime runtime, String data) {
-
- /***
- * 平台回复:[XT*YYYYYYYYYYYYYYY*LEN*LGZONE,时区,时间,日期]
- * 实例: [XT*1234567890*001D*LGZONE,+8,08:00:00,2016-01-12]
- */
String[] list = data.split(CMDSPLIT);
if (list.length == 3) {
String timeZone = list[0].trim();
/*LBS+GPS混合定位*/
- public static StringMessage UD(Runtime runtime) {
- /***
- * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95
- * 29,21242,124,9529,21151,120,9529,63556,119,0]
- * 说明:
- * 数据内容:
- * UD,命令号
- * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号
- *
- * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效
- * 22.570733,纬度
- * N,纬度表示113.8626083,经度
- * E,经度表示0.00,速度
- * 249.5,方向
- * 0.0,海拔
- * 6,卫星个数
- *
- * 100,gsm 信号强度
- * 60,电量
- * 0,计步数
- * 0,翻转次数
- * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000
- * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。
- * 7,基站个数
- * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,
- * 21151,120,9529,63556,119,基站信息
- * 0,WiFi 个数
- *
- */
-
+ /***
+ * [IC*334588000000156*00CD*UD,180916,025723,A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6,100, 60,0,0,00000010,7,255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,95
+ * 29,21242,124,9529,21151,120,9529,63556,119,0]
+ * 说明:
+ * 数据内容:
+ * UD,命令号
+ * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号
+ *
+ * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效
+ * 22.570733,纬度
+ * N,纬度表示113.8626083,经度
+ * E,经度表示0.00,速度
+ * 249.5,方向
+ * 0.0,海拔
+ * 6,卫星个数
+ *
+ * 100,gsm 信号强度
+ * 60,电量
+ * 0,计步数
+ * 0,翻转次数
+ * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000
+ * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。
+ * 7,基站个数
+ * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,
+ * 21151,120,9529,63556,119,基站信息
+ * 0,WiFi 个数
+ *
+ */
+ public static StringMessage UD(Runtime runtime) {
StringBuilder sb = new StringBuilder();
String cmd = cmdMap.get(CMD_TYPE.UD);
sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
return genFZDCMD(cmd, sb.toString());
}
-
- /*LBS+WiFi混合定位*/
- public static String UD2(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;
- }
-
- ICLogger.i("Wifi ap sum " + apsum);
- return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).append(CMDSPLIT)
- .append(ds.getLanguage()).append(CMDSPLIT)
- .append(0).append(CMDSPLIT) //为0时不回复地址
- .append(ds.getLBSMultiStationData()).append(CMDSPLIT) //基站信息数据
- .append(apsum).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString(); //wifi信息数据
- }
-
- //处理 定位 BP01
- public void handleUD2(String cmd) {
- log("BP02定位接收成功");
- }
-
-
+ /***
+ * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9
+ * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4]
+ * 平台回复:
+ * [IC*YYYYYYYYYYYYYYY*LEN*AL]
+ * 实例:[IC*334588000000156*0002*AL]
+ * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.
+ */
public static StringMessage AL(Runtime runtime) {
- /***
- * [IC*334588000000156*00CD*AL,180916,064153,A,22.570512,N,113.8623267,E,0.00,154.8,0.0,11,10 0,100,0,0,00100018,7,0,460,1,9529,21809,155,9529,21242,132,9529,21405,131,9529,63554,131,9
- * 529,63555,130,9529,63556,118,9529,21869,116,0,12.4]
- * 平台回复:
- * [IC*YYYYYYYYYYYYYYY*LEN*AL]
- * 实例:[IC*334588000000156*0002*AL]
- * 说明:终端产生警情后发送报警信息到平台,若终端没有收到回复,则定时上报直到收到报警确认为止.
- */
-
StringBuilder sb = new StringBuilder();
String cmd = cmdMap.get(CMD_TYPE.AL);
sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)
}
public void handleWdstart(Connection connection, Runtime runtime, String data) {
-
connection.send(wdstart());
try {
int freq = Integer.parseInt(data);
-
-
Config.setTemperatureTestCycle(runtime, freq);
CoreService.getInstance().setTempAlarm(true);
-
- //if (runtime.check_stat_do_temp_test())
- // TemperatureUtil.getInstance().doTempTestInThread(FROM_SERVER);
} catch (Exception e) {
ICLogger.e(e.getMessage(), e);
}
-//
-// double wrist_temp,body_temp;
-// wrist_temp= TemperatureUtil.get_temp_value_adjusted();
-// body_temp=TemperatureUtil.getBodyTemp(wrist_temp,26.0f);
-// String temperatureMsg=temp(body_temp);
-// connection.send(genStringMessage("temp",temperatureMsg));
}
public static StringMessage hrtstart() {
return genFZDCMD(cmdMap.get(CMD_TYPE.PHL));
}
+ /***
+ * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节
+ * 号码:ascii 字符 名字:Unicode 编码
+ * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。
+ * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]
+ * 5F204E09--->张三,是使用 unicode 编码
+ * 终端回复:[IC*334588000000156*0003*PHL]
+ */
public void handlePHL(Connection connection, Runtime runtime, String cmd, String data) {
- /***
- * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节
- * 号码:ascii 字符 名字:Unicode 编码
- * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。
- * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]
- * 5F204E09--->张三,是使用 unicode 编码
- * 终端回复:[IC*334588000000156*0003*PHL]
- */
-
String list[] = data.split(CMDSPLIT);
int listlen = list.length;
boolean ispared = ((listlen >= 0) && (listlen % 2 == 0));
}
public boolean handleCmd(CMD_TYPE type, String cmd, String data) {
-
//普通非二进制命令用此函数处理
boolean ret = true;
ICLogger.i("handleCmd " + type.name() + " strLen=" + data.length());
ICLogger.i("收到本设备的佰锐Id == > " + data);
//保存一份到sp里
//通知一callback
+ handleBRREG(mRuntime, data);
break;
case MEMBERS:
ICLogger.i("收到群成员数据 ==> " + data);
}
+
+ private static final String BRREG_ID = "brreg_id";
+
+ /**
+ * 处理佰锐ID结果
+ *
+ * @param runtime
+ * @param data
+ */
+ private void handleBRREG(Runtime runtime, String data) {
+ IFZDCallback fzdCallback = runtime.getFZDCallback();
+ if (fzdCallback == null) {
+ return;
+ }
+ try {
+ if (TextUtils.isEmpty(data)) {
+ ICLogger.i("佰锐ID为空...");
+ fzdCallback.onBRIdEmpty();
+ } else {
+ fzdCallback.onBRIdLoaded(data);
+ }
+ //保存到sp里面
+ sharedPreferences.edit().putString(BRREG_ID, data).apply();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
/**
* 有通话请求
* 注:终端一旦收到该请求,则需要确保音视频 sdk 处于连接状态的,如果未登陆,要登陆后回复服 务端,
private void handleCallRequest(Connection mConnection, Runtime mRuntime, String data) {
//TODO:
//需要回复平台结果
+
}
/**