浏览代码

#CHANGE 修改tcp连接相关逻辑

weizhengliang 3 年之前
父节点
当前提交
364b78bc4f

+ 2 - 0
app/build.gradle

@@ -29,6 +29,8 @@ android {
     buildToolsVersion build_tools_version
     aaptOptions.cruncherEnabled = false
     aaptOptions.useNewCruncher = false
+    aaptOptions.noCompress("mp3","wav")
+
     defaultConfig {
         applicationId "com.wdkl.app.ncs.nursehost"
         minSdkVersion min_sdk_version

+ 4 - 9
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/NurseHomeActivityContract.kt

@@ -8,22 +8,17 @@ import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
  * 获取设备数据接口
  */
 interface NurseHomeActivityContract{
-    /**
-     * 显示设备初始数据
-     */
+
     interface View :BaseContract.BaseView{
-        fun showData(categoryList: ArrayList<ChildCategoryShell>)
 
         fun showAppVersion(appInfo: AppVersionDO)
+
     }
 
-    /**
-     * 获取设备初始化数据
-     */
-    interface Presenter :BaseContract.BasePresenter{
-        fun loadData(parentId:Int)
 
+    interface Presenter :BaseContract.BasePresenter{
         //获取APP版本信息
         fun getAppVersion(partId: Int, deviceType: Int)
+
     }
 }

+ 0 - 7
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/NurseHomeActivityPresenter.kt

@@ -66,13 +66,6 @@ class NurseHomeActivityPresenter @Inject constructor() :RxPresenter<NurseHomeAct
         }
     }
 
-    /**
-     * 获取首页数据 待处理
-     */
-    override fun loadData(parentId: Int) {
-        //
-    }
-
     override fun getAppVersion(partId: Int, deviceType: Int) {
         nurseHomeApi.getAppVersion(partId, deviceType)
                 .map {

+ 12 - 3
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -27,7 +27,7 @@ import io.netty.util.CharsetUtil;
 public class TcpClient {
     private String TAG = TcpClient.class.getSimpleName();
 
-    private NioEventLoopGroup workGroup = new NioEventLoopGroup(2);
+    private NioEventLoopGroup workGroup;
     public Channel channel;
     private Bootstrap bootstrap;
 
@@ -55,6 +55,7 @@ public class TcpClient {
     //初始化Netty Tcp Client 并连接
     public void init(String serverIP, Integer serverPort, Integer heartBeatSeconds) {
         final Integer hbSeconds = heartBeatSeconds;
+        workGroup = new NioEventLoopGroup(2);
         bootstrap = new Bootstrap();
         bootstrap.group(workGroup)
                 .channel(NioSocketChannel.class)
@@ -69,7 +70,8 @@ public class TcpClient {
                         // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
                         socketChannel.pipeline().addLast(new LengthFieldPrepender(2));
                         //心跳包应当小于服务器间隔
-                        socketChannel.pipeline().addLast(new IdleStateHandler(0, 0,hbSeconds, TimeUnit.SECONDS));
+//                        socketChannel.pipeline().addLast(new IdleStateHandler(0, hbSeconds, 0, TimeUnit.SECONDS));
+                        socketChannel.pipeline().addLast(new IdleStateHandler(hbSeconds*2, hbSeconds, 0, TimeUnit.SECONDS));
                         socketChannel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(tcpClientHandler);
@@ -97,6 +99,7 @@ public class TcpClient {
             @Override
             public void operationComplete(ChannelFuture channelFuture) throws Exception {
                 if (channelFuture.isSuccess()){
+                    channel = channelFuture.channel();
                     isRunning = true;
                     retryTimes = 0;
                     System.out.println("connect success");
@@ -108,8 +111,9 @@ public class TcpClient {
                         @Override
                         public void run() {
                             retryTimes++;
-                            if (retryTimes>30){
+                            if (retryTimes>10){
                                 System.out.println("重试"+(retryTimes-1)+"次,结束");
+                                channel.close();
                                 workGroup.shutdownGracefully();
                                 inited = false;
                                 //todo: 从API获取新的serverIP和serverPort,全新连接
@@ -145,6 +149,11 @@ public class TcpClient {
         }
     }
 
+
+    public Channel getChannel() {
+        return channel;
+    }
+
     //测试
     public static void main(String[] args) {
 

+ 12 - 14
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java

@@ -33,7 +33,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     //总共总连接次数,总连接次数过多可能是网络不稳定
     private static Integer totalRetryTimes = 0;
     //是否连接成功
-    private static Boolean connected = false;
+    public static Boolean connected = false;
 
     //连接成功执行的方法
     @Override
@@ -85,18 +85,16 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     //写心跳包。没有消息发送时,每间隔一定时间会由此方法向服务端发送心跳
     @Override
     public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-        if (evt instanceof IdleStateEvent){
-            IdleStateEvent event = (IdleStateEvent)evt;
-            if (event.state()== IdleState.WRITER_IDLE){
-                //读心跳包超时执行
-                Log.i(TAG,"TcpClientHandler ===> WRITER_IDLE");
-            } else if (event.state() == IdleState.READER_IDLE){
-                //写心跳包超时
-                Log.i(TAG,"TcpClientHandler ===> READER_IDLE");
-            } else if (event.state() == IdleState.ALL_IDLE){
-                //写心跳包超时
-                Log.i(TAG,"TcpClientHandler ===> ALL_IDLE");
-                ctx.writeAndFlush("0");
+        if (evt instanceof IdleStateEvent) {
+            IdleStateEvent event = (IdleStateEvent) evt;
+            if (event.state() == IdleState.WRITER_IDLE) { //超时未执行写操作,在指定的超时时间内未有写操作,要发送心跳包,告诉服务器连接还存活。服务器收到心跳立马回应,正常客户端收到后执行读操作,
+                ctx.writeAndFlush("0");                //这种情况下不会引发READER_IDLE事件。如果服务器因为网络或其他原因导致回应的心跳,客户端没有收到,在超过写超时时间2个周期后依然没有收到,
+            } else if (event.state() == IdleState.READER_IDLE) { //认为服务不可用,主动断开连接
+                Log.i(TAG, "TcpClientHandler ===> READER_IDLE");
+                ctx.close();
+            } else if (event.state() == IdleState.ALL_IDLE) {
+                Log.i(TAG, "TcpClientHandler ===> ALL_IDLE");
+
             }
         }
     }
@@ -104,7 +102,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
         cause.printStackTrace();
-        ctx.close();
+        //ctx.close();
         connected = false;
         System.out.println("TcpClientHandler 失去连接,错误引起");
 

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

@@ -1,9 +1,5 @@
 package com.wdkl.ncs.android.component.nursehome.activity
 
-//import com.starrtc.demo.demo.MLOC
-//import com.starrtc.demo.demo.voip.VoipActivity
-//import com.starrtc.demo.demo.voip.VoipAudioActivity
-//import com.wdkl.ncs.android.component.nursehome.SipUtil.SipHelperUtil
 import android.app.NotificationManager
 import android.content.BroadcastReceiver
 import android.content.Context
@@ -46,13 +42,13 @@ import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.lib.widget.SOSDialog
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.NurseHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.NurseHomeActivityPresenter
-import com.wdkl.ncs.android.middleware.model.ChildCategoryShell
 import com.wdkl.ncs.android.middleware.model.bean.SettingConfiguration
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.vo.CallingHistoryVO
 import com.wdkl.ncs.android.middleware.model.vo.FrameBedVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.OtherUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VideoUtil
@@ -73,7 +69,7 @@ import java.util.*
  */
 @Router(path = "/nursehome/main")
 class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurseHomeBinding>(), NurseHomeActivityContract.View,
-        CallRecordsFragment.OnItemListener, View.OnClickListener, FramePartFragment.OnItemListener, SipCallBack, IUserState {
+        CallRecordsFragment.OnItemListener, View.OnClickListener, FramePartFragment.OnItemListener, IUserState {
     var TAG = NurseHomeActivity::class.java.getSimpleName()
 
 
@@ -94,11 +90,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
     //当前选中的button id
     var select_id: Int = 0
 
-    //来电设备id
-    //private var fromId: Int = -1
-    //Interaction ID
-    //private var interactionId: Int = -1
-
     /**
      * 提供layoutID
      */
@@ -118,10 +109,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         AppTool.SystemUI.showNavigationBar(this,false)
         AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
 
-        //SIP准备工作
-//        initSip()
-        //空间结构Fragment
-
         fragment = FramePartFragment()
         currentFragment = fragment
         supportFragmentManager.beginTransaction().add(R.id.middle_fralyout, fragment, "").commit()
@@ -130,8 +117,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         currentFragmentThree = callRecordsFragment
         supportFragmentManager.beginTransaction().add(R.id.left_framlyout, callRecordsFragment, "").commit()
 
-        //presenter.loadData(0)
-
         if (Build.VERSION.SDK_INT >= 23) {
             if (!Settings.canDrawOverlays(this)) {
                 val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
@@ -193,22 +178,11 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         registerReceiver(receiver, intentFilter)
     }
 
-    private fun initSip() {
-        //=============================================Sip启动服务===================================//
-        //SipHelperUtil.getInstance(this).sipStartService()
-        //=============================================SIP状态回调===================================//
-        //SipHelperUtil.getInstance(this).setSipCallBack(this)
-        //=============================================SIP服务监听===================================//
-        //SipHelperUtil.getInstance(this@NurseHomeActivity).obtainSipInfo()
-    }
-
     override fun userLogin() {
-        //debugLog("NurseHome", "user login")
         view_title_layout_tv_point.setBackgroundResource(R.color.green)
     }
 
     override fun userLogout() {
-        //debugLog("NurseHome", "user logout")
         view_title_layout_tv_point.setBackgroundResource(R.color.red_color)
     }
 
@@ -273,8 +247,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
 
         fragment?.setOnItemListener(this)
         callRecordsFragment?.setOnItemListener(this)
-//        call_bt.setOnClickListener(this)
-//        call_voice_bt.setOnClickListener(this)
     }
     /**
      *页面销毁回调
@@ -308,18 +280,12 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
      */
     override fun networkMonitor(state: NetState) {
     }
-    /**
-     *显示数据
-     */
-    override fun showData(categoryList: ArrayList<ChildCategoryShell>) {
-//        hello_api_data.setText(categoryList[0].toString())
-    }
 
     /**
      * callRecordsFragment的数据回调
      */
     override fun displayPersondalInformation(data: CallingHistoryVO) {
-        sickroom_and_sickbed_tv.text = "测试床位"
+//        sickroom_and_sickbed_tv.text = "测试床位"
 //        mViewBinding.rightRelyout.nameTv.text = "姓名:"+data.customer_name
 //        mViewBinding.rightRelyout.nameTv.text = "性別:"+data.customer_name
 //        mViewBinding.rightRelyout.nameTv.text = "年龄:"+data.customer_name
@@ -337,7 +303,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
     override fun theBedInformation(data: FrameBedVO) {
 //        sickroom_and_sickbed_tv.text = "测试床位"
 //        mViewBinding.rightRelyout.nameTv.text = "姓名:"+data.customerName
-        showMessage("点击了病床分机")
+//        showMessage("点击了病床分机")
     }
 
     override fun showAppVersion(appInfo: AppVersionDO) {
@@ -428,17 +394,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                    showRightFragment(SystemSettingsFragment())
                }
            }
-
-
-//           R.id.call_bt ->{
-//               showMessage("点击呼叫按钮")
-////               call(0)
-//           }
-//           R.id.call_voice_bt ->{
-//               showMessage("点击音频呼叫按钮")
-////               call(1)
-//               initiateCall("4000361830","","")
-//           }
        }
     }
 
@@ -488,60 +443,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         beginTransaction().func().commit()
     }
 
-
-/*fun call(tyte:Int){
-    var deviceHostingID = "742226"
-    MLOC.saveVoipUserId(this, deviceHostingID)
-    Log.e(TAG, "initDataEntity.getDeviceHostingID() " + deviceHostingID)
-    if (tyte == 0) {
-        val intent = Intent(this, VoipActivity::class.java)
-        intent.putExtra("targetId", deviceHostingID)
-        intent.putExtra(VoipActivity.ACTION, VoipActivity.CALLING)
-        startActivity(intent)
-    }else if (tyte == 1){
-        val intent = Intent(this, VoipAudioActivity::class.java)
-        intent.putExtra("targetId", deviceHostingID)
-        intent.putExtra(VoipAudioActivity.ACTION, VoipAudioActivity.CALLING)
-        startActivity(intent)
-       }
-  }*/
-
-    /**
-     * sip开始通话    ------------------sip回调操作----------------------
-     */
-    override fun startCall(sipAddress: String?) {
-        //SipHelperUtil.getInstance(this).startCall(sipAddress)
-    }
-
-    /**
-     * sip自动接听
-     */
-    override fun autoTalking() {
-        //SipHelperUtil.getInstance(this).autoTalking()
-    }
-
-    /**
-     * sip结束通话
-     */
-    override fun endCall() {
-        //SipHelperUtil.getInstance(this).endCall()
-    }
-
-    fun initiateCall(sipAddress: String, type: String, mac: String) {
-        //=============================================SIP拨打电话===================================//
-        //SipHelperUtil.getInstance(this).getmSipCallBack().startCall(sipAddress)
-
-    }
-
-    /**
-     * 结束电话
-     */
-    fun endCalled() {
-        //20171219
-        //=============================================SIP结束电话===================================//
-        //SipHelperUtil.getInstance(this).getmSipCallBack().endCall()
-    }
-
     /**
      * 更新时间广播
      */
@@ -591,9 +492,6 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             } else if (intent.action == ConnectivityManager.CONNECTIVITY_ACTION) {
                 updateNetState()
                 if (NetHelper.getInstance().networkAvailable()) {
-                    if (!Constants.tcp_connected) {
-                        TcpClient.getInstance().doConnect()
-                    }
                     if (SocketManager.getInstance().userState == 0) {
                         //如果socket断开了则重连
                         connectSocket()
@@ -909,6 +807,16 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             //TCP连接状态
             Constants.EVENT_TCP_STATE -> {
                 updateTcpState()
+                //网络连接上,如果tcp是断开状态则重新连接
+                if (!TcpClientHandler.connected && NetHelper.getInstance().networkAvailable()) {
+                    if (TcpClient.getInstance().getChannel() == null || !TcpClient.getInstance().getChannel().isOpen()) {
+                        Thread ( Runnable {
+                            run {
+                                TcpClient.getInstance().init(Constants.tcp_ip, Constants.tcp_port!!.toInt(), Constants.reader_idle_time!!.toInt())
+                            }
+                        }).start()
+                    }
+                }
             }
         }
 

+ 7 - 1
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/RegisterActivity.kt

@@ -25,6 +25,7 @@ import com.wdkl.ncs.android.component.nursehome.common.Constants
 //import com.wdkl.ncs.android.component.nursehome.service.RTCKeepLiveService
 import com.wdkl.ncs.android.component.nursehome.util.NetHelper
 import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.api.UrlManager
 import com.wdkl.ncs.android.middleware.logic.contract.nursehome.DeviceContract
 import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.DevicePresenter
 import com.wdkl.ncs.android.middleware.model.bean.SettingConfiguration
@@ -96,7 +97,12 @@ class RegisterActivity : BaseActivity<DevicePresenter, ActivityRegisterBinding>(
         }.start()
         val macAddr = NetHelper.getInstance().macAddress
         val ipAddr = NetHelper.getInstance().localIP
-        tv_local_ip.text = "本机IP: " + ipAddr
+        val server = UrlManager.build()
+        var serverIp = ""
+        if (server.buyer.length > 14) {
+            serverIp = server.buyer.substring(7, 14)
+        }
+        tv_local_ip.text = "本机IP: " + ipAddr + ", server: " + serverIp
         tv_local_mac.text = "本机MAC: " + macAddr
         tv_app_version.text = "APP版本: V" + BuildConfig.VERSION_NAME
         //tv_mcu_version.text = "MCU版本: " + Constants.MCU_VERSION_NUMBER