소스 검색

#优化tcp连接,修复几处呼叫bug

weizhengliang 3 년 전
부모
커밋
8cf4cf1d33

+ 22 - 13
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -97,11 +97,11 @@ public class TcpClient {
         System.out.println("connect start");
         ChannelFuture future = bootstrap.connect().addListener(new ChannelFutureListener() {
             @Override
-            public void operationComplete(ChannelFuture channelFuture) throws Exception {
-                if (channelFuture.isSuccess()){
+            public void operationComplete(final ChannelFuture channelFuture) throws Exception {
+                if (channelFuture.isSuccess()) {
                     channel = channelFuture.channel();
                     isRunning = true;
-                    retryTimes = 0;
+                    retryTimes = 1;
                     System.out.println("connect success");
                 } else {
                     //连接失败时的处理
@@ -111,18 +111,27 @@ public class TcpClient {
                         @Override
                         public void run() {
                             retryTimes++;
-                            if (retryTimes>10){
-                                System.out.println("重试"+(retryTimes-1)+"次,结束");
-                                channel.close();
-                                workGroup.shutdownGracefully();
-                                inited = false;
-                                //todo: 从API获取新的serverIP和serverPort,全新连接
-                                TcpClient.getInstance().init(Constants.Companion.getTcp_ip(), Integer.parseInt(Constants.Companion.getTcp_port()), Integer.parseInt(Constants.Companion.getReader_idle_time()));
-                                return;
+                            if (retryTimes > 20) { //重试30次还没连成功,等10分钟后再试
+//                                System.out.println("TcpClient 重试" + (retryTimes - 1) + "次,结束");
+//                                channel.close();
+//                                workGroup.shutdownGracefully();
+//                                //todo: 从API获取新的serverIP和serverPort,全新连接
+//                                TcpClient.getInstance().init(Constant.TCP_SERVER_URL, Constant.TCP_PORT, Constant.TCP_HEART_BEAT);
+                                retryTimes=1;
+                                channelFuture.channel().eventLoop().schedule(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        System.out.println("TcpClientHandler 重新连接,第" + retryTimes + "次");
+                                        doConnect();
+                                    }
+                                }, 60*10, TimeUnit.SECONDS);
+
+                            }else{
+                                doConnect();
                             }
-                            doConnect();
+
                         }
-                    }, retrySeconds * retryTimes, TimeUnit.SECONDS);
+                    }, 5, TimeUnit.SECONDS);
                 }
             }
         });

+ 2 - 2
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java

