return sb.toString();\r
}\r
\r
+ public String getFZDGPSData(){\r
+\r
+/***\r
+ * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6\r
+ * A,gps 定位有效\r
+ * 22.570733,纬度 N,\r
+ * 113.8626083,经度 E,\r
+ * 0.00,速度\r
+ * 249.5,方向\r
+ * 0.0,海拔\r
+ * 6,卫星个数\r
+ */\r
+ StringBuilder sb=new StringBuilder();\r
+ int speedi=(int)gpsp.getLocation().speed;\r
+ int speedl=(int) ((gpsp.getLocation().speed - speedi)*100);\r
+ String latStr=gpsp.getLocation().latGPSStr;\r
+ String lonStr=gpsp.getLocation().lonGPSStr;\r
+ String heading=String.valueOf(gpsp.getLocation().heading);\r
+ int starcount=gpsp.getLocation().used_gps_numbs;\r
+ if (isGPSFixed())\r
+ {\r
+ String gpsStr = String.format(",%s,N,%s,E,%d.%02d,%s,0.0,%d", latStr, lonStr, speedi, speedl,heading,starcount);\r
+ sb.append("A").append(gpsStr);\r
+\r
+ }else{\r
+ String gpsStr=String.format(",0.000,N,0.000,E,0.0,0.0,0.0,0");\r
+ sb.append("V").append(gpsStr);\r
+ }\r
+\r
+\r
+ return sb.toString();\r
+ }\r
+\r
+ public String getFZDDevStatus(){\r
+ return "00000000";\r
+ }\r
public String getGPSHeading(){\r
int headingi=(int)gpsp.getLocation().heading;\r
int headingl=(int) ((gpsp.getLocation().heading - headingi)*100);\r
String gpsStr=String.format("%03d.%02d",headingi,headingl);\r
return gpsStr;\r
}\r
+ public String getFZDLBSMultiStationData(){\r
+ return mFZDLBSMultiStationData;\r
+ }\r
+\r
+ public String getFZDWifiData(){\r
\r
+ int apsum=0;\r
+ String wifiinfo=getWifiInfo();\r
+ if (!wifiinfo.isEmpty()) {\r
+ String[] list = wifiinfo.split("&");\r
+ apsum = list.length;\r
+ }\r
+ StringBuffer sb=new StringBuffer();\r
+ if (apsum==0){\r
+ sb.append(apsum);\r
+ }else{\r
+ sb.append(apsum).append(",");\r
+ wifiinfo=wifiinfo.replace("&",",").replace("|",",");\r
+ sb.append(wifiinfo);\r
+ }\r
+ return sb.toString();\r
+ }\r
private static String mLBSMultiStationData="";\r
public void setLBSMultiStationData(String data){\r
mLBSMultiStationData=data;\r
}\r
+\r
+ private static String mFZDLBSMultiStationData="";\r
+ public void setFZDLBSMultiStationData(String data){\r
+ mFZDLBSMultiStationData=data;\r
+ }\r
//AP03 用的多基站定位数据\r
public String getLBSMultiStationData(){\r
// 7: 表示共有7组基站\r
return null;\r
} else {\r
StringBuilder gsmSb = new StringBuilder(mccmnc);\r
+ gsmSb.insert(3, ",");\r
\r
StringBuilder cdmaSB = new StringBuilder();\r
- gsmSb.insert(3, ",");\r
runtime.setMccAndMnc(gsmSb.toString());\r
+\r
if (celllocation instanceof GsmCellLocation) {\r
GsmCellLocation gsmCell = (GsmCellLocation)celllocation;\r
runtime.setCdmaInfo(null);\r
-\r
-\r
//AP01 Single GSM Station\r
gsmSb.append(",");\r
gsmSb.append(gsmCell.getLac());\r
List neighboringCell_list = telephonyManager.getNeighboringCellInfo();\r
//AP02 Multi GSM Station\r
StringBuilder gsmSbMulti = new StringBuilder();\r
- int size=1;\r
+\r
+ StringBuilder gsmSbMultiFZD = new StringBuilder();\r
+\r
+ int size=1;\r
if (neighboringCell_list != null && !neighboringCell_list.isEmpty())\r
size +=neighboringCell_list.size();\r
StringBuilder mmcmnc1 = new StringBuilder(mccmnc);\r
gsmSbMulti.append(gsmCell.getCid());\r
gsmSbMulti.append("|");\r
gsmSbMulti.append(150-Math.abs(getSignal(telephonyManager,runtime)));\r
- if (neighboringCell_list != null && !neighboringCell_list.isEmpty()) {\r
+\r
+\r
+ gsmSbMultiFZD.append(size);\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append(1);\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append(mmcmnc1);\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append(gsmCell.getLac());\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append(gsmCell.getCid());\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append(150-Math.abs(getSignal(telephonyManager,runtime)));\r
+\r
+ if (neighboringCell_list != null && !neighboringCell_list.isEmpty()) {\r
sortByRssi(neighboringCell_list);\r
\r
Iterator cell = neighboringCell_list.iterator();\r
gsmSbMulti.append(mNeighboringCellInfo.getCid());\r
gsmSbMulti.append("|");\r
gsmSbMulti.append( 150-Math.abs(mNeighboringCellInfo.getRssi()));\r
+\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append(mNeighboringCellInfo.getLac());\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append(mNeighboringCellInfo.getCid());\r
+ gsmSbMultiFZD.append(",");\r
+ gsmSbMultiFZD.append( 150-Math.abs(mNeighboringCellInfo.getRssi()));\r
+\r
maxstationCount ++;\r
if (maxstationCount == 5) {\r
// break;\r
}\r
}\r
ICLogger.i("LBS GsmCellLocation MultiStation "+ gsmSbMulti.toString());\r
- if (Config.LOG_TOFILE) ICLogger.logToFile("LBS", gsmSbMulti.toString());\r
+ ICLogger.i("FZD LBS GsmCellLocation MultiStation "+ gsmSbMultiFZD.toString());\r
+ if (Config.LOG_TOFILE) ICLogger.logToFile("LBS", "LBS GsmCellLocation MultiStation "+ gsmSbMulti.toString());\r
+ if (Config.LOG_TOFILE) ICLogger.logToFile("LBS", "FZD LBS GsmCellLocation MultiStation "+ gsmSbMultiFZD.toString());\r
\r
- runtime.setLBSMultiStationData(gsmSbMulti.toString());\r
+ runtime.setLBSMultiStationData(gsmSbMulti.toString());\r
+ runtime.setFZDLBSMultiStationData(gsmSbMultiFZD.toString());\r
\r
return gsmSb.toString();\r
} else if (celllocation instanceof CdmaCellLocation) {\r
private static final String CMDHEADERSPLIT = "*";\r
private static final String CMDSPLIT = ",";\r
\r
- public static final String defaultServerIP="fzd.xcloudtech.com";\r
+ public static final String defaultServerIP="api.xcloudtech.com";\r
public static final int defaultServerPort=9000;\r
\r
public enum CMD_TYPE {\r
FIND,//找手表指令\r
REMIND,//闹钟设置指令\r
TK,//对讲功能(微聊发送语音)\r
+ PHL,//设置电话本+白名单(最多 50 条)\r
UNKNOWN_CMD,\r
}\r
\r
cmdMap.put(CMD_TYPE.FIND, "FIND");\r
cmdMap.put(CMD_TYPE.REMIND, "REMIND");\r
cmdMap.put(CMD_TYPE.TK, "TK");\r
+ cmdMap.put(CMD_TYPE.PHL, "PHL");\r
}\r
\r
private NettyConnection mConnection=null;\r
否则返回 空字符串\r
*/\r
public static String isCmdStr(String msg) {\r
- if (regexUtil.isFZDCMD(msg)) {\r
+ String cmd_msgbuf=msg;\r
+ int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
+ if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
+ String cmd=cmd_msgbuf.substring(cmdindex);\r
+ cmd_msgbuf=cmd;\r
+ }\r
+ cmdindex=cmd_msgbuf.indexOf(CMDEND);\r
+ if(cmdindex>0){\r
+ String cmd=cmd_msgbuf.substring(0,cmdindex);\r
+ cmd_msgbuf=cmd;\r
+ }\r
+ cmdindex=cmd_msgbuf.indexOf(CMDSPLIT);\r
+ if(cmdindex>0){\r
+ String cmd=cmd_msgbuf.substring(0,cmdindex);\r
+ cmd_msgbuf=cmd;\r
+ }\r
+\r
+ if (regexUtil.isFZDCMD(cmd_msgbuf)) {\r
for (CMD_TYPE key : cmdMap.keySet()) {\r
- if (regexUtil.isFZDCMD(cmdMap.get(key), msg)) { //如果是FZD命令,则进行处理,否则保留数据动\r
+ if (regexUtil.isFZDCMD(cmdMap.get(key), cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key));\r
return cmdMap.get(key);\r
}\r
log("bytes.size "+bytes.length);\r
cmdbuf.append(cmd_msgbuf);\r
log("cmdbuf.size "+cmdbuf.length() +" "+cmdbuf.toString());\r
- int cmdindex =cmd_msgbuf.indexOf(CMDHEADER+CMDCOMPANY+CMDHEADERSPLIT);\r
+ int cmdindex =cmd_msgbuf.indexOf(CMDCOMPANY+CMDHEADERSPLIT);\r
if (cmdindex>0) { //如果开头不是CMDHEADER但是包含CMDHEADER则删除前面的数据\r
String cmd=cmd_msgbuf.substring(cmdindex);\r
cmd_msgbuf=cmd;\r
for (CMD_TYPE key : cmdMap.keySet()) {\r
// ICLogger.i("key "+cmdMap.get(key)+" cmdbuf "+cmd_msgbuf);\r
if (regexUtil.isFZDCMD(cmdMap.get(key),cmd_msgbuf)) { //如果是FZD命令,则进行处理,否则保留数据动\r
- String data=cmdbuf.toString().replace(cmd_msgbuf,"").replace(CMDEND,"");\r
- ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdbuf.toString() + " "+cmd_msgbuf + " data "+data );\r
+ String data=cmdbuf.toString().replace(CMDHEADER,"").replace(cmd_msgbuf,"").replace(CMDEND,"");\r
+// ICLogger.i("found cmd keyid=" + key + " ,keyname=" + cmdMap.get(key) + " , " + cmdbuf.toString() + " "+cmd_msgbuf + " data "+data );\r
// if (key == CMD_TYPE.TK) {\r
// //如果是BP28则 后面的数据是音频,需要保留\r
// byte[] amrBuf;\r
// handleCmd(key, cmdlist[i], bytes);\r
// }\r
// } else {\r
-\r
-\r
- handleCmd(key, data);\r
+ handleCmd(key, cmd_msgbuf,data);\r
cmdbuf.delete(0,cmdbuf.length());//处理后清空\r
// }\r
}\r
}\r
\r
\r
+ public void handleKA(Runtime runtime,String data){\r
\r
+ }\r
\r
/*LBS+GPS混合定位*/\r
- public static String AP01(Runtime ds) {\r
- //示例数据:IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,\r
- // 460,0,9520,3671,\r
- // 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#\r
-// IWAP01191230A2232.9807N11404.9355E000.1161320000.0006000910000000,460,00,9520,3671,#\r
- return new StringBuffer(CMDHEADER).append(cmdMap.get(CMD_TYPE.LK)).append(TimeUtil.getShortDate())\r
- .append(ds.getGPSData()).append(TimeUtil.getShortTime()).append(ds.getGPSHeading()).append(String.format("%03d",abs(ds.getSignalStrength())))\r
- .append(ds.getGPSLocationStarNums()).append(ds.getBattery()).append("0")\r
- .append(ds.getProtection()).append(ds.getWorkModeStr()).append(CMDSPLIT)\r
- .append(ds.getLBSData()).append(CMDSPLIT).append(ds.getWifiInfo()).append(CMDEND).toString();\r
- }\r
+ public static String UD(Runtime runtime) {\r
+ /***\r
+ * [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\r
+ * 29,21242,124,9529,21151,120,9529,63556,119,0]\r
+ * 说明:\r
+ * 数据内容:\r
+ * UD,命令号\r
+ * 180916,日期(年月日)(0 时区),表示 0 时区的二零一八年九月十六号\r
+ *\r
+ * 025723,时间(时分秒)(0 时区),表示 0 时区的两点五十七分二十三秒A,gps 定位有效\r
+ * 22.570733,纬度\r
+ * N,纬度表示113.8626083,经度\r
+ * E,经度表示0.00,速度\r
+ * 249.5,方向\r
+ * 0.0,海拔\r
+ * 6,卫星个数\r
+ *\r
+ * 100,gsm 信号强度\r
+ * 60,电量\r
+ * 0,计步数\r
+ * 0,翻转次数\r
+ * 00000010,终端状态,数据为 16 进制,解析成二进制为 0000 0000 0000 0000 0000 0000 0001 0000\r
+ * 前面 4 个字节表示状态,后面 4 个字节表示报警,数据中第 4 位为 1,对照文档最后的数据解析,表示手表静止状态。详细可参看文档最后部分。\r
+ * 7,基站个数\r
+ * 255,460,1,9529,21809,158,9529,63555,133,9529,63554,129,9529,21405,126,9529,21242,124,9529,\r
+ * 21151,120,9529,63556,119,基站信息\r
+ * 0,WiFi 个数\r
+ *\r
+ */\r
\r
- //处理 定位 BP01\r
- public void handleBP01(String cmd){\r
- log("BP01定位接收成功");\r
- }\r
\r
+ StringBuilder sb=new StringBuilder();\r
+ String cmd=cmdMap.get(CMD_TYPE.UD);\r
+ sb.append(TimeUtil.getSystemDateYYMMDD()).append(CMDSPLIT)\r
+ .append(TimeUtil.getSystemTimeHHmmss()).append(CMDSPLIT)\r
+ .append(runtime.getFZDGPSData()).append(CMDSPLIT)\r
+ .append(String.format("%03d",abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
+ .append(runtime.getBattery()).append(CMDSPLIT)\r
+ .append(runtime.getTotalStepCount()).append(CMDSPLIT)\r
+ .append(runtime.getRolltimes()).append(CMDSPLIT)\r
+ .append(runtime.getFZDDevStatus()).append(CMDSPLIT)\r
+ .append(runtime.getFZDLBSMultiStationData()).append(CMDSPLIT)\r
+ .append(runtime.getFZDWifiData());\r
+\r
+ return genFZDCMD(cmd,sb.toString());\r
+ }\r
\r
\r
/*LBS+WiFi混合定位*/\r
- public static String AP02(Runtime ds) {\r
+ public static String UD2(Runtime ds) {\r
//示例数据:IWAP02,\r
// zh_cn,\r
// 0,\r
}\r
\r
//处理 定位 BP01\r
- public void handleBP02(String cmd){\r
+ public void handleUD2(String cmd){\r
log("BP02定位接收成功");\r
}\r
\r
\r
+ public static String UPLOAD(){\r
+\r
+ return new StringBuffer("").toString();\r
+ }\r
+\r
+ public void handleUPLOAD(Connection connection,Runtime runtime,String cmd,String data){\r
+\r
+ }\r
+\r
+ public static String PHL(){\r
+ return genFZDCMD(cmdMap.get(CMD_TYPE.PHL));\r
+ }\r
\r
+ public void handlePHL(Connection connection,Runtime runtime,String cmd,String data){\r
+ /***\r
+ * [IC*334588000000156*len*PHL,号码,名字,号码,名字,号码,名字,号码,名字,号码,名字] len:发送长度 16 进制表示 占用 2 个字节\r
+ * 号码:ascii 字符 名字:Unicode 编码\r
+ * 该接口融合了白名单和电话本的功能,最多对应 50 组号码与名字,号码不超过 20 个 ascii 字符, 姓名不超过 10 个 Unicode 字符。\r
+ * 示 例 : [IC*334588000000156*0010*PHL,110,5F204E09]\r
+ * 5F204E09--->张三,是使用 unicode 编码\r
+ * 终端回复:[IC*334588000000156*0003*PHL]\r
+ */\r
+ StringBuilder tmp=new StringBuilder(data);\r
+ if (tmp.toString().startsWith(CMDSPLIT)) tmp.deleteCharAt(0);\r
+ String list[]=tmp.toString().split(CMDSPLIT);\r
+ int listlen=list.length;\r
+ boolean ispared= (( listlen >0) && (listlen%2 == 0));\r
+ if (ispared){\r
+ ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+ for(int i=0; i<listlen;i+=2){\r
+ String phonem=list[i];\r
+ String name = Util.decodeUnicode2Utf8(list[i+1]);\r
+ ICLogger.i(i/2 +" 姓名 "+name+", 电话 "+phonem);\r
+ contactArray.add(new Contact(Contact.CATEGORY_CALL,name,phonem));\r
+ }\r
+// contactArray.add(new Contact(Contact.CATEGORY_GROUP,"All","666"));\r
+// contactArray.add(new Contact(Contact.CATEGORY_PARTNER,"PARTNER","666"));\r
+// contactArray.add(new Contact(Contact.CATEGORY_CARE,"CARE","666"));\r
+// contactArray.add(new Contact(Contact.CATEGORY_VOLTE,"VOLTE","666"));\r
+\r
+ runtime.getDbHelper().saveContacts(contactArray,false,false,true,false,false,false);\r
+ }else{\r
+ ICLogger.i("没有电话本!执行清除操作!");\r
+ }\r
+ connection.send(genStringMessage("PHL",PHL()));\r
+ }\r
\r
public void sendBroadcast(String cmd, Runtime dev) {\r
\r
dev.getContextProxy().context.startActivity(intent);\r
}\r
\r
- public boolean handleCmd(CMD_TYPE type, String cmd) {\r
+ public boolean handleCmd(CMD_TYPE type, String cmd , String data) {\r
\r
//普通非二进制命令用此函数处理\r
boolean ret=true;\r
ICLogger.i("handleCmd "+type.name() + " strLen="+cmd.length());\r
- if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd);\r
+ if (Config.LOG_TOFILE)ICLogger.logToFile("APILog", " recv " + cmd +" "+ data);\r
switch (type){\r
case LK: //登录包\r
ICLogger.i("服务器收到登录包LK");\r
mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
break;\r
case KA:\r
-// handleBP03(cmd);\r
ICLogger.i("服务器收到心跳包KA");\r
mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
break;\r
handlePing(mRuntime,cmd);\r
ICLogger.i("服务器返回Ping绑定信息");\r
break;\r
-// case BP00: //登录包\r
-// handleBP00(mRuntime,cmd);\r
-// ICLogger.i("服务器收到登录包AP00");\r
-// mConnection.DeliverCMDMessageToSystem("login",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BP01: //gps定位包\r
-// handleBP01(cmd);\r
-// ICLogger.i("服务器收到定位AP01");\r
-// mConnection.DeliverCMDMessageToSystem("AP01",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BP02:// wifi定位包\r
-// handleBP02(cmd);\r
-// ICLogger.i("服务器收到定位AP02");\r
-// mConnection.DeliverCMDMessageToSystem("AP02",cmd);//通知下面线程状态变化\r
-// break;\r
-// case BP03: //心跳包\r
-// handleBP03(cmd);\r
-// ICLogger.i("服务器收到心跳包AP03");\r
-// mConnection.DeliverCMDMessageToSystem("heartbeat",cmd);//通知下面线程状态变化\r
-// break;\r
-//\r
+ case CR:\r
+ //立即定位指令(长链接有效)\r
+ //handleBP16(mConnection,mRuntime,cmd);\r
+ mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
+ break;\r
+\r
// case BP07:\r
// //收到发送的语音包\r
// handleBP07(cmd,mConnection);\r
// handleBP34(mConnection,mRuntime,cmd);\r
// mConnection.DeliverCMDMessageToSystem("setWorkMod",cmd);//通知下面线程状态变化\r
// break;\r
-// case BP16:\r
-// //立即定位指令(长链接有效)\r
-// handleBP16(mConnection,mRuntime,cmd);\r
-// mConnection.DeliverCMDMessageToSystem("StartLocate",cmd);//通知下面线程状态变化\r
-// break;\r
//\r
//// case BP05: //L02服务器不适用\r
//// //查询服务器语音 返回信息\r
// handleBP12(mConnection,cmd,mRuntime);\r
// ICLogger.i("收到服务器设置SOS号码命令BP12");\r
// break;\r
-// case BP14:\r
-// //收到设置白名单号码\r
-// handleBP14(mConnection,cmd,mRuntime);\r
-// ICLogger.i("收到服务器设置白名单号码命令BP14");\r
-// break;\r
+ case PHL:\r
+ //收到设置白名单号码\r
+ ICLogger.i("收到服务器设置白名单号码命令BP14");\r
+ handlePHL(mConnection,mRuntime,cmd,data);\r
+ break;\r
// case BP15:\r
// handleBP15(cmd,mConnection,mRuntime);\r
// ICLogger.i("收到服务器设置定位命令BP15");\r