import java.util.ArrayList;\r
\r
public class StringMessage {\r
- //暂时未用\r
- ArrayList<byte[]> bs;\r
-\r
- //目前作为消息主体,除了mqtt协议还需要一个topic(fragments[0]) , 其他协议就是要发送的内容本身。\r
- private String cache;\r
-\r
- //数据库中的index\r
- private int index=-1;\r
-\r
- //命令日期\r
- private String date=null;\r
-\r
- //命令时间\r
- private String time=null;\r
- //mqtt协议中第一条就是 topic,其他协议中就是cmdname或者无用\r
- protected String[] fragments;\r
-\r
- //发送标志(表示已经接收到服务器返回消息) , 0 未发送, 1 发送等回复, 2 已回复\r
- private int sentFlag;\r
-\r
- //除mqtt协议可以使用\r
- public StringMessage(String paramString) {\r
- this.cache = paramString;\r
- this.sentFlag = 0;\r
- }\r
-\r
- public String getDate(){\r
- return date;\r
- }\r
-\r
- public String getTime(){\r
- return time;\r
- }\r
-\r
- public int getIndex(){\r
- return index;\r
- }\r
-\r
- public void setIndex(int i){\r
- index=i;\r
- }\r
-\r
- public void setDate(String date1,String time1){\r
- date=date1;\r
- time=time1;\r
- }\r
- //mqtt协议使用 设置topic\r
- public StringMessage(String[] paramArrayOfString) { this(paramArrayOfString, 0); }\r
-\r
-\r
- //暂时未用,二进制数据备用\r
- public StringMessage(String[] paramArrayOfString, ArrayList<byte[]> paramArrayList) {\r
- this.fragments = paramArrayOfString;\r
- this.bs = paramArrayList;\r
- this.sentFlag=0;\r
- }\r
-\r
- //mqtt协议使用,设置topic 以及 发送标志\r
- public StringMessage(String[] paramArrayOfString, int paramBoolean) {\r
- this.fragments = paramArrayOfString;\r
- this.sentFlag = paramBoolean;\r
- }\r
-\r
- //设置发送flag\r
- public void setSentFlag(int f){\r
- sentFlag=f;\r
- }\r
-\r
- //获取发送flag\r
- public int haveSent(){\r
- return sentFlag;\r
- }\r
-\r
- //未用\r
- public String[] all() { return this.fragments; }\r
-\r
- //获取topic内容\r
- public String cmd() { return this.fragments[0]; }\r
-\r
- //获取协议消息主体内容\r
- public String isFromCache() { return this.cache; }\r
-\r
- //更新协议消息主体内容\r
- public void refresh(String paramString) { this.cache = paramString; }\r
-\r
- //未用\r
- public int size() { return (this.fragments != null) ? this.fragments.length : 0; }\r
-\r
- //未用\r
- public ArrayList<byte[]> source() { return this.bs; }\r
+ //暂时未用\r
+ ArrayList<byte[]> bs;\r
+\r
+ //目前作为消息主体,除了mqtt协议还需要一个topic(fragments[0]) , 其他协议就是要发送的内容本身。\r
+ private String cache;\r
+\r
+ //数据库中的index\r
+ private int index = -1;\r
+\r
+ //命令日期\r
+ private String date = null;\r
+\r
+ //命令时间\r
+ private String time = null;\r
+ //mqtt协议中第一条就是 topic,其他协议中就是cmdname或者无用\r
+ protected String[] fragments;\r
+\r
+ //发送标志(表示已经接收到服务器返回消息) , 0 未发送, 1 发送等回复, 2 已回复\r
+ private int sentFlag;\r
+\r
+ //除mqtt协议可以使用\r
+ public StringMessage(String paramString) {\r
+ this.cache = paramString;\r
+ this.sentFlag = 0;\r
+ }\r
+\r
+ public String getDate() {\r
+ return date;\r
+ }\r
+\r
+ public String getTime() {\r
+ return time;\r
+ }\r
+\r
+ public int getIndex() {\r
+ return index;\r
+ }\r
+\r
+ public void setIndex(int i) {\r
+ index = i;\r
+ }\r
+\r
+ public void setDate(String date1, String time1) {\r
+ date = date1;\r
+ time = time1;\r
+ }\r
+\r
+ //mqtt协议使用 设置topic\r
+ public StringMessage(String[] paramArrayOfString) {\r
+ this(paramArrayOfString, 0);\r
+ }\r
+\r
+\r
+ //暂时未用,二进制数据备用\r
+ public StringMessage(String[] paramArrayOfString, ArrayList<byte[]> paramArrayList) {\r
+ this.fragments = paramArrayOfString;\r
+ this.bs = paramArrayList;\r
+ this.sentFlag = 0;\r
+ }\r
+\r
+ //mqtt协议使用,设置topic 以及 发送标志\r
+ public StringMessage(String[] paramArrayOfString, int paramBoolean) {\r
+ this.fragments = paramArrayOfString;\r
+ this.sentFlag = paramBoolean;\r
+ }\r
+\r
+ //设置发送flag\r
+ public void setSentFlag(int f) {\r
+ sentFlag = f;\r
+ }\r
+\r
+ //获取发送flag\r
+ public int haveSent() {\r
+ return sentFlag;\r
+ }\r
+\r
+ //未用\r
+ public String[] all() {\r
+ return this.fragments;\r
+ }\r
+\r
+ //获取topic内容\r
+ public String cmd() {\r
+ return this.fragments[0];\r
+ }\r
+\r
+ //获取协议消息主体内容\r
+ public String isFromCache() {\r
+ return this.cache;\r
+ }\r
+\r
+ //更新协议消息主体内容\r
+ public void refresh(String paramString) {\r
+ this.cache = paramString;\r
+ }\r
+\r
+ //未用\r
+ public int size() {\r
+ return (this.fragments != null) ? this.fragments.length : 0;\r
+ }\r
+\r
+ //未用\r
+ public ArrayList<byte[]> source() {\r
+ return this.bs;\r
+ }\r
}\r
\r
return (int) ((duration / 1000) + 1);
}
+ /**
+ * 发送图片的功能
+ * 当终端收到 rcapture 指令后,触发拍照功能并执行上传 img 指令。
+ * 终端发送:[XT*334588000000156*len*img,x,y,z] 参数 x 为 5:远程拍照。参数 x 为 6:主动拍照(将在聊天消息里展现)。
+ * 参数 y 表示 :时间(年月日时分秒:160429110950)
+ * 参数 z 为照片内容 图片数据遇到以下左边的数据需转译成右边的数据
+ * 0X7D --> 0X7D 0X01
+ * 0X5B --> 0X7D 0X02
+ * 0X5D --> 0X7D 0X03
+ * 0X2C --> 0X7D 0X04
+ * 0X2A --> 0X7D 0X05
+ * 注:后面的微聊和语音指令包一样,对数据内容作相应转码处理
+ * 平台回复: [XT*334588000000156*0003*img]
+ *
+ * @param remoteNum 远程ID,如果是聊天的话,可能可以用得上
+ * @param imagePath 这是图片路径
+ * @param imageId 数据库记录的Id
+ */
+ public void sendPicture(String remoteNum, String imagePath, String imageId) {
+ //TODO:
+ File file = new File(imagePath);
+ if (!file.exists()) {
+ //TODO:文件不存在,删除数据库内容即可
+ } else {
+ //构造数据,上传数据
+ //存在的话,那么做数据转换,然后上传数据
+ try {
+ FileInputStream fileInputStream = new FileInputStream(file);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ int len;
+ while ((len = fileInputStream.read(buffer)) != -1) {
+ byteArrayOutputStream.write(buffer, 0, len);
+ }
+ //全部写到byteArrayOutputStream里,然后对byteArrayOutputStream进行遍历转换
+ byte[] bytes = byteArrayOutputStream.toByteArray();
+ byte[] result = Util.fzdTransfer(bytes, true);
+ //保存数据
+ //File outFile = new File("/storage/emulated/0/Pictures/test.jpg");
+ //FileOutputStream fos = new FileOutputStream(outFile);
+ //fos.write(result);
+ //fos.close();
+ ICLogger.d("remote id == > " + remoteNum);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ String cmd = cmdMap.get(CMD_TYPE.img);
+ //发送消息
+ String timeStr = String.valueOf(System.currentTimeMillis());
+ int cmdLength = cmd.length() + CMDSPLIT.length() + "5".length() + CMDSPLIT.length()
+ + timeStr.length() + CMDSPLIT.length() + result.length;
+
+ ICLogger.d("cmdLength == > " + cmdLength);
+ String header = genHeader(cmdLength, cmd);
+ StringBuilder sb = new StringBuilder();
+ if (doEncryption) {
+ String keyHeader = keyheader(cmd, cmdLength);
+ sb.append(CMDHEADER).append(keyHeader).append(header);
+ } else {
+ sb.append(CMDHEADER).append(header);
+ }
+ //头部构造好了,添加逗号
+ sb.append(CMDSPLIT);
+ //追加x
+ sb.append("5");
+ sb.append(CMDSPLIT);
+ //追加Y
+ sb.append(timeStr);
+ sb.append(CMDSPLIT);
+ //转成byte
+ bos.write(sb.toString().getBytes());
+ //追加数据Z
+ bos.write(result);
+ //追加结尾
+ bos.write(CMDEND.getBytes());
+ //发送数据
+ mConnection.send(cmd, bos.toByteArray());
+ bos.reset();
+ bos.close();
+ //更新数据库状态
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("state", 5);
+ mRuntime.getContextProxy().getResolver().update(
+ Uri.parse(FZDMessageProvider.MESSAGES),
+ contentValues,
+ "_id=?",
+ new String[]{imageId}
+ );
+ } catch (Exception e) {
+ e.printStackTrace();
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("state", 4);
+ mRuntime.getContextProxy().getResolver().update(
+ Uri.parse(FZDMessageProvider.MESSAGES),
+ contentValues,
+ "_id=?",
+ new String[]{imageId}
+ );
+ }
+ }
+ }
+
public enum CMD_TYPE {
/*终端发起*/
//链路保持数据
REMIND,//闹钟设置指令
TK,//对讲功能(微聊发送语音)
TKOne,//一对一微聊
+ TKIMG,//聊天图片
PHL,//设置电话本+白名单(最多 50 条)
wdstart,//远程测温
bldstart,//远程测血压
cmdMap.put(CMD_TYPE.REMIND, "REMIND");
cmdMap.put(CMD_TYPE.TK, "TK");
cmdMap.put(CMD_TYPE.TKOne, "TKOne");
+ cmdMap.put(CMD_TYPE.TKIMG, "TKIMG");
cmdMap.put(CMD_TYPE.PHL, "PHL");
cmdMap.put(CMD_TYPE.wdstart, "wdstart");
cmdMap.put(CMD_TYPE.bldstart, "bldstart");
return "";
}
- //[6fb043e7f6bb5f107319e3f3822d7124IC*860316012050026*0126*UD,210318,163421,A,33.0227161,N,114.0202817,E,2.98,0.0,0.0,5,039,095,35,00,0100018,5,1,460,00,18899,190839372,44,18899,81,43,18899,56,39,18899,458,38,18899,497,33,5,AP1,fc:d7:33:c8:77:d2,-57,AP2,1c:60:de:28:03:b4,-65,AP3,a4:2b:8c:89:62:91,-68,AP4,cc:2d:21:e2:46:a8,-68,AP5,be:dd:c2:47:04:2b,-70]
+ //[6fb043e7f6bb5f107319e3f3822d7124IC*860316012050026*0126*UD,210318,163421,
+ // A,33.0227161,N,114.0202817,E,2.98,0.0,0.0,5,039,
+ // 095,35,00,0100018,5,1,460,00,18899,190839372,44,18899,
+ // 81,43,18899,56,39,18899,458,38,18899,497,33,5,AP1,
+ // fc:d7:33:c8:77:d2,-57,AP2,1c:60:de:28:03:b4,-65,
+ // AP3,a4:2b:8c:89:62:91,-68,AP4,cc:2d:21:e2:46:a8,-68,AP5,be:dd:c2:47:04:2b,-70]
public StringMessage genUD2FromUD(StringMessage ud) {
String cmd, data, tmp;
tmp = ud.isFromCache();
handlerGroupChatVoiceContent(totalByte);
} else if (key == CMD_TYPE.TKOne) {
handlerOneChatVoiceContent(totalByte);
+ } else if (key == CMD_TYPE.TKIMG) {
+ handleImage(totalByte);
} else {
String data = content.replace(CMDHEADER, "").replace(cmd, "").replace(CMDEND, "");
if (data.startsWith(CMDSPLIT)) {
return true;
}
+ /**
+ * 图片下发
+ *
+ * @param totalByte
+ */
+ private void handleImage(byte[] totalByte) {
+ ICLogger.d("on image down...");
+ }
+
/**
* 一对一微聊
*
handleCapture(mRuntime);
mConnection.DeliverCMDMessageToSystem("rcapture", cmd);
break;
+ case CALL:
+ //TODO:
+ break;
}
return ret;