From b81d0cf47a08b3b5de01bf753fb71f6d1fda783a Mon Sep 17 00:00:00 2001 From: fctom1215 <fctom1215@outlook.com> Date: 星期日, 23 二月 2020 15:21:02 +0800 Subject: [PATCH] Merge branch 'master' of https://gitee.com/endian11/DriveJudge --- app/src/main/java/safeluck/drive/evaluation/platformMessage/AttachInfo.java | 2 app/src/main/res/layout/layout_rtk_setting.xml | 1 im_lib/src/main/java/com/anyun/im_lib/listener/OnEventListener.java | 2 im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java | 52 ++++++++ im_lib/src/main/java/com/anyun/im_lib/interf/IMSClientInteface.java | 4 app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java | 12 ++ app/src/main/java/safeluck/drive/evaluation/app.java | 36 +++++ app/src/main/java/safeluck/drive/evaluation/MainActivity.java | 54 ++++++++ app/src/main/java/safeluck/drive/evaluation/im/IMSEventListener.java | 12 + app/src/main/java/safeluck/drive/evaluation/im/IMessageProcessor.java | 2 im_lib/src/main/java/com/anyun/im_lib/IMSConfig.java | 2 im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java | 64 ++++++++++ im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java | 3 app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java | 24 ++++ app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java | 37 +++++- app/src/main/java/safeluck/drive/evaluation/im/IMSClientBootstrap.java | 11 + app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0206.java | 5 17 files changed, 303 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/safeluck/drive/evaluation/MainActivity.java b/app/src/main/java/safeluck/drive/evaluation/MainActivity.java index 508ddea..4f9650c 100644 --- a/app/src/main/java/safeluck/drive/evaluation/MainActivity.java +++ b/app/src/main/java/safeluck/drive/evaluation/MainActivity.java @@ -8,6 +8,7 @@ import android.os.AsyncTask; import android.os.Bundle; +import android.text.TextUtils; import android.util.Log; import android.widget.Toast; @@ -32,7 +33,9 @@ import com.anyun.exam.lib.AYSdk; import com.anyun.exam.lib.MyLog; import com.anyun.exam.lib.util.ByteUtil; +import com.anyun.im_lib.listener.IMSConnectStatusCallback; import com.google.gson.Gson; +import com.safeluck.aykj.utils.BytesUtils; import org.json.JSONException; import org.json.JSONObject; @@ -43,14 +46,19 @@ import java.util.List; import java.util.concurrent.ArrayBlockingQueue; +import safeluck.drive.evaluation.im.IMSClientBootstrap; +import safeluck.drive.evaluation.im.MessageProcessor; +import safeluck.drive.evaluation.platformMessage.JKMessage0100; +import safeluck.drive.evaluation.platformMessage.JKMessage0101; import safeluck.drive.evaluation.util.CThreadPoolExecutor; import safeluck.drive.evaluation.util.FileUtil; import safeluck.drive.evaluation.util.PermissionManager; +import safeluck.drive.evaluation.util.SPUtils; import safeluck.drive.evaluation.viewmodels.MainViewModel; import safeluck.drive.evaluation.viewmodels.RTKConnAndLogin; import safeluck.drive.evaluation.viewmodels.RTKConnAndLoginViewModel; -public class MainActivity extends SupportActivity { +public class MainActivity extends SupportActivity implements IMSConnectStatusCallback { private static final int PERMISSIONS_REQUEST_CODE = 1001; private String TAG = MainActivity.class.getCanonicalName(); @@ -61,6 +69,7 @@ String[] PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; RTKConfigViewModel rtkConfigViewModel; private boolean onlySendOnceRTKConfig = true; + private ICEventListener icEventListener = new ICEventListener() { @Override @@ -147,6 +156,12 @@ //鍏ㄥ睆 setContentView(R.layout.activity_main); + // TODO + // 杩涜tcp杩炴帴 + String userId = "100002"; + String token = "token_" + userId; + String hosts = "[{\"host\":\"192.168.31.77\", \"port\":12125}]"; + IMSClientBootstrap.getInstance().init(userId,token,hosts,1,this); WokViewModel wokViewModel = ViewModelProviders.of(this).get(WokViewModel.class); wokViewModel.getStudents().observe(this, new Observer<List<Student>>() { @@ -296,4 +311,41 @@ return false; } + @Override + public void onConnecting() { + MyLog.i(TAG,"TCP onConnecting"); + } + + @Override + public void onConnected() { + MyLog.i(TAG,"TCP杩炴帴鎴愬姛"); + //TODO 鍒ゆ柇SPUtils 鏄惁淇濆瓨鏈塪es瀵嗙爜锛涘鏋滄病鏈夊垯杩涜娉ㄥ唽JKMessage0100锛屽鏋滄湁瀵嗙爜鍒欒繘琛岄壌鏉僇KMessage0101 + String hexPwd = (String) SPUtils.get(this,SPUtils.DES_HEX_PWD,""); + MessageProcessor.getInstance().addBeatHeart(10); + if (TextUtils.isEmpty(hexPwd)){ + + JKMessage0100 jkRegisterMessage = new JKMessage0100(); + jkRegisterMessage.proviceid = 23; + jkRegisterMessage.cityid = 1; + jkRegisterMessage.imei = "460123874561"; + jkRegisterMessage.model = "123"; + jkRegisterMessage.sn = "0314200100000004"; + + Log.i(TAG, "onClick: msg len "+jkRegisterMessage.getMessageLen()+" "+ jkRegisterMessage.props.value); + byte[] str = jkRegisterMessage.toBytes(); + MessageProcessor.getInstance().sendMessage(jkRegisterMessage); + Log.i(TAG, "onClick: "+ BytesUtils.bytesToHexString(str)+" ============"); + }else{ + JKMessage0101 jkMessage0101 = new JKMessage0101(); + jkMessage0101.des =hexPwd; + jkMessage0101.timestamp = (int) System.currentTimeMillis(); + MessageProcessor.getInstance().sendMessage(jkMessage0101); + } + } + + @Override + public void onConnectFailed() { + MyLog.i(TAG,"TCP杩炴帴澶辫触"); + } + } diff --git a/app/src/main/java/safeluck/drive/evaluation/app.java b/app/src/main/java/safeluck/drive/evaluation/app.java index b026cf9..cc081dc 100644 --- a/app/src/main/java/safeluck/drive/evaluation/app.java +++ b/app/src/main/java/safeluck/drive/evaluation/app.java @@ -22,16 +22,19 @@ import com.anyun.exam.lib.MyLog; import com.anyun.exam.lib.crash.CrashHandler; import com.anyun.im_lib.ExecutorServiceFactory; +import com.anyun.im_lib.listener.IMSConnectStatusCallback; import com.facebook.stetho.Stetho; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.safeluck.aykj.utils.BytesUtils; import org.json.JSONException; import org.json.JSONObject; +import java.util.Date; import java.util.Random; import safeluck.drive.evaluation.DB.WorkRoomDataBase; @@ -45,7 +48,14 @@ import safeluck.drive.evaluation.DB.rtktb.RTKWorkRepository; import safeluck.drive.evaluation.cEventCenter.CEvent; import safeluck.drive.evaluation.cEventCenter.CEventCenter; +import safeluck.drive.evaluation.im.IMSClientBootstrap; +import safeluck.drive.evaluation.im.IMSConnectStatusListener; +import safeluck.drive.evaluation.im.MessageProcessor; +import safeluck.drive.evaluation.platformMessage.JKMessage0100; +import safeluck.drive.evaluation.platformMessage.JKMessage0101; +import safeluck.drive.evaluation.platformMessage.JKMessage0203; import safeluck.drive.evaluation.util.FileUtil; +import safeluck.drive.evaluation.util.SPUtils; import safeluck.drive.evaluation.util.SystemUtil; /** @@ -54,7 +64,7 @@ * 閭锛�632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ -public class app extends Application implements IAYExamListener { +public class app extends Application implements IAYExamListener { private static final String TAG = "app"; private Gson gson; @@ -102,9 +112,8 @@ } }).start(); - //TODO 杩涜tcp杩炴帴 - //TODO 鍒ゆ柇SPUtils 鏄惁淇濆瓨鏈塪es瀵嗙爜锛涘鏋滄病鏈夊垯杩涜娉ㄥ唽JKMessage0100锛屽鏋滄湁瀵嗙爜鍒欒繘琛岄壌鏉僇KMessage0101 + } } @@ -126,9 +135,17 @@ MyLog.e(TAG, "OnTerminate()"); } + private String lastStr; @Override public void callBackMsg(final int cmd, String json) { - MyLog.d(TAG, String.format("鏀跺埌鍛戒护[%d],Json鍐呭涓�%s", cmd, json)); + String strConent = String.format("鏀跺埌鍛戒护[%d],Json鍐呭涓�%s", cmd, json); + if (strConent.equalsIgnoreCase(lastStr)){ + + }else{ + + MyLog.d(TAG,strConent ); + lastStr = strConent; + } switch (cmd) { case Constant.NDK_START: sendVechileInfo(); @@ -158,6 +175,15 @@ case Constant.JUDGE_INFO: if(!TextUtils.isEmpty(json)){ + JKMessage0203 jkMessage0203 = new JKMessage0203(); + jkMessage0203.phone = "0314200100000004"; + jkMessage0203.timeBCD = new Date(); + jkMessage0203.fail_item_id = 4; + jkMessage0203.fail_score = 10; + jkMessage0203.fail_reason = "鍙戝姩鏈哄惎鍔ㄥ悗锛屼笉鍙婃椂鏉惧紑鍚姩寮�鍏�"; + jkMessage0203.ID = "123456789"; + jkMessage0203.exam_id = 123456; + MessageProcessor.getInstance().sendMessage(jkMessage0203); JsonArray jsonArray = JsonParser.parseString(json).getAsJsonArray(); for (int i = 0; i < jsonArray.size(); i++) { JsonObject jsonObject = jsonArray.get(i).getAsJsonObject(); @@ -272,4 +298,6 @@ }).start(); } + + } diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java index 702c122..eeb855a 100644 --- a/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.List; import me.yokeyword.fragmentation.SupportFragment; @@ -50,6 +51,10 @@ import safeluck.drive.evaluation.cEventCenter.ICEventListener; import safeluck.drive.evaluation.customview.ArrowView; import safeluck.drive.evaluation.customview.HouseView; +import safeluck.drive.evaluation.im.MessageProcessor; +import safeluck.drive.evaluation.platformMessage.JKMessage0201; +import safeluck.drive.evaluation.platformMessage.JKMessage0202; +import safeluck.drive.evaluation.platformMessage.JKMessage0204; /** * 鑱旂綉璁粌UI @@ -298,6 +303,13 @@ sendExamJson(1); iv_head.getDrawable().setLevel(1); //TODO 鍙戦�丣KMessage0202 缁欏钩鍙帮紝寮�濮嬭�冭瘯 + JKMessage0202 jkMessage0202 = new JKMessage0202(); + jkMessage0202.phone = "0314200100000004"; + jkMessage0202.timeBCD = new Date(); + jkMessage0202.curr_exam = 1; + jkMessage0202.ID = "123456789"; + jkMessage0202.exam_id = 123456; + MessageProcessor.getInstance().sendMessage(jkMessage0202); break; case R.id.tv_stop: Toast.makeText(_mActivity, "缁撴潫鑰冭瘯", Toast.LENGTH_SHORT).show(); @@ -317,6 +329,10 @@ case R.id.profile: MyLog.i(TAG,"绛惧埌锛岃幏鍙栬韩浠借瘉鐗╃悊鍗″彿"); //TODO 鑾峰緱鐗╃悊鍗″彿 鍙戦�丣KMessage0201缁欏钩鍙帮紝鑾峰彇濮撳悕銆佽韩浠借瘉銆乭ead_url + JKMessage0201 jkMessage0201 = new JKMessage0201(); + jkMessage0201.currentExam = 1; + jkMessage0201.id = "123456789"; + MessageProcessor.getInstance().sendMessage(jkMessage0201); break; } } @@ -343,6 +359,14 @@ WorkManager.getInstance(_mActivity).enqueue(examStatusInitWork); sendExamJson(0); //TODO 鍙戦�丣KMessage0204缁欏钩鍙� 缁撴潫鑰冭瘯 + JKMessage0204 jkMessage0204 = new JKMessage0204(); + jkMessage0204.phone = "0314200100000004"; + jkMessage0204.timeBCD = new Date(); + jkMessage0204.score = 10; + jkMessage0204.stop = JKMessage0204.SUCC_STOP; + jkMessage0204.ID = "123456789"; + jkMessage0204.exam_id = 123456; + MessageProcessor.getInstance().sendMessage(jkMessage0204); } private ICEventListener icEventListener = new ICEventListener() { diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java index 82a703a..b636ff8 100644 --- a/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java @@ -17,6 +17,7 @@ import androidx.lifecycle.Observer; import com.anyun.exam.lib.util.Speaker; +import com.anyun.im_lib.listener.IMSConnectStatusCallback; import com.anyun.im_lib.util.ByteUtil; import com.google.android.material.textfield.TextInputEditText; import com.safeluck.aykj.utils.BytesUtils; @@ -137,7 +138,22 @@ String hosts = "[{\"host\":\"47.93.157.103\", \"port\":2020}]"; // String hosts = "[{\"host\":\"192.168.31.77\", \"port\":12125}]"; - IMSClientBootstrap.getInstance().init(userId,token,hosts,1); + IMSClientBootstrap.getInstance().init(userId, token, hosts, 1, new IMSConnectStatusCallback() { + @Override + public void onConnecting() { + + } + + @Override + public void onConnected() { + + } + + @Override + public void onConnectFailed() { + + } + }); break; case R.id.btn_send: // if (connectThread != null){ @@ -243,12 +259,21 @@ "{\"utc\":\"20070101062157.00\",\"sat_num\":0,\"qf\":0,\"latitude\":0.0,\"longitude\":0.0,\"altitude\":-6378154.162,\"speed\":0.0}"; jkMessage0206.length = jkMessage0206.json.length(); AttachInfo attachInfo = new AttachInfo(); - attachInfo.attach_message_id = 0x40; - attachInfo.attach_message_length = 18; - attachInfo.attach_data="12345678901"; + attachInfo.attach_message_id = Integer.parseInt(port.getText().toString().trim()); + attachInfo.attach_message_length = 4; + Log.i(TAG, "attachInfo.attach_message_id ="+attachInfo.attach_message_id ); + if (attachInfo.attach_message_id == 0x41){ + Log.i(TAG, "onClick: 41"); + attachInfo.attach_data="00000000"; + }else{ + + //18涓瓧鑺� ascii + attachInfo.attach_data="303030303030303030303030303030303030"; + } + jkMessage0206.attachInfo = attachInfo; Log.i(TAG, "浣嶇疆涓婃姤="+jkMessage0206.toString()); - + MessageProcessor.getInstance().sendMessage(jkMessage0206); break; case R.id.btn_stop_exam: JKMessage0204 jkMessage0204 = new JKMessage0204(); @@ -266,7 +291,7 @@ @Override public void run() { JKMessage0002 jkMessage0002 = new JKMessage0002(); - jkMessage0002.checksum = 0x7e; +// jkMessage0002.checksum = 0x7e; MessageProcessor.getInstance().sendMessage(jkMessage0002); Log.i(TAG, "run: 5s涓�娆�"); } diff --git a/app/src/main/java/safeluck/drive/evaluation/im/IMSClientBootstrap.java b/app/src/main/java/safeluck/drive/evaluation/im/IMSClientBootstrap.java index a508360..fa0becf 100644 --- a/app/src/main/java/safeluck/drive/evaluation/im/IMSClientBootstrap.java +++ b/app/src/main/java/safeluck/drive/evaluation/im/IMSClientBootstrap.java @@ -3,6 +3,7 @@ import android.util.Log; import com.anyun.im_lib.interf.IMSClientInteface; +import com.anyun.im_lib.listener.IMSConnectStatusCallback; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -47,7 +48,7 @@ * @param hosts * @param appStatus */ - public synchronized void init(String userId,String token,String hosts,int appStatus){ + public synchronized void init(String userId, String token, String hosts, int appStatus, IMSConnectStatusCallback imsConnectStatusListener){ if (!isActive){ Vector<String> serverUrlList = convertHosts(hosts); if (serverUrlList == null || serverUrlList.size() ==0){ @@ -62,7 +63,7 @@ //鍒濆鍖朓MSClientInteface imsClient = IMSClientFactory.getIMSClient(); updateAppStatus(appStatus); - imsClient.init(serverUrlList,new IMSEventListener(userId,token),new IMSConnectStatusListener()); + imsClient.init(serverUrlList,new IMSEventListener(userId,token),imsConnectStatusListener); } } @@ -106,4 +107,10 @@ imsClient.sendMsg(message); } } + + public void addHeartbeat(int seconds){ + if (isActive){ + imsClient.addHeartbeatHandler(seconds); + } + } } diff --git a/app/src/main/java/safeluck/drive/evaluation/im/IMSEventListener.java b/app/src/main/java/safeluck/drive/evaluation/im/IMSEventListener.java index 59bb12b..2874640 100644 --- a/app/src/main/java/safeluck/drive/evaluation/im/IMSEventListener.java +++ b/app/src/main/java/safeluck/drive/evaluation/im/IMSEventListener.java @@ -2,6 +2,9 @@ import com.anyun.im_lib.listener.OnEventListener; +import safeluck.drive.evaluation.platformMessage.JKMessage0002; +import safeluck.drive.evaluation.platformMessage.utils.MessageEscaper; + /** * MyApplication2 * Created by lzw on 2019/12/12. 16:12:40 @@ -12,10 +15,11 @@ private String userId; private String token; - + private MessageEscaper messageEscaper; public IMSEventListener(String userId, String token) { this.userId = userId; this.token = token; + messageEscaper = new MessageEscaper(); } @Override @@ -71,4 +75,10 @@ public byte[] getRegisterMessage() { return null; } + + @Override + public byte[] getHearbeatMsg() { + JKMessage0002 jkMessage0002 = new JKMessage0002(); + return messageEscaper.escape(jkMessage0002.toBytes()); + } } diff --git a/app/src/main/java/safeluck/drive/evaluation/im/IMessageProcessor.java b/app/src/main/java/safeluck/drive/evaluation/im/IMessageProcessor.java index 7121a36..c685223 100644 --- a/app/src/main/java/safeluck/drive/evaluation/im/IMessageProcessor.java +++ b/app/src/main/java/safeluck/drive/evaluation/im/IMessageProcessor.java @@ -11,4 +11,6 @@ public interface IMessageProcessor { void receiveMsg(byte[] message); void sendMessage(JK2019MessageBase msg); + + void addBeatHeart(int seconds); } diff --git a/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java b/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java index cedcb9d..3cf3798 100644 --- a/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java +++ b/app/src/main/java/safeluck/drive/evaluation/im/MessageProcessor.java @@ -8,6 +8,7 @@ import androidx.work.WorkManager; import com.anyun.exam.lib.MyLog; +import com.anyun.im_lib.interf.IMSClientInteface; import com.anyun.im_lib.util.ByteUtil; import com.google.gson.Gson; import com.safeluck.aykj.utils.BytesUtils; @@ -21,6 +22,7 @@ import safeluck.drive.evaluation.platformMessage.JK2019MessageBase; import safeluck.drive.evaluation.platformMessage.JKMessage0001; import safeluck.drive.evaluation.platformMessage.JKMessage0100; +import safeluck.drive.evaluation.platformMessage.JKMessage0101; import safeluck.drive.evaluation.platformMessage.JKMessage8001; import safeluck.drive.evaluation.platformMessage.JKMessage8100; import safeluck.drive.evaluation.platformMessage.JKMessage8201; @@ -68,6 +70,9 @@ if (((JKMessage8100) jk2019MessageBase).result == JKMessage8100.SUCCESS){ SPUtils.put(app.getAppContext(),SPUtils.DES_HEX_PWD,((JKMessage8100) jk2019MessageBase).des); + JKMessage0101 jkMessage0101 = new JKMessage0101(); + jkMessage0101.des =((JKMessage8100) jk2019MessageBase).des; + jkMessage0101.timestamp = (int) System.currentTimeMillis(); } }else if (jk2019MessageBase instanceof JKMessage8001){ JKMessage8001 jkMessage8001 = (JKMessage8001) jk2019MessageBase; @@ -101,4 +106,11 @@ } }); } + + @Override + public void addBeatHeart(int seconds) { + if (IMSClientBootstrap.getInstance().isActive()){ + IMSClientBootstrap.getInstance().addHeartbeat(seconds); + } + } } diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/AttachInfo.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/AttachInfo.java index ef0c3f5..67ea888 100644 --- a/app/src/main/java/safeluck/drive/evaluation/platformMessage/AttachInfo.java +++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/AttachInfo.java @@ -14,7 +14,7 @@ @Int8 public int attach_message_length; @Order(3) - @Length(lengthField="attach_message_length") + @Length(lengthField = "attach_message_length") @Hex public String attach_data; } diff --git a/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0206.java b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0206.java index 8d8154b..a56e6ef 100644 --- a/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0206.java +++ b/app/src/main/java/safeluck/drive/evaluation/platformMessage/JKMessage0206.java @@ -46,8 +46,11 @@ @Order(12) @Message - @Length(20) + @Length(0) public AttachInfo attachInfo; + + + /** * 鎶ヨ * DWORD diff --git a/app/src/main/res/layout/layout_rtk_setting.xml b/app/src/main/res/layout/layout_rtk_setting.xml index 4efa44a..ce6d041 100644 --- a/app/src/main/res/layout/layout_rtk_setting.xml +++ b/app/src/main/res/layout/layout_rtk_setting.xml @@ -149,6 +149,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/tv_rtk_model" + android:visibility="gone" android:text="@string/rtk_config_model" android:layout_weight="1"/> <TextView diff --git a/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java b/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java index a0e4314..75abb73 100644 --- a/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java +++ b/im_lib/src/main/java/com/anyun/im_lib/HeartbeatHandler.java @@ -1,6 +1,13 @@ package com.anyun.im_lib; +import com.anyun.im_lib.netty.NettyTcpClient; +import com.anyun.im_lib.util.MyLog; +import com.safeluck.aykj.utils.BytesUtils; + +import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; /** * MyApplication2 @@ -9,4 +16,49 @@ * All Rights Saved! Chongqing AnYun Tech co. LTD */ public class HeartbeatHandler extends ChannelInboundHandlerAdapter { + private NettyTcpClient imsClient; + public HeartbeatHandler(NettyTcpClient imsClient) { + this.imsClient = imsClient; + } + private HeartbeatTask heartbeatTask; + private class HeartbeatTask implements Runnable { + + private ChannelHandlerContext ctx; + + public HeartbeatTask(ChannelHandlerContext ctx) { + this.ctx = ctx; + } + + @Override + public void run() { + if (ctx.channel().isActive()) { + byte []heartbeatMsg = imsClient.getHeartbeatMsg(); + if (heartbeatMsg == null) { + return; + } + MyLog.i("鍙戦�佸績璺虫秷鎭紝message=" + BytesUtils.bytesToHexString(heartbeatMsg) + "褰撳墠蹇冭烦闂撮殧涓猴細" +imsClient.getHeartbeatInterval() + "ms\n"); + imsClient.sendMsg(heartbeatMsg, false); + } + } + } + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + super.userEventTriggered(ctx, evt); + if (evt instanceof IdleStateEvent){ + IdleState state = ((IdleStateEvent)evt).state(); + switch (state){ + case READER_IDLE: + // 瑙勫畾鏃堕棿鍐呮病鏀跺埌鏈嶅姟绔績璺冲寘鍝嶅簲锛岃繘琛岄噸杩炴搷浣� + break; + case WRITER_IDLE: + // 瑙勫畾鏃堕棿鍐呮病鍚戞湇鍔$鍙戦�佸績璺冲寘锛屽嵆鍙戦�佷竴涓績璺冲寘 + if (heartbeatTask == null) { + heartbeatTask = new HeartbeatTask(ctx); + } + imsClient.getLoopGroup().execWorkTask(heartbeatTask); + break; + + } + } + } } diff --git a/im_lib/src/main/java/com/anyun/im_lib/IMSConfig.java b/im_lib/src/main/java/com/anyun/im_lib/IMSConfig.java index 646ad15..4950e7a 100644 --- a/im_lib/src/main/java/com/anyun/im_lib/IMSConfig.java +++ b/im_lib/src/main/java/com/anyun/im_lib/IMSConfig.java @@ -10,7 +10,7 @@ public static final int CONNECT_STATE_FAILURE = -1; public static final int DEFAULT_RECONNECT_BASE_DELAY_TIME = 3 * 1000; public static final int DEFAULT_CONNECT_TIMEOUT = 10 * 1000; - public static final int DEFAULT_HEARTBEAT_INTERVAL_FOREGROUND = 3 * 1000; + public static final int DEFAULT_HEARTBEAT_INTERVAL_FOREGROUND = 10 * 1000; public static final int DEFAULT_HEARTBEAT_INTERVAL_BACKGROUND = 30 * 1000; /*** 搴旂敤鍦ㄥ墠鍙版爣璇�***/ diff --git a/im_lib/src/main/java/com/anyun/im_lib/interf/IMSClientInteface.java b/im_lib/src/main/java/com/anyun/im_lib/interf/IMSClientInteface.java index a50730d..2b55154 100644 --- a/im_lib/src/main/java/com/anyun/im_lib/interf/IMSClientInteface.java +++ b/im_lib/src/main/java/com/anyun/im_lib/interf/IMSClientInteface.java @@ -112,4 +112,8 @@ //鑾峰彇娉ㄥ唽娑堟伅 byte[] getRegisterMessage(); + + byte[] getHeartbeatMsg(); + + void addHeartbeatHandler(int seconds); } diff --git a/im_lib/src/main/java/com/anyun/im_lib/listener/OnEventListener.java b/im_lib/src/main/java/com/anyun/im_lib/listener/OnEventListener.java index ae61ce2..ccd7c2f 100644 --- a/im_lib/src/main/java/com/anyun/im_lib/listener/OnEventListener.java +++ b/im_lib/src/main/java/com/anyun/im_lib/listener/OnEventListener.java @@ -59,4 +59,6 @@ int getReConnectInterval(); //娉ㄥ唽娑堟伅 byte[] getRegisterMessage(); + + byte[] getHearbeatMsg(); } diff --git a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java index ac26ebc..0c6112b 100644 --- a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java +++ b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java @@ -17,6 +17,7 @@ import java.nio.ByteBuffer; import java.util.Vector; +import java.util.concurrent.TimeUnit; import java.util.function.ToDoubleBiFunction; import io.netty.bootstrap.Bootstrap; @@ -330,7 +331,7 @@ // TODO: 2019/12/12 鏍规嵁MSG_ID 鏉ュ姞鍏� 瓒呮椂锛� 鏆備笉鍐� if (channel == null){ - Log.i(TAG, "sendMsg fail,channel涓虹┖"+msg); + MyLog.i("PlatformMessage", "sendMsg fail,channel涓虹┖"+msg); } try { MyLog.i("PlatformMessage", "sendMsg: "+ BytesUtils.bytesToHexString(msg)); @@ -338,7 +339,7 @@ byteBuf.writeBytes(msg); channel.writeAndFlush(byteBuf); } catch (Exception e) { - Log.i(TAG, "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t"+msg); + Log.i("PlatformMessage", "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t"+msg); } } @@ -403,6 +404,34 @@ return mOnEventListener.getRegisterMessage(); } return null; + } + + @Override + public byte[] getHeartbeatMsg() { + if (mOnEventListener != null){ + return mOnEventListener.getHearbeatMsg(); + } + return null; + } + + + + /** + * 澧炲姞蹇冭烦锛� + * @param heartBeatInterval 绉� + */ + @Override + public void addHeartbeatHandler(int heartBeatInterval){ + this.heartBeatInterval = heartBeatInterval*1000; + _addHeartbeatHandler(); + } + + public int getHeartbeatInterval() { + return this.heartBeatInterval; + } + + public ExecutorServiceFactory getLoopGroup() { + return loopGroup; } @@ -522,6 +551,37 @@ } + private void _addHeartbeatHandler(){ + MyLog.i("add HeartbeatHandler"); + if (channel == null || !channel.isActive() || channel.pipeline()==null){ + MyLog.i("PlatformMessage","娣诲姞蹇冭烦handler澶辫触"); + return; + } + try { + if(channel.pipeline().get(IdleStateHandler.class.getSimpleName()) != null){ + MyLog.i("PlatformMessage","涔嬪墠瀛樺湪鐨勮鍐欒秴鏃秇andler锛屽厛绉婚櫎鎺夛紝鍐嶉噸鏂版坊鍔�"); + channel.pipeline().remove(IdleStateHandler.class.getSimpleName()); + } + // 3娆″績璺虫病鍝嶅簲锛屼唬琛ㄨ繛鎺ュ凡鏂紑 + //璁惧畾IdleStateHandler蹇冭烦妫�娴嬫瘡鍥涚杩涜涓�娆″啓妫�娴嬶紝濡傛灉鍥涚鍐厀rite()鏂规硶鏈璋冪敤鍒欒Е鍙戜竴娆serEventTrigger()鏂规硶锛屽疄鐜板鎴风姣忓洓绉掑悜鏈嶅姟绔彂閫佷竴娆℃秷鎭紱 + channel.pipeline().addFirst(IdleStateHandler.class.getSimpleName(), new IdleStateHandler( + 0, heartBeatInterval, 0, TimeUnit.MILLISECONDS)); + + // 閲嶆柊娣诲姞HeartbeatHandler + if (channel.pipeline().get(HeartbeatHandler.class.getSimpleName()) != null) { + channel.pipeline().remove(HeartbeatHandler.class.getSimpleName()); + } + if (channel.pipeline().get(TCPReadHandler.class.getSimpleName()) != null) { + MyLog.i("涔嬪墠瀛樺湪鐨勫厛绉婚櫎鎺夛紝鍐嶉噸鏂版坊鍔燞eartbeatHandler"); + channel.pipeline().addBefore(TCPReadHandler.class.getSimpleName(), HeartbeatHandler.class.getSimpleName(), + new HeartbeatHandler(this)); + } + } catch (Exception e) { + e.printStackTrace(); + MyLog.i("娣诲姞蹇冭烦娑堟伅绠$悊handler澶辫触锛宺eason锛�" + e.getMessage()); + } + } + } diff --git a/im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java b/im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java index 84be1d7..a363991 100644 --- a/im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java +++ b/im_lib/src/main/java/com/safeluck/aykj/message/BinMessageBase.java @@ -168,6 +168,7 @@ try { Object value = fieldDefine.field.get(this); String hex = fieldDefine.coder.encode(value); +// Log.i("PlatformMessage", "FieldName: "+fieldDefine.field.getName()+" hex:"+hex); if (hex == null) { fieldDefine.relativeLengthField.set(this, 0); } else { @@ -210,7 +211,7 @@ hex = this.getPaddingLeftString(hex,fieldDefine.getFieldLen()*2, BytesUtils.toHexString(fieldDefine.length.paddingByte())); } } -// System.out.println(hex); +// Log.i("PlatformMessage value", "FieldName: "+fieldDefine.field.getName()+" hex:"+hex); sb.append(hex); } catch (IllegalAccessException e) { this.buildException(e.getMessage()); -- Gitblit v1.8.0