@@ -49,6 +49,7 @@ public class DeviceChannel {
                         return responseTcpModel;
                     } else {
                         //todo: 通话中界面展现,data中服务器传过来呼入名称;从接口重新获取左侧数据
+                        calling = true;
                         EventBus.getDefault().post(new MessageEvent(tcpModel, Constants.Companion.getEVENT_TCP_MSG()));
                         //responseTcpModel = VoiceUtil.voiceSuccess(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId(),interactionVO.getId());
                         //return responseTcpModel;
@@ -78,8 +79,7 @@ public class DeviceChannel {
                     EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
                     calling = false;
                 }else if(tcpModel.getAction()== TcpAction.VoiceAction.SUCCESS){
-                    //todo 这个是自己点击了分机的呼叫 服务器返回给我数据 以供我 挂断时传输呼叫记录的id 因为分机
-                    //在点击呼叫之前 是没有呼叫记录的
+                    //todo 这个是自己点击了分机的呼叫 服务器返回给我数据 以供我 挂断时传输呼叫记录的id 因为分机在点击呼叫之前 是没有呼叫记录的
                     EventBus.getDefault().post(new MessageEvent(tcpModel,Constants.Companion.getEVENT_TCP_MSG()));
                     calling = true;
                 }

+ 25 - 14
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -629,23 +629,34 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                     if (tcpModel.getAction() == TcpAction.VoiceAction.CALL) {//收到新的呼叫
                         Constants.fromId = tcpModel.fromId
                         Constants.interactionId = interactionVO.id
-                        Constants.CALL_STATE = Constants.CALL_INCOMING
-                        DeviceChannel.calling = true
 
-                        val text = "来自: " + interactionVO.fromFrameFullName + " 的通话请求"
-                        CallDialogHelper.dismissCallDialog()
-                        CallDialogHelper.showCallDialog(this@NurseHomeActivity, 1, text, View.OnClickListener {
-                            //呼出取消
-                        }, View.OnClickListener {
-                            //来电接听
-                            VoiceUtil.acceptAudioCall(Integer.parseInt(Constants.ids), Constants.fromId, Constants.interactionId)
+                        //通话之前先判断webrtc socket是否连接上,否则不能建立通话
+                        if (SocketManager.getInstance().socketOpen()) {
+                            Constants.CALL_STATE = Constants.CALL_INCOMING
+                            DeviceChannel.calling = true
+                            val text = "来自: " + interactionVO.fromFrameFullName + " 的通话请求"
                             CallDialogHelper.dismissCallDialog()
-                        }, View.OnClickListener {
-                            //来电拒接
+                            CallDialogHelper.showCallDialog(this@NurseHomeActivity, 1, text,
+                                View.OnClickListener {
+                                    //呼出取消
+                                },
+                                View.OnClickListener {
+                                    //来电接听
+                                    VoiceUtil.acceptAudioCall(Integer.parseInt(Constants.ids), Constants.fromId, Constants.interactionId)
+                                    CallDialogHelper.dismissCallDialog()
+                                },
+                                View.OnClickListener {
+                                    //来电拒接
+                                    DeviceChannel.calling = false
+                                    VoiceUtil.rejectAudioCall(Integer.parseInt(Constants.ids), Constants.fromId, Constants.interactionId)
+                                    CallDialogHelper.dismissCallDialog()
+                                })
+                        } else {
                             DeviceChannel.calling = false
+                            Constants.CALL_STATE = Constants.CALL_STANDBY
+                            showMessage("通话服务还未建立连接,请稍后")
                             VoiceUtil.rejectAudioCall(Integer.parseInt(Constants.ids), Constants.fromId, Constants.interactionId)
-                            CallDialogHelper.dismissCallDialog()
-                        })
+                        }
 
                     } else if (tcpModel.getAction() == TcpAction.VoiceAction.ACCEPT) {//对方接受语音
                         Log.e(TAG, "对方接受语音" + tcpModel.toJson())
@@ -791,7 +802,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                     } else if (tcpModel.action == TcpAction.VideoAction.SUCCESS) {
                         //显示探视窗口
                         Constants.CALL_STATE = Constants.CALL_STANDBY
-                        DeviceChannel.calling = false
+                        DeviceChannel.calling = true
                         VisitingWindow.createFloatView(activity, Constants.visit_bed_name)
                     } else if (tcpModel.action == TcpAction.VideoAction.FAILED) {
                         Constants.CALL_STATE = Constants.CALL_STANDBY

+ 15 - 4
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt

@@ -10,6 +10,7 @@ import com.alibaba.android.vlayout.DelegateAdapter
 import com.alibaba.android.vlayout.VirtualLayoutManager
 import com.enation.javashop.net.engine.model.NetState
 import com.scwang.smartrefresh.layout.footer.ClassicsFooter
+import com.wdkl.core.socket.SocketManager
 import com.wdkl.ncs.android.component.nursehome.R
 import com.wdkl.ncs.android.component.nursehome.adapter.*
 import com.wdkl.ncs.android.component.nursehome.common.Constants
@@ -187,8 +188,13 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
         call_the_voice_tv.setOnClickListener {
             //语音呼叫
             if (frame.customerName != null) {
-                VoiceUtil.startAudioCall(Integer.parseInt(Constants.ids), frame.bedDeviceId)
-                Constants.call_type = 0
+                //通话之前先判断webrtc socket是否连接上,否则不能建立通话
+                if (SocketManager.getInstance().socketOpen()) {
+                    VoiceUtil.startAudioCall(Integer.parseInt(Constants.ids), frame.bedDeviceId)
+                    Constants.call_type = 0
+                } else {
+                    showMessage("通话服务未建立连接,请检查网络或稍后再试")
+                }
             } else {
                 showMessage("床位未入住,无法通话")
             }
@@ -202,8 +208,13 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
         call_the_video_tv.setOnClickListener {
             //视频呼叫
             if (frame.customerName != null) {
-                VoiceUtil.startAudioCall(Integer.parseInt(Constants.ids), frame.bedDeviceId)
-                Constants.call_type = 1
+                //通话之前先判断webrtc socket是否连接上,否则不能建立通话
+                if (SocketManager.getInstance().socketOpen()) {
+                    VoiceUtil.startAudioCall(Integer.parseInt(Constants.ids), frame.bedDeviceId)
+                    Constants.call_type = 1
+                } else {
+                    showMessage("通话服务未建立连接,请检查网络或稍后再试")
+                }
             } else {
                 showMessage("床位未入住,无法通话")
             }

+ 7 - 0
webrtc/src/main/java/com/wdkl/core/socket/SocketManager.java

@@ -368,6 +368,13 @@ public class SocketManager implements IEvent {
     //===========================================================================================
 
 
+    public boolean socketOpen() {
+        if (webSocket != null) {
+            return webSocket.isOpen();
+        }
+        return false;
+    }
+
     public int getUserState() {
         return userState;
     }

+ 1 - 0
webrtc/src/main/java/com/wdkl/core/voip/AsyncPlayer.java

@@ -84,6 +84,7 @@ public class AsyncPlayer {
 
                         if (mPlayer != null) {
                             mPlayer.stop();
+                            mPlayer.reset();
                             mPlayer.release();
                             mPlayer = null;
                         } else {

+ 4 - 0
webrtc/src/main/java/com/wdkl/core/voip/SingleCallFragment.java

@@ -229,6 +229,10 @@ public abstract class SingleCallFragment extends Fragment {
             connectedActionContainer.setVisibility(View.GONE);
         refreshMessage(false);
         new Handler(Looper.getMainLooper()).postDelayed(() -> {
+            if (gEngineKit != null && gEngineKit.getCurrentSession() != null && gEngineKit.getCurrentSession().getState() != EnumType.CallState.Idle) {
+                gEngineKit.endCall();
+            }
+
             if (callSingleActivity != null) {
                 callSingleActivity.finish();
             }