From e22ca3a6b1370b832fe5c5bddfc692ceddfd2661 Mon Sep 17 00:00:00 2001 From: TrillGates Date: Wed, 7 Apr 2021 19:32:11 +0800 Subject: [PATCH] take a pic for remote. --- .../support/bean/StringMessage.java | 195 ++++++++++-------- .../support/provider/FZDMessageProvider.java | 2 +- .../enqualcomm/support/service/Deliver.java | 4 +- .../support/service/WeTalkMsgObserver.java | 10 +- .../java/com/ic/protocols/protocol_fzd.java | 123 ++++++++++- 5 files changed, 239 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/com/enqualcomm/support/bean/StringMessage.java b/app/src/main/java/com/enqualcomm/support/bean/StringMessage.java index 908495ff..f32cb10c 100644 --- a/app/src/main/java/com/enqualcomm/support/bean/StringMessage.java +++ b/app/src/main/java/com/enqualcomm/support/bean/StringMessage.java @@ -3,95 +3,110 @@ package com.enqualcomm.support.bean; import java.util.ArrayList; public class StringMessage { - //暂时未用 - ArrayList bs; - - //目前作为消息主体,除了mqtt协议还需要一个topic(fragments[0]) , 其他协议就是要发送的内容本身。 - private String cache; - - //数据库中的index - private int index=-1; - - //命令日期 - private String date=null; - - //命令时间 - private String time=null; - //mqtt协议中第一条就是 topic,其他协议中就是cmdname或者无用 - protected String[] fragments; - - //发送标志(表示已经接收到服务器返回消息) , 0 未发送, 1 发送等回复, 2 已回复 - private int sentFlag; - - //除mqtt协议可以使用 - public StringMessage(String paramString) { - this.cache = paramString; - this.sentFlag = 0; - } - - public String getDate(){ - return date; - } - - public String getTime(){ - return time; - } - - public int getIndex(){ - return index; - } - - public void setIndex(int i){ - index=i; - } - - public void setDate(String date1,String time1){ - date=date1; - time=time1; - } - //mqtt协议使用 设置topic - public StringMessage(String[] paramArrayOfString) { this(paramArrayOfString, 0); } - - - //暂时未用,二进制数据备用 - public StringMessage(String[] paramArrayOfString, ArrayList paramArrayList) { - this.fragments = paramArrayOfString; - this.bs = paramArrayList; - this.sentFlag=0; - } - - //mqtt协议使用,设置topic 以及 发送标志 - public StringMessage(String[] paramArrayOfString, int paramBoolean) { - this.fragments = paramArrayOfString; - this.sentFlag = paramBoolean; - } - - //设置发送flag - public void setSentFlag(int f){ - sentFlag=f; - } - - //获取发送flag - public int haveSent(){ - return sentFlag; - } - - //未用 - public String[] all() { return this.fragments; } - - //获取topic内容 - public String cmd() { return this.fragments[0]; } - - //获取协议消息主体内容 - public String isFromCache() { return this.cache; } - - //更新协议消息主体内容 - public void refresh(String paramString) { this.cache = paramString; } - - //未用 - public int size() { return (this.fragments != null) ? this.fragments.length : 0; } - - //未用 - public ArrayList source() { return this.bs; } + //暂时未用 + ArrayList bs; + + //目前作为消息主体,除了mqtt协议还需要一个topic(fragments[0]) , 其他协议就是要发送的内容本身。 + private String cache; + + //数据库中的index + private int index = -1; + + //命令日期 + private String date = null; + + //命令时间 + private String time = null; + //mqtt协议中第一条就是 topic,其他协议中就是cmdname或者无用 + protected String[] fragments; + + //发送标志(表示已经接收到服务器返回消息) , 0 未发送, 1 发送等回复, 2 已回复 + private int sentFlag; + + //除mqtt协议可以使用 + public StringMessage(String paramString) { + this.cache = paramString; + this.sentFlag = 0; + } + + public String getDate() { + return date; + } + + public String getTime() { + return time; + } + + public int getIndex() { + return index; + } + + public void setIndex(int i) { + index = i; + } + + public void setDate(String date1, String time1) { + date = date1; + time = time1; + } + + //mqtt协议使用 设置topic + public StringMessage(String[] paramArrayOfString) { + this(paramArrayOfString, 0); + } + + + //暂时未用,二进制数据备用 + public StringMessage(String[] paramArrayOfString, ArrayList paramArrayList) { + this.fragments = paramArrayOfString; + this.bs = paramArrayList; + this.sentFlag = 0; + } + + //mqtt协议使用,设置topic 以及 发送标志 + public StringMessage(String[] paramArrayOfString, int paramBoolean) { + this.fragments = paramArrayOfString; + this.sentFlag = paramBoolean; + } + + //设置发送flag + public void setSentFlag(int f) { + sentFlag = f; + } + + //获取发送flag + public int haveSent() { + return sentFlag; + } + + //未用 + public String[] all() { + return this.fragments; + } + + //获取topic内容 + public String cmd() { + return this.fragments[0]; + } + + //获取协议消息主体内容 + public String isFromCache() { + return this.cache; + } + + //更新协议消息主体内容 + public void refresh(String paramString) { + this.cache = paramString; + } + + //未用 + public int size() { + return (this.fragments != null) ? this.fragments.length : 0; + } + + //未用 + public ArrayList source() { + return this.bs; + } } diff --git a/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java b/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java index 0d3a5fb1..1172344c 100644 --- a/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java +++ b/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java @@ -87,7 +87,7 @@ public class FZDMessageProvider extends ContentProvider { ////状态:0表示未读,1表示未读,2表示未发送,3表示发送中,4表示发送失败,5表示发送成功 int state = values.getAsInteger("state"); //往外发送 - if (out == 2 && state == 2) { + if (out == FZDDatabaseHelper.InOrOut.out && state == FZDDatabaseHelper.MessageState.NO_SEND) { Uri sendNotify = Uri.parse(MESSAGES_SEND + "/" + id); //发出通知 Objects.requireNonNull(getContext()).getContentResolver().notifyChange(sendNotify, null); diff --git a/app/src/main/java/com/enqualcomm/support/service/Deliver.java b/app/src/main/java/com/enqualcomm/support/service/Deliver.java index 0fef380b..1a61b497 100644 --- a/app/src/main/java/com/enqualcomm/support/service/Deliver.java +++ b/app/src/main/java/com/enqualcomm/support/service/Deliver.java @@ -460,11 +460,11 @@ public class Deliver extends AbstractConnectionService { //类型为声音 contentValues.put("type", FZDDatabaseHelper.MessageType.PIC); //状态:0表示未读 - contentValues.put("state", 0); + contentValues.put("state", FZDDatabaseHelper.MessageState.NO_SEND); //文件时长 contentValues.put("duration", 0); //接受还是发送,1表示来信 - contentValues.put("in_or_out", 1); + contentValues.put("in_or_out", FZDDatabaseHelper.InOrOut.out); //对方号码是没有的 contentValues.put("remote_num", ""); contentValues.put("create_time", System.currentTimeMillis()); diff --git a/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java b/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java index e49c8b75..c6cbcbc5 100644 --- a/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java +++ b/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java @@ -6,6 +6,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Handler; +import com.enqualcomm.support.provider.FZDDatabaseHelper; import com.enqualcomm.support.provider.FZDMessageProvider; import com.enqualcomm.support.utils.ICLogger; import com.ic.protocols.protocolAPIHelper; @@ -44,10 +45,17 @@ public class WeTalkMsgObserver extends ContentObserver { String remoteNum = query.getString(query.getColumnIndex("remote_num")); int duration = query.getInt(query.getColumnIndex("duration")); ICLogger.d("content --- > " + content); + //todo:还有类型也要查询出来 + int type = query.getInt(query.getColumnIndex("type")); query.close(); //交给fzd协议吧,让它去发送消息 protocol_fzd fzd = protocolAPIHelper.getProtocolfzd_handler(); - fzd.sendVoice(duration, remoteNum, content, lastPathSegment); + if (type == FZDDatabaseHelper.MessageType.VOICE) { + fzd.sendVoice(duration, remoteNum, content, lastPathSegment); + } else if (type == FZDDatabaseHelper.MessageType.PIC) { + //图片数据 + fzd.sendPicture(remoteNum, content, lastPathSegment); + } } }); } diff --git a/app/src/main/java/com/ic/protocols/protocol_fzd.java b/app/src/main/java/com/ic/protocols/protocol_fzd.java index 08f83a56..b1b83df2 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -237,6 +237,106 @@ public class protocol_fzd { 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 { /*终端发起*/ //链路保持数据 @@ -277,6 +377,7 @@ public class protocol_fzd { REMIND,//闹钟设置指令 TK,//对讲功能(微聊发送语音) TKOne,//一对一微聊 + TKIMG,//聊天图片 PHL,//设置电话本+白名单(最多 50 条) wdstart,//远程测温 bldstart,//远程测血压 @@ -337,6 +438,7 @@ public class protocol_fzd { 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"); @@ -421,7 +523,12 @@ public class protocol_fzd { 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(); @@ -491,6 +598,8 @@ public class protocol_fzd { 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)) { @@ -505,6 +614,15 @@ public class protocol_fzd { return true; } + /** + * 图片下发 + * + * @param totalByte + */ + private void handleImage(byte[] totalByte) { + ICLogger.d("on image down..."); + } + /** * 一对一微聊 * @@ -1380,6 +1498,9 @@ public class protocol_fzd { handleCapture(mRuntime); mConnection.DeliverCMDMessageToSystem("rcapture", cmd); break; + case CALL: + //TODO: + break; } return ret; -- 2.17.1