From aba9c594cf333f5e757765b15cf16c5c87a8d651 Mon Sep 17 00:00:00 2001 From: limqhz Date: Fri, 24 Jul 2020 15:21:03 +0800 Subject: [PATCH] =?UTF-8?q?init=E6=89=AB=E7=A0=81=E5=AE=89=E5=8D=93?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=EF=BC=8C=E5=88=9D=E5=A7=8B=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=BA=E8=84=B8=E8=AF=86=E5=88=AB=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../com/ydd/sportfaceid/MainActivity.java | 109 ++- .../ydd/sportfaceid/config/GlobalConfig.java | 10 +- .../ydd/sportfaceid/event/FaceidEvent.java | 30 - .../ydd/sportfaceid/event/MessageEvent.java | 2 - .../ydd/sportfaceid/event/QRCodeEvent.java | 10 + .../ydd/sportfaceid/net/ClientHandler.java | 111 --- .../java/com/ydd/sportfaceid/net/Cmd.java | 45 -- .../ydd/sportfaceid/net/CustomDecoder.java | 40 -- .../com/ydd/sportfaceid/net/DataConfig.java | 14 - .../com/ydd/sportfaceid/net/DoorHandler.java | 14 - .../ydd/sportfaceid/net/MessageDecoder.java | 48 -- .../ydd/sportfaceid/net/MessageEncoder.java | 28 - .../sportfaceid/net/dto/AddFaceResponse.java | 142 ---- .../com/ydd/sportfaceid/net/dto/BaseDto.java | 86 --- .../ydd/sportfaceid/net/dto/FaceImageDto.java | 53 -- .../net/dto/FaceRecognizeResponse.java | 639 ------------------ .../ydd/sportfaceid/net/dto/HeartBeat.java | 44 -- .../ydd/sportfaceid/net/dto/MemberDto.java | 148 ---- .../com/ydd/sportfaceid/net/dto/Message.java | 68 -- .../ydd/sportfaceid/netty/ClientHandler.java | 120 ++++ .../{net => netty}/ClientInitializer.java | 24 +- .../{net => netty}/ClientThread.java | 53 +- .../ydd/sportfaceid/netty/MessageEncoder.java | 30 + .../sportfaceid/netty/config/Constant.java | 7 + .../sportfaceid/netty/message/DeviceType.java | 33 + .../sportfaceid/netty/message/HeartBeat.java | 48 ++ .../sportfaceid/netty/message/MessageDTO.java | 30 + .../netty/message/MessageType.java | 20 + .../sportfaceid/service/ClientService.java | 38 +- .../sportfaceid/service/MessageService.java | 126 ++-- .../sportfaceid/session/ClientTcpSession.java | 53 -- .../sportfaceid/websocket/FaceWsClient.java | 93 --- .../websocket/FaceWsClientService.java | 63 -- build.gradle | 2 +- 35 files changed, 426 insertions(+), 1957 deletions(-) delete mode 100644 app/src/main/java/com/ydd/sportfaceid/event/FaceidEvent.java create mode 100644 app/src/main/java/com/ydd/sportfaceid/event/QRCodeEvent.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/ClientHandler.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/Cmd.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/CustomDecoder.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/DataConfig.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/DoorHandler.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/MessageDecoder.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/MessageEncoder.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/dto/AddFaceResponse.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/dto/BaseDto.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/dto/FaceImageDto.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/dto/FaceRecognizeResponse.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/dto/HeartBeat.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/dto/MemberDto.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/net/dto/Message.java create mode 100644 app/src/main/java/com/ydd/sportfaceid/netty/ClientHandler.java rename app/src/main/java/com/ydd/sportfaceid/{net => netty}/ClientInitializer.java (62%) rename app/src/main/java/com/ydd/sportfaceid/{net => netty}/ClientThread.java (73%) create mode 100644 app/src/main/java/com/ydd/sportfaceid/netty/MessageEncoder.java create mode 100644 app/src/main/java/com/ydd/sportfaceid/netty/config/Constant.java create mode 100644 app/src/main/java/com/ydd/sportfaceid/netty/message/DeviceType.java create mode 100644 app/src/main/java/com/ydd/sportfaceid/netty/message/HeartBeat.java create mode 100644 app/src/main/java/com/ydd/sportfaceid/netty/message/MessageDTO.java create mode 100644 app/src/main/java/com/ydd/sportfaceid/netty/message/MessageType.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/session/ClientTcpSession.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClient.java delete mode 100644 app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClientService.java diff --git a/app/build.gradle b/app/build.gradle index 911c6d3..1b25266 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,7 +79,7 @@ dependencies { implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.google.code.gson:gson:2.8.4' implementation 'com.squareup.okhttp3:okhttp:3.3.1' - implementation 'io.netty:netty-all:4.1.17.Final' + implementation 'io.netty:netty-all:4.1.10.Final' implementation 'org.greenrobot:eventbus:3.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' diff --git a/app/src/main/java/com/ydd/sportfaceid/MainActivity.java b/app/src/main/java/com/ydd/sportfaceid/MainActivity.java index 2bbfd35..a687ad6 100644 --- a/app/src/main/java/com/ydd/sportfaceid/MainActivity.java +++ b/app/src/main/java/com/ydd/sportfaceid/MainActivity.java @@ -1,12 +1,10 @@ package com.ydd.sportfaceid; import android.content.Intent; -import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.net.Uri; import android.os.CountDownTimer; import android.os.Handler; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.DisplayMetrics; @@ -19,19 +17,13 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.bumptech.glide.Glide; -import com.tencent.bugly.Bugly; import com.tencent.bugly.crashreport.CrashReport; import com.ydd.sportfaceid.config.SDAppConfig; -import com.ydd.sportfaceid.event.FaceidEvent; -import com.ydd.sportfaceid.event.MessageEvent; +import com.ydd.sportfaceid.event.QRCodeEvent; import com.ydd.sportfaceid.main.SDBaseActivity; -import com.ydd.sportfaceid.net.ClientThread; -import com.ydd.sportfaceid.net.dto.MemberDto; import com.ydd.sportfaceid.service.ClientService; import com.ydd.sportfaceid.setting.SDSettingActivity; import com.ydd.sportfaceid.utils.EggClickUtil; -import com.ydd.sportfaceid.websocket.FaceWsClient; -import com.ydd.sportfaceid.websocket.FaceWsClientService; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -297,70 +289,49 @@ public class MainActivity extends SDBaseActivity implements IVLCVout.OnNewVideoL * 加载人脸识别信息 */ @Subscribe(threadMode = ThreadMode.MAIN) - public void loadFaceidInfo(FaceidEvent faceidEvent) { - if (faceidEvent.isDebug){ - // 这里检测到 debug模式下,显示toast - showToast(faceidEvent.msg); - return; - } - - MemberDto memberDto = faceidEvent.getMember(); - if (memberDto != null){ - // 这个是会员进入现场 - if (errorDialog != null){ - if (errorDialog.isShow){ - errorDialog.dismiss(); - } - } - CrashReport.postCatchedException(new Throwable("接受到命令 " + memberDto.getCode())); - - - // 监听到头像 - Glide.with(this).load(memberDto.getAvatar()).into(this.avator_imageview); - String message = memberDto.getMessage(); - user_name_label.setText(memberDto.getName()); - user_phone_label.setText(memberDto.getMobile()); - if (memberDto.getAmount()!= null){ - user_amount_label.setText(memberDto.getAmount().toString()); - } - if (memberDto.getPlacePrice() != null){ - unit_price_label.setText(memberDto.getPlacePrice().toString()); - } -// welcome_label.setText(String.format("欢迎%s进场", memberDto.getName())); - welcome_label.setText(message); - if (TextUtils.isEmpty(memberDto.getCardName())) { - memberInfoLineView.setVisibility(View.GONE); - memberInfopackLayout.setVisibility(View.GONE); // 场地的信息 - } else { - memberInfoLineView.setVisibility(View.VISIBLE); - memberInfopackLayout.setVisibility(View.VISIBLE); - this.user_place_label.setText(memberDto.getCardName()); - } - - if (memberDto.getCode() == 2){ - // 出场成功 - startCountDownTime(user_info_out_ok); - }else if (memberDto.getCode() == 1){ - // 入场成功 - if (memberDto.isFirst()){ - // 每天的第一次 - firstEnterHome(); - }else{ - startCountDownTime(user_info_ok); - } - - }else if (memberDto.getCode() == 0 ){ - // 入场失败 - startCountDownTime(user_info_fail); - }else if (memberDto.getCode() == -1){ - // 余额不足 - startCountDownTime(user_info_recahrge); - } - }else { + public void loadFaceidInfo(QRCodeEvent qrCodeEvent) { + if (qrCodeEvent.msg.equals("不是会员")){ // 这个是非会员进入现场 this.showStrangerDialog(); + return; + } + CrashReport.postCatchedException(new Throwable("接受到命令 " + qrCodeEvent.msg)); + // 监听到头像 + Glide.with(this).load("https://www.baidu.com").into(this.avator_imageview); + user_name_label.setText("张三"); + user_phone_label.setText("1234567"); + user_amount_label.setText("amount"); + unit_price_label.setText("price"); + welcome_label.setText(String.format("欢迎%s进场", "张三")); + if (TextUtils.isEmpty(qrCodeEvent.msg)) { + memberInfoLineView.setVisibility(View.GONE); + memberInfopackLayout.setVisibility(View.GONE); // 场地的信息 + } else { + memberInfoLineView.setVisibility(View.VISIBLE); + memberInfopackLayout.setVisibility(View.VISIBLE); + this.user_place_label.setText(qrCodeEvent.msg); } + int code = 1; // TODO 这个是获取事件的参数 + if (code == 2){ + // 出场成功 + startCountDownTime(user_info_out_ok); + }else if (code == 1){ + // 入场成功 + if ("firstTime".equals(code)){ + // 每天的第一次 + firstEnterHome(); + }else{ + startCountDownTime(user_info_ok); + } + + }else if (code == 0 ){ + // 入场失败 + startCountDownTime(user_info_fail); + }else if (code == -1){ + // 余额不足 + startCountDownTime(user_info_recahrge); + } } @Override diff --git a/app/src/main/java/com/ydd/sportfaceid/config/GlobalConfig.java b/app/src/main/java/com/ydd/sportfaceid/config/GlobalConfig.java index fe8e954..b37f090 100644 --- a/app/src/main/java/com/ydd/sportfaceid/config/GlobalConfig.java +++ b/app/src/main/java/com/ydd/sportfaceid/config/GlobalConfig.java @@ -10,13 +10,9 @@ package com.ydd.sportfaceid.config; public class GlobalConfig { + /** + * 与服务器通讯状态 + */ public static boolean isConnected = false; - - /** - * face++的websocket连接状态 - */ - public static boolean FACE_WS_CONNECTED = false; - - } diff --git a/app/src/main/java/com/ydd/sportfaceid/event/FaceidEvent.java b/app/src/main/java/com/ydd/sportfaceid/event/FaceidEvent.java deleted file mode 100644 index fc2b810..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/event/FaceidEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ydd.sportfaceid.event; - -import com.ydd.sportfaceid.net.dto.MemberDto; - -/** - * 消息事件 - * - * @author peakren - * @date 08/12/2017 11:16 PM - */ -public class FaceidEvent { - - private MemberDto member; - - public FaceidEvent(MemberDto member) { - this.member = member; - } - - public MemberDto getMember() { - return member; - } - - public void setMember(MemberDto member) { - this.member = member; - } - - public boolean isDebug; - - public String msg; -} diff --git a/app/src/main/java/com/ydd/sportfaceid/event/MessageEvent.java b/app/src/main/java/com/ydd/sportfaceid/event/MessageEvent.java index 393e0e2..e3717d5 100644 --- a/app/src/main/java/com/ydd/sportfaceid/event/MessageEvent.java +++ b/app/src/main/java/com/ydd/sportfaceid/event/MessageEvent.java @@ -1,7 +1,5 @@ package com.ydd.sportfaceid.event; -import com.ydd.sportfaceid.net.dto.MemberDto; - /** * 消息事件 * diff --git a/app/src/main/java/com/ydd/sportfaceid/event/QRCodeEvent.java b/app/src/main/java/com/ydd/sportfaceid/event/QRCodeEvent.java new file mode 100644 index 0000000..f0724f4 --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/event/QRCodeEvent.java @@ -0,0 +1,10 @@ +package com.ydd.sportfaceid.event; +/** + * 扫码之后通知时间 + * + * @author peakren + * @date 08/12/2017 11:16 PM + */ +public class QRCodeEvent { + public String msg; +} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/ClientHandler.java b/app/src/main/java/com/ydd/sportfaceid/net/ClientHandler.java deleted file mode 100644 index 6a2a672..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/ClientHandler.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.ydd.sportfaceid.net; - -import android.app.Activity; -import android.util.Log; -import android.widget.Toast; - -import com.ydd.sportfaceid.StartApplication; -import com.ydd.sportfaceid.config.GlobalConfig; -import com.ydd.sportfaceid.session.ClientTcpSession; -import com.ydd.sportfaceid.service.MessageService; -import com.ydd.sportfaceid.net.dto.HeartBeat; -import com.ydd.sportfaceid.net.dto.Message; -import com.ydd.sportfaceid.utils.AppUtil; -import com.ydd.sportfaceid.utils.DeviceIdUtil; -import com.ydd.sportfaceid.utils.JsonMapper; - -import io.netty.channel.ChannelHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.timeout.IdleState; -import io.netty.handler.timeout.IdleStateEvent; - -/** - * 通讯服务器请求处理 - * - * @author peakren - * @date 05/12/2017 10:27 PM - */ -@ChannelHandler.Sharable -public class ClientHandler extends ChannelInboundHandlerAdapter { - - private final static String TAG = "ClientHandler"; - - private boolean hasRead = false; - - private Activity mContext; - - public ClientHandler(Activity context) { - mContext = context; - } - - @Override - public void channelRegistered(ChannelHandlerContext ctx) throws Exception { - super.channelRegistered(ctx); - ClientTcpSession.getInstance().setContext(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - //服务器连上以后立即模拟心跳返回 - ctx.writeAndFlush(getHbMessage()); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - super.channelInactive(ctx); - Log.e(TAG, "----close----"); - GlobalConfig.isConnected =false; - ClientThread.getInstance().clearFuture(); - ClientThread.getInstance().restart(); - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - super.channelRead(ctx, msg); - Log.i(TAG, "----read data: " + msg.toString() + "----"); - Message message = JsonMapper.fromJson(msg.toString(), Message.class); - MessageService.getInstance().execute(message); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - super.exceptionCaught(ctx, cause); - Log.e(TAG, "----tcp exception----"); - GlobalConfig.isConnected = false; - ctx.close(); - } - - /** - * 获取心跳返回消息 - * - * @return - */ - private Message getHbMessage() { - HeartBeat hb = new HeartBeat(); - hb.setVersionCode(AppUtil.getVersionCode(StartApplication.getAppContext())); - Message message = new Message(); - message.setCmdId(Cmd.HB.id); -// message.setDeviceId(DeviceIdUtil.generateDeviceId(mContext)); - return message; - } - - /** - * 心跳处理 - * - * @param ctx - * @param evt - * @throws Exception - */ - @Override - public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { - if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { - IdleStateEvent event = (IdleStateEvent) evt; - if (event.state() == IdleState.ALL_IDLE) { - ctx.writeAndFlush(getHbMessage()); - } - } - } - -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/Cmd.java b/app/src/main/java/com/ydd/sportfaceid/net/Cmd.java deleted file mode 100644 index 626118a..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/Cmd.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.ydd.sportfaceid.net; - -/** - * 消息协议指令定义 - * - * @Author peakren - * @Date 08/12/2017 11:51 AM - */ -public enum Cmd { - - - HB("hb", "心跳"), - - FACEID("faceid", "人脸识别"), - - FACEID_RESPONSE("faceid_response_upload", "识别结果"), - - RECEV_FACE_IMAGE("recev_face_image", "接收人脸照片"), - - RECEV_FACE_IMAGE_R("recev_face_image_r", "返回上传图片结果"), - - OPEN_DOOR("open_door", "开门禁"); - - - public String id; - - public String text; - - Cmd(String id, String text) { - this.id = id; - this.text = text; - - } - - public static Cmd getCmd(String id) { - for (Cmd cmd : Cmd.values()) { - if (cmd.id.equalsIgnoreCase(id)) { - return cmd; - } - } - return Cmd.HB; - } - -} - diff --git a/app/src/main/java/com/ydd/sportfaceid/net/CustomDecoder.java b/app/src/main/java/com/ydd/sportfaceid/net/CustomDecoder.java deleted file mode 100644 index 032f8cd..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/CustomDecoder.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.ydd.sportfaceid.net; - -import java.nio.ByteOrder; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; - - -/** - * 自定义解码器,解决粘包和分包问题 - * - * @author peakren - * @date 07/12/2017 10:03 PM - */ -public class CustomDecoder extends LengthFieldBasedFrameDecoder { - - public CustomDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength); - } - - public CustomDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip); - } - - public CustomDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip, boolean failFast) { - super(maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip, failFast); - } - - public CustomDecoder(ByteOrder byteOrder, int maxFrameLength, int lengthFieldOffset, int lengthFieldLength, int lengthAdjustment, int initialBytesToStrip, boolean failFast) { - super(byteOrder, maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip, failFast); - } - - - @Override - protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { - return super.decode(ctx, in); - } - -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/DataConfig.java b/app/src/main/java/com/ydd/sportfaceid/net/DataConfig.java deleted file mode 100644 index 1b3c248..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/DataConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ydd.sportfaceid.net; - -/** - * Created by hehelt on 16/2/26. - */ -public class DataConfig { - - public static final int MAGIC_WORD = 0x9DDD; - public static final int MAGIC_WORD_INDEX = 0; - public static final int LENGTH_INDEX = 4; - public static final int DATA_INDEX = 8; - - -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/DoorHandler.java b/app/src/main/java/com/ydd/sportfaceid/net/DoorHandler.java deleted file mode 100644 index a4468e0..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/DoorHandler.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.ydd.sportfaceid.net; - - -/** - * 门禁处理 - * DoorHandler.java - * - * @author peakren - * @date 2019/4/17 12:44 PM - */ -public class DoorHandler { - - -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/MessageDecoder.java b/app/src/main/java/com/ydd/sportfaceid/net/MessageDecoder.java deleted file mode 100644 index f314018..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/MessageDecoder.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ydd.sportfaceid.net; - -import java.io.UnsupportedEncodingException; -import java.util.List; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; - -/** - * Created by hehelt on 16/2/26. - *

- * 解码器 - */ -public class MessageDecoder extends ByteToMessageDecoder { - - @Override - protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { - if (in.capacity() >= DataConfig.LENGTH_INDEX) { - int magicWord = in.readInt(); - if (magicWord == DataConfig.MAGIC_WORD) { - int length = in.readInt(); - byte[] msg = new byte[length]; - in.readBytes(msg); - String message = new String(msg, "utf-8"); - out.add(message); - } - } - } - - /** - * 解析从服务器接受的消息 - * - * @param buf - * @return - */ - private String getMessage(ByteBuf buf) { - - byte[] con = new byte[buf.readableBytes()]; - buf.readBytes(con); - try { - return new String(con, "utf-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/MessageEncoder.java b/app/src/main/java/com/ydd/sportfaceid/net/MessageEncoder.java deleted file mode 100644 index e6957fe..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/MessageEncoder.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.ydd.sportfaceid.net; - -import android.util.Log; - -import com.ydd.sportfaceid.net.dto.Message; -import com.ydd.sportfaceid.utils.JsonMapper; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; - -/** - * 自定义编码器, 1个字节固定头+4个字节长度+内容 - */ -public class MessageEncoder extends MessageToByteEncoder { - - private String charset = "utf-8"; - private final static String TAG = "MessageEncoder"; - - @Override - protected void encode(ChannelHandlerContext ctx, Message message, ByteBuf out) throws Exception { - out.writeInt(DataConfig.MAGIC_WORD); - String msg = JsonMapper.toJson(message); - Log.i(TAG, "send data:" + msg); - out.writeInt(msg.getBytes(charset).length); - out.writeBytes(msg.getBytes(charset)); - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/dto/AddFaceResponse.java b/app/src/main/java/com/ydd/sportfaceid/net/dto/AddFaceResponse.java deleted file mode 100644 index 7360ec9..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/dto/AddFaceResponse.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.ydd.sportfaceid.net.dto; - -import com.google.gson.annotations.Expose; - -public class AddFaceResponse { - - /** - * code : 0 - * data : {"company_id":1,"id":4,"origin_url":"/static/upload/origin/2018-08-09/v2_1ea4b7847d1ea56b773aec99441af52dcbf9ca7d.jpg","quality":0.992649,"subject_id":null,"url":"/static/upload/photo/2018-08-09/v2_fa9dcfd045ff5232aa446f5645cbb031eef7ac74.jpg","version":7} - * page : {} - */ - - @Expose - private int code; - - @Expose - private DataBean data; - - @Expose - private PageBean page; - - @Expose - private String desc; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public DataBean getData() { - return data; - } - - public void setData(DataBean data) { - this.data = data; - } - - public PageBean getPage() { - return page; - } - - public void setPage(PageBean page) { - this.page = page; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public static class DataBean { - /** - * company_id : 1 - * id : 4 - * origin_url : /static/upload/origin/2018-08-09/v2_1ea4b7847d1ea56b773aec99441af52dcbf9ca7d.jpg - * quality : 0.992649 - * subject_id : null - * url : /static/upload/photo/2018-08-09/v2_fa9dcfd045ff5232aa446f5645cbb031eef7ac74.jpg - * version : 7 - */ - - @Expose - private int company_id; - @Expose - private int id; - @Expose - private String origin_url; - @Expose - private double quality; - @Expose - private Object subject_id; - @Expose - private String url; - @Expose - private int version; - - public int getCompany_id() { - return company_id; - } - - public void setCompany_id(int company_id) { - this.company_id = company_id; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getOrigin_url() { - return origin_url; - } - - public void setOrigin_url(String origin_url) { - this.origin_url = origin_url; - } - - public double getQuality() { - return quality; - } - - public void setQuality(double quality) { - this.quality = quality; - } - - public Object getSubject_id() { - return subject_id; - } - - public void setSubject_id(Object subject_id) { - this.subject_id = subject_id; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public int getVersion() { - return version; - } - - public void setVersion(int version) { - this.version = version; - } - } - - public static class PageBean { - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/dto/BaseDto.java b/app/src/main/java/com/ydd/sportfaceid/net/dto/BaseDto.java deleted file mode 100644 index 41819c7..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/dto/BaseDto.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.ydd.sportfaceid.net.dto; - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; - -/** - * Created by peakren on 19/01/2018. - */ - -public class BaseDto implements Serializable { - - private static final long serialVersionUID = 3139438146199448677L; - - @Expose - private String cmdId; //指令 - - @Expose - private String deviceId; //设备ID - - /** - * 客户端IP - */ - @Expose - private String clientIp; - - /** - * 状态码 0正常 1错误 - */ - @Expose - private int errorCode = 0; - - /** - * 错误返回信息 - */ - @Expose - private String errorMsg; - - - public String getCmdId() { - return cmdId; - } - - public void setCmdId(String cmdId) { - this.cmdId = cmdId; - } - - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - /** - * 客户端IP,获取的内网IP - * - * @return - */ - public String getClientIp() { - return clientIp; - } - - public void setClientIp(String clientIp) { - this.clientIp = clientIp; - } - - public int getErrorCode() { - return errorCode; - } - - public void setErrorCode(int errorCode) { - this.errorCode = errorCode; - } - - public String getErrorMsg() { - return errorMsg; - } - - public void setErrorMsg(String errorMsg) { - this.errorMsg = errorMsg; - } - - -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/dto/FaceImageDto.java b/app/src/main/java/com/ydd/sportfaceid/net/dto/FaceImageDto.java deleted file mode 100644 index c109214..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/dto/FaceImageDto.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.ydd.sportfaceid.net.dto; - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; -import java.math.BigDecimal; - - -/** - * 会员基本信息 - * MemberDto.java - * - * @author peakren - * @date 2018/12/20 8:39 PM - */ -public class FaceImageDto implements Serializable { - - - @Expose - private Integer faceId; - - @Expose - private Integer memberId; - - - @Expose - private String faceImage; - - - public Integer getFaceId() { - return faceId; - } - - public void setFaceId(Integer faceId) { - this.faceId = faceId; - } - - public Integer getMemberId() { - return memberId; - } - - public void setMemberId(Integer memberId) { - this.memberId = memberId; - } - - public String getFaceImage() { - return faceImage; - } - - public void setFaceImage(String faceImage) { - this.faceImage = faceImage; - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/dto/FaceRecognizeResponse.java b/app/src/main/java/com/ydd/sportfaceid/net/dto/FaceRecognizeResponse.java deleted file mode 100644 index 6d186ad..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/dto/FaceRecognizeResponse.java +++ /dev/null @@ -1,639 +0,0 @@ -package com.ydd.sportfaceid.net.dto; - -import java.io.Serializable; -import java.util.List; - -public class FaceRecognizeResponse implements Serializable { - - /** - * data : {"status":"recognized","track":6,"timestamp":1533808724,"face":{"image":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCACPAJQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6Nx7Um33qQ9KZXhJ2IE2+9BXHenU2QtjK9ae+xSGO4QZz0rjPiN8VfCnw00K513xJqscKwA7IVYGWVsZCoCRk/Uge9Vviv8T9E+FPhi68ReIJQ3y+XbWa4825k7BckH8eg71+bXxR+JfiT4reIZNe8SXLMWXyorfd+7gjHRQvTvjPWtKdNyZSVz1vx7+15q/jzWIdJllvdA8Lvd+ZetpWz7dPCoO1RIcAAkjdjsO4yG8K8S6xoF0LCDw3ostnFbRyiaaeffLcStIx34ACoNmz5QODuOTmsF0CjYDwOAKTjua61h4lNIsrqN95Yia8mKZzt3nBp1vqN3aSi4tLiSKVWDKysQVI7g9qq5FGQa0VJCubV/4y8WanJHPqHifVbmSI5jaW7kcx+u3J4r034Z/tX/FP4Z6bfaZaX0eqpeMpjfUGaRrbb/cznOenPTqK8YpGolRVhpXPvb4Jftp2njPU7bw38QILbSrqYbUvg+2FnzwrD+En16V9KjV9H1/SLqPTdVtLvMLOphmVwSOmCDjrivx0BYdDW54U8Xa94P1iDWtC1Ge0uYWBDxtgkA5K/Q1z1KCtoDifsRHdCSKMsfmMaFvYkcipozyR614v+zj8c9O+Mfh4yXBEet2CRxX1sX3YJX5XU9SuBjkDkEV7Opw2a5ZRcSB9KD2pKB1pITHr1ooBAPNFMkoj5ulIy7RyMV89+GP2sPE3iXwh8SoNG8F+Gm8XeCdMtNds7Bbr7ZFqGnef5V5IsqSBVeBXjfbuDNuAAbpXAaf+2z8SdQ02LUZPDXgf7JdSyW6+bFcybtqgnIyTghv/AK1NRi+o0rn19I6lWVdrHBwpOATXNePfHGn/AA68G6l4z1lNtvpkDy7egdx9xAfV2IUcdSM8ZI+bk/bC8UqGP/CE/CssVwssuiXbOh7MDtwCOteD/Hn9oLx/8VLqLQtd1HS002zKyC10iOSG2dyMqzK2CWAYfQVtGFijk/in8V/E/wAWvEtz4k8RSiNXc/ZrOInyrePoFUeuByfc1w7kmpP4absZhwM11U4qxqiuyHNN8s1b+zykcrU0enXMmNkROfatOaxfs2zO8s0hXHNaL2EqSCNl5NOn0i7jgNyYH8sHBcDgGjmRPsmZYyTmlyDxVg2rcjHIqIRkHpVXTBwcdxoFSAAikIK8EUDPWla4WOw+GPxL8SfCnxZZ+K/Dtzte3kHnwMfkuIuN0bD0IGOOR1ByK/U34feLoPH/AIO0bxjpCg22sWi3S7mLBGIy0Z91OQfcGvyFBBGDzX6B/sFfEJfE3w4vvBNzdL53ha7Cxp0HkTKWUD1IZZST/tL6GuWtSurkSR9OAakSMTWwUjnMJJ/nS+Vd97yMf7sP+JqxjBxRsHrXHaxle5AILnvqMw/3UUf0oqfaaKBHkWg62/hueDX7H9nHwTBp92Bp+qamviXTLKSy02YhJ32jPmhFIfyz12cYOK+XLv4NXXgbxl4x+GI13wul5oWtLqlhJfyz/wCladdRRvEYZYkMZGHAIOMFT1xivatasvE/ik6X4nPwt8b6Ne3tlHe6dcaL4q0TTJ5bOdQ3zQhWj+dSMxSHJ4BArn/iL8VNO8WeANL+IE3ww19JPBGsReA/F6J4jW11E2GEawu5Vt0EUYeR51LBRlwVBYY289PazNeVI8sf4Y+O7nyljtvDkgRwZbm31TI8vPJ2lQTgd8Zr50166kvtavZ3kSTbKUDJnaQOBjIBx+FfUup/GvwZaaHcTWvwbtrW41SGa3tr64115GtpFdQzbWHzN1w2Pyr5NMUyO2+Tdyf85711YeE07SDlBRnit/w34duNZuhDGmAELsScAD3rJsLSfUr2LTLRWa4nO2NVXcx5xwO9fQGmeENK0ryUluLcSpBF5ieVtZCxAH3iO5z7ZNd1SXs1ZG9KHMzy288LC3fIRiEznHQVuab4SkUB5V4K8D2967zydCnHk27xOZZpYg4wd+wkNg9COK1EsbNdoMiKFyCvrxxg1xyrN7HqUqCZ5TdeDEFxDctAJESYeYueWQkZxn0Ga6y18L6TJbPayWokhupNpQnKKo9/4eg5wa6PU7jTtMtJZZ0XZHGXC78Egdf6VxGrfEyGG4ubDQoJ5LNAN21SxkJBJP8As9lz7VCqybsdP1VIwNT8CX/hrUp7q2hjv7IQlZU25YhsDIHrz2rG1PwHe26x3emFLiGQjah++M+o9Pf2rvNFu9Vv5P7RmuZW2wgR24ORk/eJJ9AAO+cc1tWUF3PcCOW2kMahcSLGSoJPA9B0zXQpyiTUwsJHg2raTc6dJsuk2ydSB0FZwxgjFe2+PfCUup2Ams7dBJG252AOSvOc4Ht+teMPGI5HQ9VbBrop1Lnm16Hs3oRqvbFfUv8AwT51mWz+Juv+HUT5NQ0hrtjnjMMiKMjuf3x/I18vou48c/Svb/2L/EN1on7QOm2lqMrq1ndafOCQPkKeZ/6FCh/Ciq1ys4ai7H6YodwBBzT6r2bE267uuasV5xgFFFFAHzrafAP4L2H2qe2/Zs+KJtXuMkX9iIyAcdVFzuJzznbnmtXTvBXwjtfDWu/DvQf2dvHGgw+O7aLTrvUz4fmuIrOQ7nt3mZWkZAkuxm2glTtLD0+d/Dnxj8Pa/wCNvDFr40+H/im9v7u6MNjrvi34r3UUWnybwN1xN5QCrGTvywHBIA4xXq51PxBe/FC5+JOg/GD4SW+pmWOKFbHx1dXVlcSwjbAZkiaEOAgAZsDcMNtHAOVZOLVjo0PB/D/g7Xbv4c3vgfUvh7Nc+JvDHiq+j1G/t7uBJ7VgiLLaujNudRJuOBkBiT15rx/xv4fvvDerGG/06SzS8UXNrHJtDeUeASAcDkHivqrxZrfhs32tfFTxFD8O/FviW41GO01e68P2UjaXDMpDFgZykvzxRfNIoIZ2b5jya8K8ZXVh4v8AC1lqaeGNB0uW4vJovtlkJA0iREkgliRy2eg6Ba6aM2wOX+D2nNqXxCtJktpbhrKCW5EcSlnIRSeAOTyRxXU+KfD3i7V/KuVnlsbyLe13BIGjkCu3O7jOeOVNR/s5WVtD8Uoo7m4dFezn8w79oCLtY5Ppwc+2a9a8a6vpthf3d/PA142q6nPa20cxZI5GQDDCQA5UAglhnnPXFViJPQ6sOkeLJ4K8b6U0sen6hcNIxd33MAUlcLudXGeSAM//AK69D0O41e60W1F9cCa4g+W5k8tRlwP9kAHk4zjnGTWRY+LtQ1hruT+xrXTJLL5Z4UYuAckYHvxyRj2ArrPD09lo1v8AaNSlZLZyIYhIVK+dtyRtHAGSMnpiuRqx61JKxzXi/wAPjxBJCdRCxQW7b4lUnJc4yCe4OOnHbrVfTtP0zTTujt4o1UnzScKGHbce+O2a6zVfE2nyRmxgEa/aG3tIUVlkAXA8vPQZI5HPHvWBeWE5QvAmVkXaysMrz3pxbibryCy1HQIpxZ299b/aiN3lJySueTkemRx71vadN5xby1fbJiRcjrgkZrn/AAV4Cl8Oy6jqM919tnmVYgUYuBxl9uQMZwAPxFdRJHNp2nyHT7NEkkXMQIICnB49RyfzqnNjaFlubW3gF88ZlR0YCP8AhkXI3A9umeteBeOvC6+FNTNvq+qaeb+7H21bKwBdLaCTOxXkIGW2kEAA4A5PavpS1tftH2TzrdAYoB8iqAu4n5gfz+teMftI+HYtN1nTNWt4FWfUrcJM5blmQjbx/ukcj0ropTRxYilKdkiz8LfglF4t0XWtW1uWWGP7Ey6QFlCRS3ZBKGVsEmMbSGVQCc8MMc+ifBfRooP2mfB11DptvYx21nLbyRxRBEeRIpMlf7xwyMT1+cZrSttV161sfCNrpsNk2mQaZbpegoAwYsFVhJjAHlgH1JI617V+z94Yj1HxRrPxakW38qa3Ok2sO0ZgbbES/oCVjKE9ww9Kqbujjr4f2dNtnvUAG/CtwKs1n2chBZmAGWOD6j1q013ap/rJ1X6muc8gmoqkdWtMkLKCPWiqSuB8n/Ez4QfEfwz+0LpPjb4NXQ0mTWHudVsLkraTC1ulQLORFcHaw2uDgqR+8x2BGbrvwn+NHijWZL7xjo2m3N42/wA6/trSwt5r9+AryR24RM7Qeg719CajpNh4/wBK0zV/Evwa0vWptKWW3srq+8QPamBm2CUKqISpbYDyDwOtUv8AhXvhnt8IdJjGNvPiiZuPr5YI6micVPc0TPCPCvwH+L3hnxWbK/8AB0Nz4L8VrHpusWQljtpIomVkNwpU4Vot3mDhtw8xcAsWHOXv7J/xH0u81jwVMlvZaLpN1MNMnupQiTW4LMZkYZVy2Dnn0HavdG+BfwzjkuJF+HWlx/amBmRtZvbhVwQcqXYc8duOT61Z1D4V+AH0vTtATwfZNpWkLmws5tTvJltGMhdvLLPwCxJPA6nrTh7mw0z5o0H4QaL8OfjPa6P408axaSNW8MXEtleWNyt3HLftLHCLUwqhdiVckAY3E4ByDjs9fgkg1/U/C2uxJcXekN9m+1lFQSqQHTCDgNtkDeoyOc8Vt/GH4aeBtJvPAXinRfC+jaNbeGNft5L2eJWE08c08ZO6UkswXaw+bjDY5yRWx8T7e61Lxjfz6icukiT20u7cGi2gHB9MggfSsMRVasejg4KW549pvgu3tAllp1qqbg3nSbArSEnjce+PftXW2fhWK48ReHL+2uAIrOFo5kbnzojkEkdAc4GeT1FXAUiJY4wOvGePp3qP4VQNqfiLxDdmS4W301oYV8xfkUldzqmeBnqTjnI71g6jkexCCiYWq+EdI1SBIJLQQxxu8sSQnBViT044+lPi06GNQAMkKqnn0rZllsyq3Ed9Dtd2J3PtK8nnB5xkYz6msa6uzHMhhePMrrHgtu43HkEZHIrVO6OuEEy/YWiQkCFQo7itQ2kLglowc+tZ9i5fYw6E9K2RtxknAx6VdrmnIiOC3VRmJRkEDH1rzP426K+sadY6pJbPK9otxEmzaQm7Z8xDKecL8vbrnNepwuA0wePay4VQvT1OfwNZni7T4NT0JoZQIoYd9zczbypWJFyQCD3G4e+SOKqPu7GNaCWph+HbXU9Y8I2V3q8sYsraC2GnWFvIn7hUQAszqMs3GCGwONx64r6I8HwRaL4RbTYLm4Q3sy30kb4VopA+fLGOiYHA9zXg/wCzzq6fF1GudJ8LyaNpuixub+3gtI3jnuSh2CJi24LwjMOgOfWvoiz0bxHqEcd4uj3Kq6qwNwwjwOoHzelbJ3Wp4eZVFy8qLa6rfJJPJDMypNK0oHpntSNqU8v+tlZvrS6d4L1m1t/sy3NnGPNZ9tzcGRxuOSBjt6Vej8HXZlYXWvQxRbf+WFpubd6fMenv+lS49jxDHe7Z5AkbOWz0ANFdHb+FdGhkDXeoanOF64kVFbHbAX+tFaQgwOHh1ee1vbtJSHXUnWck42RyqoU4z6gelStrDLMsRVQXGR8grKvdN1a/thBpf2mKUMPna3AKnrwD6jitA6Fq7yiOSJ08sYAJA5xzk+lZmqih818HPzSHJ7AVWa5J+5IfXrV3/hF72QRebPAmzOfmJz9f8KmtvCscJ/eXwGRj5EJJ/E0DscjrVjD4htLvSrxYZLa5SMMf+WgZWzkNjjAGR7+nWszUbW71DwzBfXF2tw1jB9lkAbc4+bjGBzwD3zXpK+FdPKRxNLMUVstg7OO/T2qrqvh3SW0+a1gthaRFQB5Yz93JBPvWNWmpK514aq4Ox4jcRJACqtnjr1/nXEWXh/xpeeHvFGj6DqU0FxqV7ay2mSeWjKlyzD5sH5ckdh0r0fWdOS1u40aIrAZGQkliW+Y4xjp2qpJc6doMVxcajdw2Uunp5nmeZgMrZwAeDk7SCMeg5rkR71KfMkzzm602+eXTdH1meSYLpxa7b+NpMfMc5JOSMgE+3FO8HaXNpEM1nJNLJF5hljDk4VmJLY/Gse+8aXmrTXt/pekXMEc4jSzuRbs0W1erEnkgnJ6c1PpfjbV7SeGPXNA+R7cRtLCp3F8gGQoR8oI3H5eQcYreOx2U3c9G0oLuK9gM1sxhSRj0zXL+Gdfs9dtWvrPTL2yUFoCl1HsZsfxqM8g54PeuotzErAqWIdNgHQgDPJ/T9au9jdD0jABOOtQ6lpd5r/hvW/DthLHHc6xDFp8LyfcV5WKgt14BIJ47VKkoeNWPG4Zx6U/SxcyeIdFto5JBBNq1kZgi5yqzKwz3xxzjscc5xQndnFiXZM9a+C/wytvhN4MsPDMFxDczrH5l5cRptE05+8w9RjjnnGK9BJVyDjn61Bbh5SUtoHkVeOFK4/PFW49P1RyNmnEA93kUf1rpppNHymJk5S1E+Y5PrSHPc1eGi6kAC8ltGD3DliPyFPXw28rBZNVkOT91I8E+wJGK2j7pynI+PvF1l4H8Fal4kvX4soJJ0UKGMjqBtUA8EkkcHtRXkX7a2saZpHhvRfBGnTSyXesTi4uFchm+zR5GQABgF++P4KK1jK4Hq+59+/PU5JodiW3sc59auxeHtZcQl44Iw4Jch9wU54wR14q6nhe8kAWe7RBnIKxg/L6da47GxihlA+RAPwoEjA/Wuij8J2oG2W4lfnPBxVgeGNJwC0DEjvvNFh6HJs+1txYZpqyKzfN93ow2bgR3ruItE0yJY9tlFuUHJIznmp/sdrwBbRjHHC0NXRcHZnz14s02WwSSEpJsdw8eIyHbnoAevWvLde02y1a5S91LS4bmO0wZBcxh8LkErhs4zgZ5zx9K+s/Hng5PE+mrBFarLdxOrW59CTg/UAdq+ZbrRJNQ064kyimeJD1O5TxkMBnngg//AF64Kq5Ge7hp86SPPdavTeXslhBZyQQ6ey20apg4TrkduN36VFbWKyuzts8+5jOcHPTtnrnvz610Op6RFARcif5ZpmBjU4JYBcknvxjjp1qO0toYgrFORnGeTVQlc9WnFI09NjSOM4CqNiKgA4UAYxir6zhGGDkgYzjFULeVFBIZcYyc+lLcXQjyWAXau/OeMcf4itG9C5S5di/NcqoQHuRxWr4QvP8AirtAzJjzNUtlYZx/y0BP8q5pJDK4ZxwOMCn2N0+neIdH1aSUiK01G3cgdcbxnH4A0kmcGJk1Fs+2/svkuevFWFPFK5Ev78AhZFDr7gjNNHWuqF4nytWV56igsG4Jpx/eDy2bAb5SfQGkIxXn/wAdvHUfw/8Ahb4g12KYrffY2t7JV5dp5PlXH0BY5/2a6YJSMj4p+N3jST4j/F/X/EZut9pp0p0bTgjZTyIXILDt8xyegznmiuF023khtQ80haWYmWTJOd7HnOe+aKu3KI/UYKACMDk5NKRnqaUdadgVy2HcYEpdlOwKU4HenYfMxu2jbikaWNFLuwVV6knAFcz8SfiDo/w9+H+r+PNStb69s9FWGaeCxQee8MkgjZ1yRnZncRx0zS6GkXc6dIvOlRACx3LwO/NfJXivU18OeKtRubKz3WUdzPE0EfG3L4Xbg4HPHHHNdz4j+N1/4lmOheDY9Q0PT5E2zX80itdzLjdtjUHEQIKgtknOcdK878ZpEFtWgXAii2SAEbSpOSCAOSc8mvOrzTdj18InFKRwGtaw8c86bVYxS/KjdFyAduT1/wDr1iP4glwiITGYyinAIOSxJPuCOK1dVtnZ2XJYSndx2+tYl3oU7qyx3MsLtGeVGQSOQee+MilSaR7EajaLEnik2sYXeMxPIFBJ5JGencYNWNPu7rVpIrqQY2RlFGCFCnrn35qla6BCzG4uYmkbzVYDqoTuCPTr+ddXZ2UMYYLGF6AADAA+lbNc2xUZOWjJdOMrxB5N29/m+YY+U9CKt3GmxXirHM8iLuUloz8ygHkj3xnFS28RjKxMxwvCgdAPp2q9szTimmZVo3Vj6M+CvxDbxRodnoWr6gJNWsEFsxlcGW5XJ2yerHBAJ9R6V6XtJORnaeVOPvDOMj8a+I5hdpJZJplxLFf3Fx5doYWKSCZRuUhh0+oOeK+kvBH/AAk+geGbGy13xFc6lrEyxyane3CL+/nONzbFwIwoO0AdQozzXfTjzo+axdFwmz0wJuB5GQK+N/22/Gr33irQfh5Zyq8enRjVLxcdJWyEU/Rcn6kYr6XHjyLTbWfWtYVV062jkmllRslQnPQdsd+35V+eninxFd+OfGWt+Mb+Zn/tK8klgzn5Ic4RB6AADj3NbRg46s4iig2pubq3JopHbjAOcUVooqW4H6hgZpdvvTPtVsP+W8f/AH0Kje8hxxMh/wCBCuVcr6gTHA6moXuEXLbgAtUprosflcce9VZ5WZSAe46VqowW8l94EmpOZtLlQhGLjgY4znj8ay9a0+z8QaTcaTqVrHLaXlt9mniYZVkOMj9P0rRJUwhCQfamlR2IH40mqb0ujSL5T5x8R+Db3wRqEUE1sHtCGSGYjKFQOFJ656dsZrnbyJLlh5qnKcYJwR+FfTOuWuh39pJBq1zbrAgxI0kijZ36np618veLfEPw50O/lk0Px54fvrW6n8uMxazbvsbdtLMFYk47nsK8jFUXze7qe1hsRT5bSaRmXNmjS5HQetVpLEGRDtG0HJFSy+KfCYVnHibSWVTgyfbI9p+hzVeHxX4VupVgt/E2kyyMdqpHexsxPoAGrKNKa6M9OGIoW+NfeidbRATtXAPFW4Ew2cdqbeXFrpzxxahcxWrzHEazOELn2B61saZ4d1/UozNpuiX93GMfPBbPIoz05UGulRkuhvCvhlvNfeirHw3uasCeKEBpELZIG0HBJ9K1G8H+LI4Xk/4RTVtyLnH2GUk/QBetdr4O+F9zGP7a8VWxjC7HjgZSBG2eC2QOuenY1tCKe5jicXQgrwmm/UZ8NfB8kNwnizWrdUusbrBBx5Snq3B5JAHUV6Q8jEYLfewOTU50i4hIRLWTaB/dPFE9lcog22kzeyoT/SvSpRpQ+0vvPncVifbO54b+094lOlfDh9HthLGup3Is0nilVduQC6kkhmztAwoIwDkjivl+CP7PZxRA5KqK9j+PHhr4jeM/iQ8mn/D3xLJpmixfZ7WWPS55I5nbmRlITGDgcg9RXC/8Kv8AiY2Ek+G/ikLnquj3H5fcrSpOnbSS+889HMRLcTMFiBkbcAqjjBPGSe/0orvm+G3j/RNCnv1+HXiW71KdlVbeHR7hgijvwnWipjOC6oD/2Q==","rect":{"top":918,"right":872,"bottom":990,"left":798}},"person":{"feature_id":0,"confidence":78.397995,"tag":"{\"description\": \"\", \"remark\": \"\", \"subject_type\": 0, \"name\": \"ndy\", \"inviter_id\": null, \"start_time\": 0, \"title\": \"\", \"interviewee\": \"\", \"avatar\": \"/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg\", \"origin_photo_id\": 3, \"birthday\": null, \"id\": 5, \"entry_date\": null, \"department\": \"\", \"interviewee_pinyin\": \"\", \"job_number\": \"\", \"end_time\": 0}","id":"5"},"quality":0.9968518905807287} - * screen : {"camera_address":"rtsp://192.168.1.160:8554/0/0/0","allowed_subject_ids":[],"network_switcher_status":null,"box_token":"95a0f5b6-924d-4323-9296-39d258f2b3f9","description":null,"allow_all_subjects":true,"box_heartbeat":1533806262,"network_switcher":"","camera_name":"","camera_status":0,"allow_visitor":true,"screen_token":"3c566c3f-6d7f-437a-af56-8ba4a7852745","network_switcher_token":null,"box_status":"0","network_switcher_drive":0,"type":1,"id":1,"camera_position":"测试","box_address":"192.168.1.50"} - * person : {"src":"data:image/jpeg;base64,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","remark":"","subject_type":0,"description":"","inviter_id":null,"timestamp":1533808724,"start_time":0,"title":"","interviewee":"","job_number":"","entry_date":null,"origin_photo_id":3,"birthday":null,"avatar":"/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg","department":"","end_time":0,"interviewee_pinyin":"","id":5,"name":"ndy"} - * error : 允许进入 - * open_door : true - * type : recognized - */ - - private DataBean data; - private ScreenBean screen; - private PersonBeanX person; - private String error; - private boolean open_door; - private String type; - - public DataBean getData() { - return data; - } - - public void setData(DataBean data) { - this.data = data; - } - - public ScreenBean getScreen() { - return screen; - } - - public void setScreen(ScreenBean screen) { - this.screen = screen; - } - - public PersonBeanX getPerson() { - return person; - } - - public void setPerson(PersonBeanX person) { - this.person = person; - } - - public String getError() { - return error; - } - - public void setError(String error) { - this.error = error; - } - - public boolean isOpen_door() { - return open_door; - } - - public void setOpen_door(boolean open_door) { - this.open_door = open_door; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public static class DataBean { - /** - * status : recognized - * track : 6 - * timestamp : 1533808724 - * face : {"image":"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","rect":{"top":918,"right":872,"bottom":990,"left":798}} - * person : {"feature_id":0,"confidence":78.397995,"tag":"{\"description\": \"\", \"remark\": \"\", \"subject_type\": 0, \"name\": \"ndy\", \"inviter_id\": null, \"start_time\": 0, \"title\": \"\", \"interviewee\": \"\", \"avatar\": \"/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg\", \"origin_photo_id\": 3, \"birthday\": null, \"id\": 5, \"entry_date\": null, \"department\": \"\", \"interviewee_pinyin\": \"\", \"job_number\": \"\", \"end_time\": 0}","id":"5"} - * quality : 0.9968518905807287 - */ - - private String status; - private int track; - private FaceBean face; - private PersonBean person; - private double quality; - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - public int getTrack() { - return track; - } - - public void setTrack(int track) { - this.track = track; - } - - - public FaceBean getFace() { - return face; - } - - public void setFace(FaceBean face) { - this.face = face; - } - - public PersonBean getPerson() { - return person; - } - - public void setPerson(PersonBean person) { - this.person = person; - } - - public double getQuality() { - return quality; - } - - public void setQuality(double quality) { - this.quality = quality; - } - - public static class FaceBean { - /** - * image : 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 - * rect : {"top":918,"right":872,"bottom":990,"left":798} - */ - - private String image; - private RectBean rect; - - public String getImage() { - return image; - } - - public void setImage(String image) { - this.image = image; - } - - public RectBean getRect() { - return rect; - } - - public void setRect(RectBean rect) { - this.rect = rect; - } - - public static class RectBean { - /** - * top : 918 - * right : 872 - * bottom : 990 - * left : 798 - */ - - private int top; - private int right; - private int bottom; - private int left; - - public int getTop() { - return top; - } - - public void setTop(int top) { - this.top = top; - } - - public int getRight() { - return right; - } - - public void setRight(int right) { - this.right = right; - } - - public int getBottom() { - return bottom; - } - - public void setBottom(int bottom) { - this.bottom = bottom; - } - - public int getLeft() { - return left; - } - - public void setLeft(int left) { - this.left = left; - } - } - } - - public static class PersonBean { - /** - * feature_id : 0 - * confidence : 78.397995 - * tag : {"description": "", "remark": "", "subject_type": 0, "name": "ndy", "inviter_id": null, "start_time": 0, "title": "", "interviewee": "", "avatar": "/static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg", "origin_photo_id": 3, "birthday": null, "id": 5, "entry_date": null, "department": "", "interviewee_pinyin": "", "job_number": "", "end_time": 0} - * id : 5 - */ - - private int feature_id; - private double confidence; - private String tag; - private String id; - - public int getFeature_id() { - return feature_id; - } - - public void setFeature_id(int feature_id) { - this.feature_id = feature_id; - } - - public double getConfidence() { - return confidence; - } - - public void setConfidence(double confidence) { - this.confidence = confidence; - } - - public String getTag() { - return tag; - } - - public void setTag(String tag) { - this.tag = tag; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - } - } - - public static class ScreenBean { - /** - * camera_address : rtsp://192.168.1.160:8554/0/0/0 - * allowed_subject_ids : [] - * network_switcher_status : null - * box_token : 95a0f5b6-924d-4323-9296-39d258f2b3f9 - * description : null - * allow_all_subjects : true - * box_heartbeat : 1533806262 - * network_switcher : - * camera_name : - * camera_status : 0 - * allow_visitor : true - * screen_token : 3c566c3f-6d7f-437a-af56-8ba4a7852745 - * network_switcher_token : null - * box_status : 0 - * network_switcher_drive : 0 - * type : 1 - * id : 1 - * camera_position : 测试 - * box_address : 192.168.1.50 - */ - - private String camera_address; - private Object network_switcher_status; - private String box_token; - private Object description; - private boolean allow_all_subjects; - private int box_heartbeat; - private String network_switcher; - private String camera_name; - private int camera_status; - private boolean allow_visitor; - private String screen_token; - private Object network_switcher_token; - private String box_status; - private int network_switcher_drive; - private int type; - private int id; - private String camera_position; - private String box_address; - private List allowed_subject_ids; - - public String getCamera_address() { - return camera_address; - } - - public void setCamera_address(String camera_address) { - this.camera_address = camera_address; - } - - public Object getNetwork_switcher_status() { - return network_switcher_status; - } - - public void setNetwork_switcher_status(Object network_switcher_status) { - this.network_switcher_status = network_switcher_status; - } - - public String getBox_token() { - return box_token; - } - - public void setBox_token(String box_token) { - this.box_token = box_token; - } - - public Object getDescription() { - return description; - } - - public void setDescription(Object description) { - this.description = description; - } - - public boolean isAllow_all_subjects() { - return allow_all_subjects; - } - - public void setAllow_all_subjects(boolean allow_all_subjects) { - this.allow_all_subjects = allow_all_subjects; - } - - public int getBox_heartbeat() { - return box_heartbeat; - } - - public void setBox_heartbeat(int box_heartbeat) { - this.box_heartbeat = box_heartbeat; - } - - public String getNetwork_switcher() { - return network_switcher; - } - - public void setNetwork_switcher(String network_switcher) { - this.network_switcher = network_switcher; - } - - public String getCamera_name() { - return camera_name; - } - - public void setCamera_name(String camera_name) { - this.camera_name = camera_name; - } - - public int getCamera_status() { - return camera_status; - } - - public void setCamera_status(int camera_status) { - this.camera_status = camera_status; - } - - public boolean isAllow_visitor() { - return allow_visitor; - } - - public void setAllow_visitor(boolean allow_visitor) { - this.allow_visitor = allow_visitor; - } - - public String getScreen_token() { - return screen_token; - } - - public void setScreen_token(String screen_token) { - this.screen_token = screen_token; - } - - public Object getNetwork_switcher_token() { - return network_switcher_token; - } - - public void setNetwork_switcher_token(Object network_switcher_token) { - this.network_switcher_token = network_switcher_token; - } - - public String getBox_status() { - return box_status; - } - - public void setBox_status(String box_status) { - this.box_status = box_status; - } - - public int getNetwork_switcher_drive() { - return network_switcher_drive; - } - - public void setNetwork_switcher_drive(int network_switcher_drive) { - this.network_switcher_drive = network_switcher_drive; - } - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getCamera_position() { - return camera_position; - } - - public void setCamera_position(String camera_position) { - this.camera_position = camera_position; - } - - public String getBox_address() { - return box_address; - } - - public void setBox_address(String box_address) { - this.box_address = box_address; - } - - public List getAllowed_subject_ids() { - return allowed_subject_ids; - } - - public void setAllowed_subject_ids(List allowed_subject_ids) { - this.allowed_subject_ids = allowed_subject_ids; - } - } - - public static class PersonBeanX { - /** - * src : data:image/jpeg;base64,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 - * remark : - * subject_type : 0 - * description : - * inviter_id : null - * timestamp : 1533808724 - * start_time : 0 - * title : - * interviewee : - * job_number : - * entry_date : null - * origin_photo_id : 3 - * birthday : null - * avatar : /static/upload/photo/2018-08-09/v2_cec2cd5140b55db4051d9c69775ec6ebaea5947b.jpg - * department : - * end_time : 0 - * interviewee_pinyin : - * id : 5 - * name : ndy - */ - - private String src; - private String remark; - private int subject_type; - private String description; - private Object inviter_id; - private int timestamp; - private int start_time; - private String title; - private String interviewee; - private String job_number; - private Object entry_date; - private int origin_photo_id; - private Object birthday; - private String avatar; - private String department; - private int end_time; - private String interviewee_pinyin; - private int id; - private String name; - - public String getSrc() { - return src; - } - - public void setSrc(String src) { - this.src = src; - } - - public String getRemark() { - return remark; - } - - public void setRemark(String remark) { - this.remark = remark; - } - - public int getSubject_type() { - return subject_type; - } - - public void setSubject_type(int subject_type) { - this.subject_type = subject_type; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Object getInviter_id() { - return inviter_id; - } - - public void setInviter_id(Object inviter_id) { - this.inviter_id = inviter_id; - } - - public int getTimestamp() { - return timestamp; - } - - public void setTimestamp(int timestamp) { - this.timestamp = timestamp; - } - - public int getStart_time() { - return start_time; - } - - public void setStart_time(int start_time) { - this.start_time = start_time; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getInterviewee() { - return interviewee; - } - - public void setInterviewee(String interviewee) { - this.interviewee = interviewee; - } - - public String getJob_number() { - return job_number; - } - - public void setJob_number(String job_number) { - this.job_number = job_number; - } - - public Object getEntry_date() { - return entry_date; - } - - public void setEntry_date(Object entry_date) { - this.entry_date = entry_date; - } - - public int getOrigin_photo_id() { - return origin_photo_id; - } - - public void setOrigin_photo_id(int origin_photo_id) { - this.origin_photo_id = origin_photo_id; - } - - public Object getBirthday() { - return birthday; - } - - public void setBirthday(Object birthday) { - this.birthday = birthday; - } - - public String getAvatar() { - return avatar; - } - - public void setAvatar(String avatar) { - this.avatar = avatar; - } - - public String getDepartment() { - return department; - } - - public void setDepartment(String department) { - this.department = department; - } - - public int getEnd_time() { - return end_time; - } - - public void setEnd_time(int end_time) { - this.end_time = end_time; - } - - public String getInterviewee_pinyin() { - return interviewee_pinyin; - } - - public void setInterviewee_pinyin(String interviewee_pinyin) { - this.interviewee_pinyin = interviewee_pinyin; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/dto/HeartBeat.java b/app/src/main/java/com/ydd/sportfaceid/net/dto/HeartBeat.java deleted file mode 100644 index c46b6f4..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/dto/HeartBeat.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.ydd.sportfaceid.net.dto; - - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; - -/** - * 客户端心跳数据包 - * HeartBeat.java - * - * @author peakren - * @date 07/12/2017 10:23 PM - */ -public class HeartBeat implements Serializable { - - @Expose - private String versionCode; //客户端版本号 - - @Expose - private String apkUrl; //升级的软件下载地址 - - - public String getVersionCode() { - return versionCode; - } - - /** - * 客户端版本号 - * - * @param versionCode - */ - public void setVersionCode(String versionCode) { - this.versionCode = versionCode; - } - - public String getApkUrl() { - return apkUrl; - } - - public void setApkUrl(String apkUrl) { - this.apkUrl = apkUrl; - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/dto/MemberDto.java b/app/src/main/java/com/ydd/sportfaceid/net/dto/MemberDto.java deleted file mode 100644 index 9fa3d1b..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/dto/MemberDto.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.ydd.sportfaceid.net.dto; - -import com.google.gson.annotations.Expose; - -import java.io.Serializable; -import java.math.BigDecimal; - - -/** - * 会员基本信息 - * MemberDto.java - * - * @author peakren - * @date 2018/12/20 8:39 PM - */ -public class MemberDto implements Serializable { - - /** - * 头像 - */ - @Expose - private String avatar; - - /** - * 姓名 - */ - @Expose - private String name; - - /** - * 手机号码 - */ - @Expose - private String mobile; - - /** - * 余额 - */ - @Expose - private BigDecimal amount; - - /** - * 场地名称 - */ - @Expose - private String placeName; - - /** - * 会员卡名称 - */ - @Expose - private String cardName; - - @Expose - private String message; - - /** - * 1成功进场 0不允许进场 - */ - @Expose - private int code; - - @Expose - private BigDecimal placePrice; - - @Expose - private boolean first; - - public BigDecimal getPlacePrice() { - return placePrice; - } - - public void setPlacePrice(BigDecimal placePrice) { - this.placePrice = placePrice; - } - - public boolean isFirst() { - return first; - } - - public void setFirst(boolean first) { - this.first = first; - } - - public String getAvatar() { - return avatar; - } - - public void setAvatar(String avatar) { - this.avatar = avatar; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public BigDecimal getAmount() { - return amount; - } - - public void setAmount(BigDecimal amount) { - this.amount = amount; - } - - public String getPlaceName() { - return placeName; - } - - public void setPlaceName(String placeName) { - this.placeName = placeName; - } - - public String getCardName() { - return cardName; - } - - public void setCardName(String cardName) { - this.cardName = cardName; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/dto/Message.java b/app/src/main/java/com/ydd/sportfaceid/net/dto/Message.java deleted file mode 100644 index 402913d..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/net/dto/Message.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.ydd.sportfaceid.net.dto; - -import com.google.gson.annotations.Expose; - -/** - *
上位机与通讯服务器的数据协议格式
- * - * @author peakren - * @date 07/12/2017 9:57 PM - */ -public class Message extends BaseDto { - - private static final long serialVersionUID = -7944124768291562453L; - - /** - * 消息内容 - */ - @Expose - private MemberDto result; - - - @Expose - private FaceImageDto faceImage; - - /** - * 机器识别返回字符串 - */ - @Expose - private String content; - - - public int getDoor() { - return door; - } - - public void setDoor(int door) { - this.door = door; - } - - @Expose - private int door; - - - public MemberDto getResult() { - return result; - } - - public void setResult(MemberDto result) { - this.result = result; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public FaceImageDto getFaceImage() { - return faceImage; - } - - public void setFaceImage(FaceImageDto faceImage) { - this.faceImage = faceImage; - } - -} diff --git a/app/src/main/java/com/ydd/sportfaceid/netty/ClientHandler.java b/app/src/main/java/com/ydd/sportfaceid/netty/ClientHandler.java new file mode 100644 index 0000000..2d760be --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/netty/ClientHandler.java @@ -0,0 +1,120 @@ +package com.ydd.sportfaceid.netty; + +import android.app.Activity; +import android.util.Log; + +import com.ydd.sportfaceid.netty.message.DeviceType; +import com.ydd.sportfaceid.netty.message.HeartBeat; +import com.ydd.sportfaceid.netty.message.MessageDTO; +import com.ydd.sportfaceid.service.MessageService; +import com.ydd.sportfaceid.utils.DeviceIdUtil; +import com.ydd.sportfaceid.utils.JsonMapper; +import io.netty.channel.*; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; + +/** + * 通讯服务器请求处理 + * + * @author peakren + * @date 05/12/2017 10:27 PM + */ +@ChannelHandler.Sharable +public class ClientHandler extends SimpleChannelInboundHandler { + + private final static String TAG = "ClientHandler"; + private Activity mContext; + + public ClientHandler(Activity context) { + mContext = context; + } + + + /** + * 当通道就绪就会触发 + * @param ctx + * @throws Exception + */ + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + } + + /** + * 当通道失效就会触发 + * @param ctx + * @throws Exception + */ + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + } + + /** + * 当通道有读取事件时触发 + * @param ctx + * @param msg + * @throws Exception + */ + @Override + public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { + Log.d(TAG,"接收服务器响应msg:[" + msg + "]"); + // 安卓写,非netty 后台实现 + // TODO 安卓获取心跳内容(有二维码的唯一识别)显示请求小程序的venueId的二维码,无需拼接url + // TODO 安卓获取通知加载页面 + // TODO 安卓获取通知开门失败消息 (进入一个页面,然后显示倒计时,回到主页(二维码页面)) + // TODO 安卓获取通知开门的消息 (无需校验,直接操作开门) + MessageDTO message = JsonMapper.fromJson(msg, MessageDTO.class); + switch (message.getMessageType()){ + case LOAD: + System.out.println("LOADING" + message.getMessage()); + break; + default: + System.out.println("default"); + } + MessageService.getInstance().execute(message); + } + + /** + * 心跳 + * @param ctx + * @param evt + */ + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) { + if (IdleStateEvent.class.isAssignableFrom(evt.getClass())) { + IdleStateEvent event = (IdleStateEvent) evt; + if (event.state() == IdleState.ALL_IDLE) { + ctx.writeAndFlush(getHbMessage()); + } + } + } + + /** + * 封装心跳请求包 + * @throws Exception + */ + private HeartBeat getHbMessage() { + HeartBeat hb = new HeartBeat(); + hb.setDeviceName(DeviceIdUtil.generateDeviceId(mContext)); + hb.setVenueId(mContext.getTaskId()); // TODO 从上下文选择场馆 + hb.setEnterOrOut(DeviceType.ENTER); // TODO 上下文获取场馆进场或者出场 + return hb; + } + + /** + * 处理异常 + * @param ctx + * @param cause + * @throws Exception + */ + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + Log.d(TAG,"ClientHandler exceptionCaught",cause); + Channel channel = ctx.channel(); + if(channel.isActive()) { + ctx.close(); + } + } + +} diff --git a/app/src/main/java/com/ydd/sportfaceid/net/ClientInitializer.java b/app/src/main/java/com/ydd/sportfaceid/netty/ClientInitializer.java similarity index 62% rename from app/src/main/java/com/ydd/sportfaceid/net/ClientInitializer.java rename to app/src/main/java/com/ydd/sportfaceid/netty/ClientInitializer.java index 3c6621e..28cfb2a 100644 --- a/app/src/main/java/com/ydd/sportfaceid/net/ClientInitializer.java +++ b/app/src/main/java/com/ydd/sportfaceid/netty/ClientInitializer.java @@ -1,27 +1,22 @@ -package com.ydd.sportfaceid.net; - -import android.content.Context; +package com.ydd.sportfaceid.netty; +import com.ydd.sportfaceid.netty.config.Constant; +import io.netty.buffer.Unpooled; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.DelimiterBasedFrameDecoder; +import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.timeout.IdleStateHandler; public class ClientInitializer extends ChannelInitializer { - private Context mContext; - private final static int TIME_HEART_BEAT = 20; - + public ClientThread.ReConnectHandler reConnectHandler; public ClientHandler dmClientHandler; - public ClientInitializer(ClientThread.ReConnectHandler handler) { - reConnectHandler = handler; - } - public ClientInitializer(ClientThread.ReConnectHandler handler, ClientHandler dmClientHandler) { reConnectHandler = handler; this.dmClientHandler = dmClientHandler; @@ -32,10 +27,11 @@ public class ClientInitializer extends ChannelInitializer { protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("reconnect", reConnectHandler); - pipeline.addLast("idleStateHandler", new IdleStateHandler(TIME_HEART_BEAT, TIME_HEART_BEAT, TIME_HEART_BEAT)); + pipeline.addLast(new DelimiterBasedFrameDecoder(2048, + Unpooled.wrappedBuffer(Constant.DELIMITER_WORD.getBytes()))); + pipeline.addLast(new StringDecoder()); pipeline.addLast(new MessageEncoder()); - pipeline.addFirst(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 4, 4, 0, 0)); - pipeline.addLast(new MessageDecoder()); + pipeline.addLast(new IdleStateHandler(TIME_HEART_BEAT, TIME_HEART_BEAT,TIME_HEART_BEAT)); pipeline.addLast(dmClientHandler); } diff --git a/app/src/main/java/com/ydd/sportfaceid/net/ClientThread.java b/app/src/main/java/com/ydd/sportfaceid/netty/ClientThread.java similarity index 73% rename from app/src/main/java/com/ydd/sportfaceid/net/ClientThread.java rename to app/src/main/java/com/ydd/sportfaceid/netty/ClientThread.java index e4ea970..39f7fb1 100644 --- a/app/src/main/java/com/ydd/sportfaceid/net/ClientThread.java +++ b/app/src/main/java/com/ydd/sportfaceid/netty/ClientThread.java @@ -1,7 +1,6 @@ -package com.ydd.sportfaceid.net; +package com.ydd.sportfaceid.netty; import android.app.Activity; -import android.os.Handler; import android.util.Log; import com.ydd.sportfaceid.BuildConfig; @@ -94,40 +93,25 @@ public class ClientThread { } remoteHost = SharedPreferencesUtil.getServerIp(); remotePort = SharedPreferencesUtil.getServerPort(); - -// if (future != null){ -// return; -// } -// future = null; if (GlobalConfig.isConnected){ return; } - Log.d("sander", "连接 = " + remoteHost + " " + remotePort); future = bootstrap.connect(new InetSocketAddress(remoteHost, remotePort)); - future.addListener(new ChannelFutureListener() { - public void operationComplete(ChannelFuture f) throws Exception { - f.channel().eventLoop().schedule(new Runnable() { - @Override - public void run() { - if (!f.isSuccess()) { - if (GlobalConfig.isConnected) { - GlobalConfig.isConnected = false; - } - doConnect(); - EventBus.getDefault().post(new MessageEvent("等待连接")); - Log.e(TAG, "连接失败!"); - } else { - EventBus.getDefault().post(new MessageEvent("已连接")); - Log.i(TAG, "连接成功!"); - GlobalConfig.isConnected = true; - } - } - }, 2, TimeUnit.SECONDS); - - + future.addListener((ChannelFutureListener) f -> f.channel().eventLoop().schedule(() -> { + if (!f.isSuccess()) { + if (GlobalConfig.isConnected) { + GlobalConfig.isConnected = false; + } + doConnect(); + EventBus.getDefault().post(new MessageEvent("等待连接")); + Log.e(TAG, "连接失败!"); + } else { + EventBus.getDefault().post(new MessageEvent("已连接")); + Log.i(TAG, "连接成功!"); + GlobalConfig.isConnected = true; } - }); + }, 2, TimeUnit.SECONDS)); } @@ -151,18 +135,11 @@ public class ClientThread { @ChannelHandler.Sharable public class ReConnectHandler extends ChannelInboundHandlerAdapter { - - @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); System.out.println("inactive"); - ctx.channel().eventLoop().schedule(new Runnable() { - @Override - public void run() { - doConnect(); - } - }, 1, TimeUnit.SECONDS); + ctx.channel().eventLoop().schedule(() -> doConnect(), 1, TimeUnit.SECONDS); } } diff --git a/app/src/main/java/com/ydd/sportfaceid/netty/MessageEncoder.java b/app/src/main/java/com/ydd/sportfaceid/netty/MessageEncoder.java new file mode 100644 index 0000000..99b912d --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/netty/MessageEncoder.java @@ -0,0 +1,30 @@ +package com.ydd.sportfaceid.netty; + +import com.ydd.sportfaceid.netty.config.Constant; +import com.ydd.sportfaceid.utils.JsonMapper; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +import java.nio.charset.Charset; + +/** + * 自定义编码器, 1个字节固定头+4个字节长度+内容 + */ +public class MessageEncoder extends MessageToByteEncoder { + + Charset charset = Charset.forName("UTF-8"); + /** + * 安卓打印日志,本地不需要 + */ + private final static String TAG = "MessageEncoder"; + + @Override + protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { + String message = JsonMapper.toJson(msg); + message = message + Constant.DELIMITER_WORD; + byte[] content = message.getBytes(charset.name()); + out.writeBytes(content); //发送消息内容 + } +} + diff --git a/app/src/main/java/com/ydd/sportfaceid/netty/config/Constant.java b/app/src/main/java/com/ydd/sportfaceid/netty/config/Constant.java new file mode 100644 index 0000000..8090689 --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/netty/config/Constant.java @@ -0,0 +1,7 @@ +package com.ydd.sportfaceid.netty.config; + +public class Constant { + + public final static String DELIMITER_WORD = "$_$"; + +} diff --git a/app/src/main/java/com/ydd/sportfaceid/netty/message/DeviceType.java b/app/src/main/java/com/ydd/sportfaceid/netty/message/DeviceType.java new file mode 100644 index 0000000..98ec6c0 --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/netty/message/DeviceType.java @@ -0,0 +1,33 @@ +package com.ydd.sportfaceid.netty.message; + +/** + * 设备属性,控制入场还是控制出场 + */ +public enum DeviceType { + + ENTER(0,"进场"), + OUT(1,"出场"); + private int code; + private String name; + + DeviceType(int code, String name) { + this.code = code; + this.name = name; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/app/src/main/java/com/ydd/sportfaceid/netty/message/HeartBeat.java b/app/src/main/java/com/ydd/sportfaceid/netty/message/HeartBeat.java new file mode 100644 index 0000000..f3ed406 --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/netty/message/HeartBeat.java @@ -0,0 +1,48 @@ +package com.ydd.sportfaceid.netty.message; + +import com.google.gson.annotations.Expose; + +import java.io.Serializable; + +/** + * 客户端心跳数据包 + * HeartBeat.java + * + * @author peakren + * @date 07/12/2017 10:23 PM + */ +public class HeartBeat implements Serializable { + + @Expose + private Integer venueId; //场馆号 + + @Expose + private String deviceName; //设备号 + + @Expose + private DeviceType EnterOrOut; //出入标志 + + public Integer getVenueId() { + return venueId; + } + + public void setVenueId(Integer venueId) { + this.venueId = venueId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public DeviceType getEnterOrOut() { + return EnterOrOut; + } + + public void setEnterOrOut(DeviceType enterOrOut) { + EnterOrOut = enterOrOut; + } +} diff --git a/app/src/main/java/com/ydd/sportfaceid/netty/message/MessageDTO.java b/app/src/main/java/com/ydd/sportfaceid/netty/message/MessageDTO.java new file mode 100644 index 0000000..0b729c9 --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/netty/message/MessageDTO.java @@ -0,0 +1,30 @@ +package com.ydd.sportfaceid.netty.message; + +import java.io.Serializable; + +public class MessageDTO implements Serializable { + + private MessageType messageType; + private String message; + + public MessageDTO(MessageType messageType, String message) { + this.messageType = messageType; + this.message = message; + } + + public MessageType getMessageType() { + return messageType; + } + + public void setMessageType(MessageType messageType) { + this.messageType = messageType; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/ydd/sportfaceid/netty/message/MessageType.java b/app/src/main/java/com/ydd/sportfaceid/netty/message/MessageType.java new file mode 100644 index 0000000..df5beda --- /dev/null +++ b/app/src/main/java/com/ydd/sportfaceid/netty/message/MessageType.java @@ -0,0 +1,20 @@ +package com.ydd.sportfaceid.netty.message; + +public enum MessageType { + LOAD("加载"), + OPENDOOR("开门"), + FAILED("开门校验失败"); + + private String message; + MessageType(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app/src/main/java/com/ydd/sportfaceid/service/ClientService.java b/app/src/main/java/com/ydd/sportfaceid/service/ClientService.java index af03268..04195cd 100644 --- a/app/src/main/java/com/ydd/sportfaceid/service/ClientService.java +++ b/app/src/main/java/com/ydd/sportfaceid/service/ClientService.java @@ -1,16 +1,11 @@ package com.ydd.sportfaceid.service; import android.app.IntentService; -import android.app.Service; import android.content.Intent; -import android.os.IBinder; -import android.support.annotation.Nullable; import android.util.Log; import com.ydd.sportfaceid.StartApplication; -import com.ydd.sportfaceid.net.ClientThread; -import com.ydd.sportfaceid.websocket.FaceWsClient; -import com.ydd.sportfaceid.websocket.FaceWsClientService; +import com.ydd.sportfaceid.netty.ClientThread; /** * 启动socker和websocket服务 @@ -21,46 +16,19 @@ import com.ydd.sportfaceid.websocket.FaceWsClientService; public class ClientService extends IntentService { public ClientService() { - super("new cocket"); + super("new socket"); } @Override public void onCreate() { super.onCreate(); -//启动服务器socket连接 - Log.d("sander", "clientThread run"); - StartApplication.executor.execute(new Runnable() { - @Override - public void run() { - ClientThread.getInstance().run(); - } - }); + StartApplication.executor.execute(() -> ClientThread.getInstance().run()); } -// @Override -// public int onStartCommand(Intent intent, int flags, int startId) { -// return super.onStartCommand(intent, flags, startId); -// } -// -// @Override -// public void onDestroy() { -// super.onDestroy(); -// } -// -// @Override -// public IBinder onBind(Intent intent) { -// return null; -// } - @Override protected void onHandleIntent(Intent intent) { - /** - * 启动face++ websocket连接 - */ - FaceWsClientService.getInstance().start(); - Log.d("sander","这里在重复启动hanglde intent service"); } } diff --git a/app/src/main/java/com/ydd/sportfaceid/service/MessageService.java b/app/src/main/java/com/ydd/sportfaceid/service/MessageService.java index 5f50bcb..fd9a07a 100644 --- a/app/src/main/java/com/ydd/sportfaceid/service/MessageService.java +++ b/app/src/main/java/com/ydd/sportfaceid/service/MessageService.java @@ -2,28 +2,12 @@ package com.ydd.sportfaceid.service; import android.util.Base64; -import android.util.Log; -import android.widget.Toast; -import com.google.gson.Gson; import com.ydd.sportfaceid.BuildConfig; -import com.ydd.sportfaceid.StartApplication; -import com.ydd.sportfaceid.event.FaceidEvent; -import com.ydd.sportfaceid.net.Cmd; -import com.ydd.sportfaceid.net.dto.AddFaceResponse; -import com.ydd.sportfaceid.net.dto.FaceImageDto; -import com.ydd.sportfaceid.net.dto.Message; -import com.ydd.sportfaceid.session.ClientTcpSession; +import com.ydd.sportfaceid.netty.message.MessageDTO; import com.ydd.sportfaceid.utils.AppLogger; -import com.ydd.sportfaceid.utils.DeviceIdUtil; -import com.ydd.sportfaceid.utils.JsonMapper; - -import org.greenrobot.eventbus.EventBus; - -import java.io.Console; import java.io.IOException; import java.util.UUID; - import Net.PC15.Command.CommandDetial; import Net.PC15.Connector.ConnectorAllocator; import Net.PC15.Connector.E_ControllerType; @@ -55,7 +39,7 @@ public class MessageService { static public MessageService getInstance() { if (sInstance == null) { - synchronized (ClientTcpSession.class) { + synchronized (MessageService.class) { if (sInstance == null) { sInstance = new MessageService(); } @@ -69,55 +53,55 @@ public class MessageService { * * @param message */ - public void execute(Message message) { - if (null == message) { - return; - } - Cmd cmd = Cmd.getCmd(message.getCmdId()); - switch (cmd) { - case HB: - break; - case FACEID: - EventBus.getDefault().post(new FaceidEvent(message.getResult())); - break; - //识别结果返回 - case OPEN_DOOR: - AppLogger.getInstance().writeLog("----receive open door cmd----"); - StartApplication.executor.execute(new Runnable() { - @Override - public void run() { - openDoor(message.getDoor()); - } - }); - break; - - //接收人脸照片 - case RECEV_FACE_IMAGE: - //获取图片内容 - String imageBase64 = message.getContent(); - StartApplication.executor.execute(new Runnable() { - @Override - public void run() { - try { - Integer faceId = uploadFace(imageBase64); - Message sendMsg = new Message(); - sendMsg.setCmdId(Cmd.RECEV_FACE_IMAGE_R.id); - sendMsg.setDeviceId(DeviceIdUtil.generateDeviceId(StartApplication.getAppContext())); - FaceImageDto faceImage = new FaceImageDto(); - faceImage.setFaceId(faceId); - if (sendMsg.getFaceImage() != null) { - faceImage.setMemberId(sendMsg.getFaceImage().getMemberId()); - } - sendMsg.setFaceImage(faceImage); - //返回上传结果 - ClientTcpSession.getInstance().send(sendMsg); - } catch (Exception e) { - Log.e(TAG, "upload face image error..."); - } - } - }); - break; - } + public void execute(MessageDTO message) { +// if (null == message) { +// return; +// } +// Cmd cmd = Cmd.getCmd(message.getCmdId()); +// switch (cmd) { +// case HB: +// break; +// case FACEID: +// EventBus.getDefault().post(new FaceidEvent(message.getResult())); +// break; +// //识别结果返回 +// case OPEN_DOOR: +// AppLogger.getInstance().writeLog("----receive open door cmd----"); +// StartApplication.executor.execute(new Runnable() { +// @Override +// public void run() { +// openDoor(message.getDoor()); +// } +// }); +// break; +// +// //接收人脸照片 +// case RECEV_FACE_IMAGE: +// //获取图片内容 +// String imageBase64 = message.getContent(); +// StartApplication.executor.execute(new Runnable() { +// @Override +// public void run() { +// try { +// Integer faceId = uploadFace(imageBase64); +// Message sendMsg = new Message(); +// sendMsg.setCmdId(Cmd.RECEV_FACE_IMAGE_R.id); +// sendMsg.setDeviceId(DeviceIdUtil.generateDeviceId(StartApplication.getAppContext())); +// FaceImageDto faceImage = new FaceImageDto(); +// faceImage.setFaceId(faceId); +// if (sendMsg.getFaceImage() != null) { +// faceImage.setMemberId(sendMsg.getFaceImage().getMemberId()); +// } +// sendMsg.setFaceImage(faceImage); +// //返回上传结果 +// ClientTcpSession.getInstance().send(sendMsg); +// } catch (Exception e) { +// Log.e(TAG, "upload face image error..."); +// } +// } +// }); +// break; +// } } @@ -171,10 +155,10 @@ public class MessageService { } ResponseBody responseBody = response.body(); - AddFaceResponse faceResponse = JsonMapper.fromJson(responseBody.string(), AddFaceResponse.class); - if (faceResponse.getCode() == 0) { - return faceResponse.getData().getId(); - } +// AddFaceResponse faceResponse = JsonMapper.fromJson(responseBody.string(), AddFaceResponse.class); +// if (faceResponse.getCode() == 0) { +// return faceResponse.getData().getId(); +// } return -1; } diff --git a/app/src/main/java/com/ydd/sportfaceid/session/ClientTcpSession.java b/app/src/main/java/com/ydd/sportfaceid/session/ClientTcpSession.java deleted file mode 100644 index b2f8934..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/session/ClientTcpSession.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.ydd.sportfaceid.session; - - -import com.ydd.sportfaceid.net.dto.Message; - -import io.netty.channel.ChannelHandlerContext; - -/** - * 通讯服务器session持久化 - * - * @author peakren - * @date 07/12/2017 10:42 PM - */ -public class ClientTcpSession { - - private static ChannelHandlerContext context; - - static private ClientTcpSession sInstance; - - static public ClientTcpSession getInstance() { - if (sInstance == null) { - synchronized (ClientTcpSession.class) { - if (sInstance == null) { - sInstance = new ClientTcpSession(); - } - } - } - return sInstance; - } - - public ChannelHandlerContext getContext() { - return this.context; - } - - public void setContext(ChannelHandlerContext context) { - this.context = context; - } - - - public void send(Message message) { - if (context != null) { - context.writeAndFlush(message); - } - } - - - public void close() { - if (context != null) { - context.close(); - context = null; - } - } -} diff --git a/app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClient.java b/app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClient.java deleted file mode 100644 index a1b3f25..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClient.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.ydd.sportfaceid.websocket; - - -import android.util.Log; - -import com.google.gson.Gson; -import com.tencent.bugly.crashreport.CrashReport; -import com.ydd.sportfaceid.StartApplication; -import com.ydd.sportfaceid.config.SDAppConfig; -import com.ydd.sportfaceid.event.FaceidEvent; -import com.ydd.sportfaceid.net.Cmd; -import com.ydd.sportfaceid.net.dto.FaceRecognizeResponse; -import com.ydd.sportfaceid.net.dto.Message; -import com.ydd.sportfaceid.session.ClientTcpSession; -import com.ydd.sportfaceid.utils.DeviceIdUtil; - -import org.greenrobot.eventbus.EventBus; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft; -import org.java_websocket.handshake.ServerHandshake; - -import java.net.URI; -import java.util.Map; - - -/** - * face++ WS连接客户端 - * FaceWsClient.java - * - * @author peakren - * @date 2019/4/15 12:51 PM - */ -public class FaceWsClient extends WebSocketClient { - - private final static String TAG = "FaceWsClient"; - private Gson gson = new Gson(); - - public FaceWsClient(URI serverUri, Draft draft) { - super(serverUri, draft); - } - - public FaceWsClient(URI serverURI) { - super(serverURI); - } - - public FaceWsClient(URI serverUri, Map httpHeaders) { - super(serverUri, httpHeaders); - } - - @Override - public void onOpen(ServerHandshake handshakedata) { - Log.i(TAG, "opened connection"); - } - - @Override - public void onMessage(String message) { - Log.i(TAG, "received: " + message); - - FaceRecognizeResponse faceRecognizeResponse = gson.fromJson(message, FaceRecognizeResponse.class); - if (faceRecognizeResponse.getType().equals("unrecognized")){ - Log.d("sander", "这是个陌生人,"); - FaceidEvent faceidEvent = new FaceidEvent(null); - EventBus.getDefault().post(faceidEvent); - }else { - Message sendMsg = new Message(); - sendMsg.setContent(message); - sendMsg.setCmdId(Cmd.FACEID_RESPONSE.id); - // 这里改成1和2,1是1号摄像头,2是2号摄像头 - int current_camera_index = SDAppConfig.getInstance().getCurrent_selected_camera(); - String device_ID = current_camera_index == 0 ? "1" : "2"; - CrashReport.postCatchedException(new Throwable("device_ID = " + device_ID + " message = " + message)); - sendMsg.setDeviceId(device_ID); - ClientTcpSession.getInstance().send(sendMsg); - } - -// FaceidEvent debugFace = new FaceidEvent(null); -// debugFace.isDebug = true; -// debugFace.msg = message; -// EventBus.getDefault().post(debugFace); - - } - - @Override - public void onClose(int code, String reason, boolean remote) { - Log.e(TAG, "Connection closed by " + (remote ? "remote peer" : "us") + " Code: " + code + " Reason: " + reason); - } - - @Override - public void onError(Exception ex) { - ex.printStackTrace(); - } - -} diff --git a/app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClientService.java b/app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClientService.java deleted file mode 100644 index 045499e..0000000 --- a/app/src/main/java/com/ydd/sportfaceid/websocket/FaceWsClientService.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.ydd.sportfaceid.websocket; - -import android.text.TextUtils; -import android.util.Log; - -import com.ydd.sportfaceid.BuildConfig; -import com.ydd.sportfaceid.StartApplication; -import com.ydd.sportfaceid.config.SDAppConfig; - -import java.net.URI; -import java.net.URLEncoder; -import java.util.concurrent.TimeUnit; - -public class FaceWsClientService { - - private final static String TAG = "FaceWsClientService"; - - private static FaceWsClientService instance; - - private String local_camer_service ; - FaceWsClient c = null; - public static FaceWsClientService getInstance() { - if (instance == null) { - synchronized (FaceWsClientService.class) { - if (instance == null) { - instance = new FaceWsClientService(); - } - } - } - return instance; - } - - - public void start() { - String rtspUrl = SDAppConfig.getInstance().getCurrentCameraUrl(); - - if (!TextUtils.isEmpty(local_camer_service)){ - if (local_camer_service.equals(rtspUrl)){ - return; - } - } - StartApplication.executor.execute(new Runnable() { - @Override - public void run() { - try { - if (c != null){ - c.closeBlocking(); - c = null; - } - local_camer_service = rtspUrl; -// String rtspUrl = "rtsp://192.168.1.161/user=admin&password=&channel=1&stream=0.sdp?"; - c = new FaceWsClient(new URI(BuildConfig.FACEID_WS_URL + URLEncoder.encode(rtspUrl, "UTF-8"))); - c.connectBlocking(5000, TimeUnit.MILLISECONDS); - } catch (Exception e) { - Log.e(TAG, e.toString()); - } - } - }); - - - } - -} diff --git a/build.gradle b/build.gradle index dc0c653..2edb21e 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { repositories { google() - maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} + maven{ url 'https://maven.aliyun.com/repository/public'} } dependencies { classpath 'com.android.tools.build:gradle:3.1.4'