Jelajahi Sumber

## [1.2.0] version 80 - 2020-11-02
### Changed
- 更换TcpClient 为 NettyClient,使用观察者,连接,重连及发送消息须实现 subscribe

allen 3 tahun lalu
induk
melakukan
425eb85f73
33 mengubah file dengan 475 tambahan dan 410 penghapusan
  1. TEMPAT SAMPAH
      .gradle/4.10.1/fileChanges/last-build.bin
  2. 0 0
      .gradle/4.10.1/gc.properties
  3. 0 0
      .gradle/vcs-1/gc.properties
  4. 0 0
      .gradle/vcsWorkingDirs/gc.properties
  5. 4 0
      WebRTC/build.gradle
  6. 0 3
      app/build.gradle
  7. 2 2
      build.gradle
  8. 8 0
      common/build.gradle
  9. 4 0
      home/build.gradle
  10. 12 2
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/SOSEmergencyCallActivity.kt
  11. 0 1
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/TakeoverActivity.kt
  12. 11 2
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt
  13. 28 5
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt
  14. 5 25
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt
  15. 13 4
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchUserSettingActivity.java
  16. 28 5
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt
  17. 49 14
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioRingingActivity.kt
  18. 54 18
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/NewEventItemAdapter.kt
  19. 22 9
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemAdapter.kt
  20. 2 3
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt
  21. 6 39
      home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt
  22. 59 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/HandleTcpConnect.kt
  23. 0 36
      home/src/main/code/com/wdkl/ncs/android/component/home/util/TcpCallbackImpl.java
  24. 4 0
      keepalive/build.gradle
  25. 4 3
      middleware/build.gradle
  26. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt
  27. 0 5
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/ITcpCallBack.java
  28. 125 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/NettyClient.kt
  29. 0 185
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java
  30. 19 47
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java
  31. 7 1
      readme.md
  32. 4 0
      resource/build.gradle
  33. 4 0
      rtc-chat/build.gradle

TEMPAT SAMPAH
.gradle/4.10.1/fileChanges/last-build.bin


+ 0 - 0
.gradle/4.10.1/gc.properties


+ 0 - 0
.gradle/vcs-1/gc.properties


+ 0 - 0
.gradle/vcsWorkingDirs/gc.properties


+ 4 - 0
WebRTC/build.gradle

@@ -33,6 +33,10 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 
 }
 

+ 0 - 3
app/build.gradle

@@ -122,9 +122,6 @@ dependencies {
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
 //    compile project(':starRTC')
 }
-repositories {
-    mavenCentral()
-}
 
 ///**
 // * kawo组件化框架配置

+ 2 - 2
build.gradle

@@ -47,12 +47,12 @@ buildscript {
     /**
      * APP版本码
      */
-    ext.app_version_code = 79
+    ext.app_version_code = 80
 
     /**
      * APP版本号
      */
-    ext.app_version = "1.1.61"
+    ext.app_version = "1.2.0"
 
     /**
      * 项目依赖库

+ 8 - 0
common/build.gradle

@@ -38,6 +38,10 @@ android {
 //        main.jni.srcDirs = []
 //        main.jniLibs.srcDir 'src/main/libs'
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 }
 
 dependencies {
@@ -240,6 +244,10 @@ dependencies {
     compile 'org.greenrobot:eventbus:3.0.0'
 
     compile 'com.github.anrwatchdog:anrwatchdog:1.3.+'
+
+//    compile('io.reactivex.rxjava2:rxandroid:2.1.0') {
+//        exclude group: 'io.reactivex.rxjava2'
+//    }
 }
 
 repositories {

+ 4 - 0
home/build.gradle

@@ -58,6 +58,10 @@ android {
             }
         }
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 }
 
 //获取编译日期

+ 12 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/activity/SOSEmergencyCallActivity.kt

@@ -5,17 +5,19 @@ import android.content.Context
 import android.os.Bundle
 import android.os.VibrationEffect
 import android.os.Vibrator
+import android.util.Log
 import android.view.KeyEvent
 import android.view.View
 import com.google.gson.Gson
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.service.WdKeepAliveService
+import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 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.dto.TcpModel
@@ -77,7 +79,15 @@ class SOSEmergencyCallActivity : Activity(), View.OnClickListener {
                 MediaPlayHelper.getInstance().releaseMusic()
                 //给服务器发送处理SOStcp
                 var otherUtilTcpModel = OtherUtil.SOSCancel(Constants.deviceId.toInt(), tcpModel?.fromId, interactionVO?.id)
-                TcpClient.getInstance().sendMsg(otherUtilTcpModel.toJson())
+                NettyClient.instance.sendMsg(otherUtilTcpModel.toJson()).subscribe {
+                    if (it) {
+                        Log.d(TAG, "TCP.发送消息完成")
+                    } else {
+                        Log.e(TAG, "TCP.发送消息失败")
+
+                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                    }
+                }
                 if (mVibrator!=null) {
                     mVibrator.cancel()
                 }

+ 0 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/activity/TakeoverActivity.kt

@@ -18,7 +18,6 @@ import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.logic.contract.home.TakeoverContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.TakeoverPresenter
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction

+ 11 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt

@@ -15,6 +15,7 @@ import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.adapter.WatchCallRecordsItemAdapter
 import com.wdkl.ncs.android.component.home.databinding.WatchActivityCallRecordsBinding
 import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.utils.showMessage
@@ -22,7 +23,7 @@ import com.wdkl.ncs.android.middleware.logic.contract.home.WatchCallRecordsFragm
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchCallRecordsFragmentPresenter
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
@@ -133,7 +134,15 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
                     loadingDialog.show()
                     call_relyout.isEnabled = false
                     var tcpModel = VoiceUtil.voiceCall(Constants.deviceId, receivedData!!.deviceId)
-                    TcpClient.getInstance().sendMsg(tcpModel.toJson())
+                    NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                        if (it) {
+                            Log.d(TAG, "TCP.发送消息完成")
+                        } else {
+                            Log.e(TAG, "TCP.发送消息失败")
+                            HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                        }
+                        loadingDialog.dismiss()
+                    }
                     countDownTimer.start()
                 }
 

+ 28 - 5
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt

@@ -15,6 +15,7 @@ import com.google.gson.Gson
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.databinding.WatchActivityEventDetailBinding
 import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.home.util.SpeechUtil
 import com.wdkl.ncs.android.component.nursehome.common.Constants
@@ -30,7 +31,7 @@ import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.DeviceVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.channel.EventUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.ImUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
@@ -108,9 +109,16 @@ class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchA
                 tcpModel = VoiceUtil.voiceCall(Constants.deviceId, interactionVO?.toDeviceId)
             }
 
-            TcpClient.getInstance().sendMsg(tcpModel?.toJson())
+            NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                if (it) {
+                    Log.d(TAG, "TCP.发送消息完成")
+                } else {
+                    Log.e(TAG, "TCP.发送消息失败")
+                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                }
+                loadingDialog.dismiss()
+            }
             countDownTimer.start()
-
             SpeechUtil.getInstance().stopSpeak()
         }
 
@@ -120,13 +128,28 @@ class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchA
             if (tcpModel?.type == TcpType.EVENT) {
                 loadingDialog.show()
                 val tcpModel = EventUtil.eventResponse(Constants.deviceId, interactionVO!!.fromDeviceId, interactionVO!!.id)
-                TcpClient.getInstance().sendMsg(tcpModel.toJson())
+                NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                    if (it) {
+                        Log.d(TAG, "TCP.发送消息完成")
+                    } else {
+                        Log.e(TAG, "TCP.发送消息失败")
+                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                    }
+                    loadingDialog.dismiss()
+                }
             } else if (tcpModel?.type == TcpType.IM) {
                 //todo: 语音播放
                 if (!Constants.deviceId.equals("")) {
                     if (interactionVO!!.actionEnd == null) {
                         var imUtilTcpModel = ImUtil.imRead(Constants.deviceId.toInt(), interactionVO!!.fromDeviceId, interactionVO!!.id)
-                        TcpClient.getInstance().sendMsg(imUtilTcpModel.toJson())
+                        NettyClient.instance.sendMsg(imUtilTcpModel.toJson()).subscribe {
+                            if (it) {
+                                Log.d(TAG, "TCP.发送消息完成")
+                            } else {
+                                Log.e(TAG, "TCP.发送消息失败")
+                                HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                            }
+                        }
 //                        var mediaPlayer = MediaPlayer()
 //                    mediaPlayer.startMediaPlayer( Constants.eth_ip +interactionVO!!.data)
 //                    mediaPlayer.setVolume(0.3f)

+ 5 - 25
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt

@@ -34,7 +34,6 @@ import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.home.util.*
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.base.BaseActivity
-import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.joinManager
 import com.wdkl.ncs.android.lib.utils.push
@@ -46,8 +45,7 @@ import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.DeviceVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.ITcpCallBack
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import com.wdkl.ncs.keepbackground.utils.SpManager
 import com.wdkl.ncs.keepbackground.work.DaemonEnv
@@ -74,8 +72,6 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
     lateinit var netOffLoadingDialog: LoadingDialog
     lateinit var countDownTimer: CountDownTimer
 
-    val iTcpCallBack:ITcpCallBack = TcpCallbackImpl()
-
     private val WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 127//这个值是自定义的一个int值,在申请多个权限时要
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -280,26 +276,10 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         Constants.deviceId = data.id
         Constants.sipId = data.sipId
 
-        if (Strings.isNullOrEmpty(data.ethIp)){
-            Thread(Runnable {
-                //连接TCP
-                if (TcpClient.getInstance().channel==null || !TcpClient.getInstance().channel.isActive) {
-                    TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat,iTcpCallBack)
-                }
-                while (!(TcpClient.getInstance().channel==null || !TcpClient.getInstance().channel.isActive)) {
-                    presenter.getDeviceVO(Constants.imei)
-                    Thread.sleep(1000)
-                }
-            }).start()
-            showMessage("获取设备数据中,请稍候")
-            return
-        } else {
-            Thread(Runnable {
-                //连接TCP
-                if (TcpClient.getInstance().channel==null || !TcpClient.getInstance().channel.isActive) {
-                    TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat,iTcpCallBack)
-                }
-            }).start()
+        if (NettyClient.instance.getChannel() == null){
+            HandleTcpConnect.instance.tcpInitConnect()
+        } else if (!NettyClient.instance.isConnect()){
+            HandleTcpConnect.instance.tcpReConnect()
         }
 
         loadingDialog.dismiss()

+ 13 - 4
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchUserSettingActivity.java

@@ -11,6 +11,7 @@ import android.provider.Settings;
 import android.support.annotation.Nullable;
 import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
+import android.util.Log;
 import android.view.View;
 import android.widget.Button;
 import android.widget.SeekBar;
@@ -27,7 +28,7 @@ import com.wdkl.ncs.android.component.home.util.NetHelper;
 import com.wdkl.ncs.android.component.nursehome.common.Constants;
 import com.wdkl.ncs.android.lib.utils.AppTool;
 import com.wdkl.ncs.android.lib.utils.ExtendMethodsKt;
-import com.wdkl.ncs.android.middleware.tcp.TcpClient;
+import com.wdkl.ncs.android.middleware.tcp.NettyClient;
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.utils.MessageEvent;
@@ -37,6 +38,7 @@ import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
 public class WatchUserSettingActivity extends Activity {
+    private static final String TAG = WatchUserSettingActivity.class.getSimpleName();
 
     private TextView tvAppVersion,tvDeviceId,tvDeviceImei,tvDeviceIp,tvServerIp;
 
@@ -68,9 +70,16 @@ public class WatchUserSettingActivity extends Activity {
             @Override
             public void onClick(View view) {
                 TcpModel userChangeModel = DeviceUtil.userChange(Constants.Companion.getDeviceId());
-                TcpClient.getInstance().sendMsg(userChangeModel.toJson());
-                ExtendMethodsKt.showMessage("换班通知发送成功,请等待处理...");
-                WatchUserSettingActivity.this.finish();
+                NettyClient.Companion.getInstance().sendMsg(userChangeModel.toJson()).subscribe(it->{
+                    if (it) {
+                        Log.d(TAG, "TCP.发送消息完成");
+                        ExtendMethodsKt.showMessage("换班通知发送成功,请等待处理...");
+                        WatchUserSettingActivity.this.finish();
+                    } else {
+                        Log.e(TAG, "TCP.发送消息失败");
+                        ExtendMethodsKt.showMessage("换班通知发送失败,请重试");
+                    }
+                });
             }
         });
 

+ 28 - 5
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt

@@ -14,12 +14,13 @@ import com.google.gson.Gson
 import com.wdkl.core.socket.SocketManager
 import com.wdkl.core.voip.VoipEvent
 import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
@@ -175,8 +176,16 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener, CallSessionCal
                                 gEngineKit?.endCall()
                                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                                 val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Constants.deviceId, tcpModel.toId, interactionVO.id)
-                                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
-                                finish()
+                                NettyClient.instance.sendMsg(voiceUtilTcpModel.toJson()).subscribe {
+                                    if (it) {
+                                        Log.d(TAG, "TCP.发送消息完成")
+                                    } else {
+                                        Log.e(TAG, "TCP.发送消息失败")
+
+                                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                    }
+                                    finish()
+                                }
                             }
                         }).start()
 
@@ -259,10 +268,24 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener, CallSessionCal
         if (tcpModel.type == TcpType.VOICE) {
             if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
                 val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Constants.deviceId, interactionVO.toDeviceId, interactionVO.id)
-                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                NettyClient.instance.sendMsg(voiceUtilTcpModel.toJson()).subscribe {
+                    if (it) {
+                        Log.d(TAG, "TCP.发送消息完成")
+                    } else {
+                        Log.e(TAG, "TCP.发送消息失败")
+                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                    }
+                }
             } else if (tcpModel.action === TcpAction.VoiceAction.CALL) {
                 val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Constants.deviceId, tcpModel.fromId, interactionVO.id)
-                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                NettyClient.instance.sendMsg(voiceUtilTcpModel.toJson()).subscribe {
+                    if (it) {
+                        Log.d(TAG, "TCP.发送消息完成")
+                    } else {
+                        Log.e(TAG, "TCP.发送消息失败")
+                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                    }
+                }
             }
         }
         tcpHandOff = true

+ 49 - 14
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioRingingActivity.kt

@@ -16,16 +16,19 @@ import android.util.Log
 import android.view.KeyEvent
 import android.view.View
 import com.google.gson.Gson
+import com.wdkl.core.socket.SocketManager
 import com.wdkl.core.util.ActivityStackManager
 import com.wdkl.core.voip.AsyncPlayer
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.broadcast.MyMediaButtonReceiver
 import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
+import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
@@ -115,10 +118,17 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
                 DeviceChannel.calling = false
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                 val voiceTransferTcpModel = VoiceUtil.voiceTransfer(Constants.deviceId, tcpModel.fromId, interactionVO)
-                TcpClient.getInstance().sendMsg(voiceTransferTcpModel.toJson())
-                mVibrator.cancel()
-//                asyncPlayer.stop()
-                finish()
+                NettyClient.instance.sendMsg(voiceTransferTcpModel.toJson()).subscribe {
+                    if (it) {
+                        Log.d(TAG, "TCP.发送消息完成")
+                    } else {
+                        Log.e(TAG, "TCP.发送消息失败")
+                        HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                    }
+                    mVibrator.cancel()
+                    finish()
+                }
+
             }
             R.id.hang_up_imagev ->{
                 rejectCall()
@@ -137,10 +147,18 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         //t给服务器发送拒接 tcp
         val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
         val voiceUtilTcpModel = VoiceUtil.voiceReject(Constants.deviceId, tcpModel.fromId, interactionVO.id)
-        TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
-        mVibrator.cancel()
-//        asyncPlayer.stop()
-        finish()
+        NettyClient.instance.sendMsg(voiceUtilTcpModel.toJson()).subscribe {
+            if (it) {
+                Log.d(TAG, "TCP.发送消息完成")
+            } else {
+                Log.e(TAG, "TCP.发送消息失败")
+
+                HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+            }
+            mVibrator.cancel()
+            finish()
+        }
+
     }
 
     fun answerCall(){
@@ -152,7 +170,15 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         //给服务器发送接听 tcp
         val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
         val voiceUtilTcpModel = VoiceUtil.voiceAccept(Constants.deviceId, tcpModel.fromId, interactionVO.id)
-        TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+        NettyClient.instance.sendMsg(voiceUtilTcpModel.toJson()).subscribe {
+            if (it) {
+                Log.d(TAG, "TCP.发送消息完成")
+            } else {
+                Log.e(TAG, "TCP.发送消息失败")
+
+                HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+            }
+        }
         mVibrator.cancel()
         val intent = Intent(this, WebRTCVoipAudioActivity::class.java)
         intent.putExtra("targetId", targetId)
@@ -180,10 +206,19 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
                 //todo 给服务器发送转接 tcp
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                 val voiceTransferTcpModel = VoiceUtil.voiceTransfer(Constants.deviceId, tcpModel.fromId, interactionVO)
-                TcpClient.getInstance().sendMsg(voiceTransferTcpModel.toJson())
-                mVibrator.cancel()
-//                asyncPlayer.stop()
-                 finish()
+                NettyClient.instance.sendMsg(voiceTransferTcpModel.toJson())
+                        .subscribe {
+                            if (it) {
+                                Log.d(TAG, "TCP.发送消息完成")
+                            } else {
+                                Log.e(TAG, "TCP.发送消息失败")
+
+                                HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                            }
+                            mVibrator.cancel()
+                            finish()
+                        }
+
             }
         }
 

+ 54 - 18
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/NewEventItemAdapter.kt

@@ -3,6 +3,7 @@ package com.wdkl.ncs.android.component.home.adapter
 import android.content.Context
 import android.graphics.Color
 import android.os.Handler
+import android.util.Log
 import android.view.View
 import android.view.ViewGroup
 import com.alibaba.android.vlayout.LayoutHelper
@@ -12,17 +13,20 @@ import com.enation.javashop.utils.base.widget.LoadingDialog
 import com.google.gson.Gson
 import com.umeng.socialize.a.b.d.l
 import com.umeng.weixin.handler.r
+import com.wdkl.core.socket.SocketManager
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.databinding.EventListItemBinding
+import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.home.util.Util
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.component.nursehome.util.TimeTransition
 import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
+import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.api.ApiManager
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.channel.EventUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.ImUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.OtherUtil
@@ -33,6 +37,7 @@ import org.greenrobot.eventbus.EventBus
 
 
 class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val context: Context) : BaseDelegateAdapter<BaseRecyclerViewHolder<EventListItemBinding>, InteractionVO>() {
+    val TAG = NewEventItemAdapter::class.simpleName
 
     private lateinit var loadingDialog: LoadingDialog
 
@@ -82,10 +87,15 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val context: Contex
                         binding.eliEventResponse.setOnClickListener {
                             loadingDialog.show()
                             val tcpModel = EventUtil.eventResponse(Constants.deviceId, itemData.fromDeviceId, itemData.id)
-                            TcpClient.getInstance().sendMsg(tcpModel.toJson())
-                            Handler().postDelayed({
+                            NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                                if (it) {
+                                    Log.d(TAG, "TCP.发送消息完成")
+                                } else {
+                                    Log.e(TAG, "TCP.发送消息失败")
+                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                }
                                 loadingDialog.dismiss()
-                            }, 1000)
+                            }
                         }
                     }
                 }
@@ -107,7 +117,15 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val context: Contex
                         binding.eliImRead.setOnClickListener {
                             MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + itemData.data, 1f, false)
                             val tcpModel = ImUtil.imRead(Constants.deviceId, itemData.fromDeviceId, itemData.id)
-                            TcpClient.getInstance().sendMsg(tcpModel.toJson())
+                            NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                                if (it) {
+                                    Log.d(TAG, "TCP.发送消息完成")
+                                } else {
+                                    Log.e(TAG, "TCP.发送消息失败")
+
+                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                }
+                            }
                         }
                     }
                 }
@@ -124,14 +142,18 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val context: Contex
                         binding.eliEventResponse.setOnClickListener {
                             loadingDialog.show()
                             val tcpModel = OtherUtil.SOSCancel(Constants.deviceId, itemData.fromDeviceId, itemData.id)
-                            TcpClient.getInstance().sendMsg(tcpModel.toJson())
-
-                            tcpModel.data = Gson().toJson(itemData)
-                            EventBus.getDefault().post(MessageEvent(tcpModel,999))
-
-                            Handler().postDelayed({
+                            NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                                if (it) {
+                                    Log.d(TAG, "TCP.发送消息完成")
+                                    tcpModel.data = Gson().toJson(itemData)
+                                    EventBus.getDefault().post(MessageEvent(tcpModel,999))
+                                } else {
+                                    Log.e(TAG, "TCP.发送消息失败")
+
+                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                }
                                 loadingDialog.dismiss()
-                            }, 1000)
+                            }
                         }
                     }
                 }
@@ -145,15 +167,29 @@ class NewEventItemAdapter(var data:ArrayList<InteractionVO>, val context: Contex
                 loadingDialog.show()
                 if (itemData.fromDeviceMemberId == Constants.memberId){
                     val tcpModel = VoiceUtil.voiceCall(Constants.deviceId, itemData.toDeviceId)
-                    TcpClient.getInstance().sendMsg(tcpModel.toJson())
+                    NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                        if (it) {
+                            Log.d(TAG, "TCP.发送消息完成")
+                        } else {
+                            Log.e(TAG, "TCP.发送消息失败")
+
+                            HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                        }
+                        loadingDialog.dismiss()
+                    }
                 } else {
                     val tcpModel = VoiceUtil.voiceCall(Constants.deviceId, itemData.fromDeviceId)
-                    TcpClient.getInstance().sendMsg(tcpModel.toJson())
-                }
+                    NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                        if (it) {
+                            Log.d(TAG, "TCP.发送消息完成")
+                        } else {
+                            Log.e(TAG, "TCP.发送消息失败")
 
-                Handler().postDelayed({
-                    loadingDialog.dismiss()
-                },2000)
+                            HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                        }
+                        loadingDialog.dismiss()
+                    }
+                }
             }
         }
     }

+ 22 - 9
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/TakeoverItemAdapter.kt

@@ -11,18 +11,21 @@ import com.enation.javashop.utils.base.tool.CommonTool
 import com.enation.javashop.utils.base.widget.LoadingDialog
 import com.google.common.base.Strings
 import com.google.gson.JsonObject
+import com.wdkl.core.socket.SocketManager
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.databinding.TakeoverItemBinding
+import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.lib.utils.showMessage
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import kotlinx.android.synthetic.main.takeover_item.*
 
 class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context) : BaseDelegateAdapter<BaseRecyclerViewHolder<TakeoverItemBinding>, JsonObject>(){
+    val TAG = "TakeoverItemAdapter"
 
     private lateinit var loadingDialog: LoadingDialog
 
@@ -39,7 +42,7 @@ class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context)
     }
 
     override fun onCreateLayoutHelper(): LayoutHelper {
-        Log.i("abc",data.toString())
+        Log.i(TAG,data.toString())
         loadingDialog = CommonTool.createLoadingDialog(context, R.layout.custom_loading,R.id.loadding_image)
         return LinearLayoutHelper(0,data.size)
     }
@@ -59,13 +62,18 @@ class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context)
                 binding.btnUserChange.setOnClickListener {
                     CommonTool.createVerifyDialog("确认切换吗","取消","确定",context,object : CommonTool.DialogInterface{
                         override fun yes() {
-                            var tcpModel = DeviceUtil.deviceChange(Constants.deviceId, itemData.get("id").asInt)
-                            TcpClient.getInstance().sendMsg(tcpModel.toJson())
                             loadingDialog.show()
                             showMessage("切换中,请稍候")
-                            Handler().postDelayed({
+                            var tcpModel = DeviceUtil.deviceChange(Constants.deviceId, itemData.get("id").asInt)
+                            NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                                if (it) {
+                                    Log.d(TAG, "TCP.发送消息完成")
+                                } else {
+                                    Log.e(TAG, "TCP.发送消息失败")
+                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                }
                                 loadingDialog.dismiss()
-                            },3000)
+                            }
                         }
                         override fun no() {
                         }
@@ -76,10 +84,15 @@ class TakeoverItemAdapter(var data:ArrayList<JsonObject>, val context: Context)
                 binding.btnCallOut.setOnClickListener {
                     loadingDialog.show()
                     val tcpModel = VoiceUtil.voiceCall(Constants.deviceId, itemData.get("id").asInt)
-                    TcpClient.getInstance().sendMsg(tcpModel.toJson())
-                    Handler().postDelayed({
+                    NettyClient.instance.sendMsg(tcpModel.toJson()).subscribe {
+                        if (it) {
+                            Log.d(TAG, "TCP.发送消息完成")
+                        } else {
+                            Log.e(TAG, "TCP.发送消息失败")
+                            HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                        }
                         loadingDialog.dismiss()
-                    },3000)
+                    }
                 }
             }
         }

+ 2 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt

@@ -15,7 +15,6 @@ import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.api.UrlManager
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.channel.EventUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.ImUtil
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
@@ -190,7 +189,7 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
 //                    run {
 //                        if (!Constants.deviceId.equals("")) {
 //                            var eventTcpModel = EventUtil.eventResponse(Constants.deviceId.toInt(), itemData.fromDeviceId, itemData.id)
-//                            TcpClient.getInstance().sendMsg(eventTcpModel.toJson())
+//                            NettyClient.Companion.getInstance().sendMsg(eventTcpModel.toJson())
 //                        } else {
 //                            showMessage("获取不到当给前设备id")
 //                        }
@@ -207,7 +206,7 @@ class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDele
 //                    run {
 //                        if (!Constants.deviceId.equals("")) {
 //                            var imUtilTcpModel = ImUtil.imRead(Constants.deviceId.toInt(), itemData.fromDeviceId, itemData.id)
-//                            TcpClient.getInstance().sendMsg(imUtilTcpModel.toJson())
+//                            NettyClient.Companion.getInstance().sendMsg(imUtilTcpModel.toJson())
 //                            MediaPlayHelper.getInstance().playUrlMusic(UrlManager.build().device_url+itemData.data,0.8f,false)
 //                        } else {
 //                            showMessage("获取不到当给前设备id")

+ 6 - 39
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -1,9 +1,5 @@
 package com.wdkl.ncs.android.component.home.service
 
-import android.app.Activity
-import android.app.ActivityManager
-import android.content.ComponentName
-import android.content.Context
 import android.content.Intent
 import android.os.Handler
 import android.os.IBinder
@@ -17,20 +13,15 @@ import com.google.gson.Gson
 import com.google.gson.GsonBuilder
 import com.wdkl.core.consts.Urls
 import com.wdkl.core.socket.SocketManager
-import com.wdkl.core.util.ActivityStackManager
-import com.wdkl.ncs.android.component.home.BuildConfig
 import com.wdkl.ncs.android.component.home.activity.*
 import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.home.util.*
 import com.wdkl.ncs.android.component.nursehome.common.Constants
-import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.getJsonString
 import com.wdkl.ncs.android.middleware.api.ApiManager
 import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
-import com.wdkl.ncs.android.middleware.tcp.ITcpCallBack
-import com.wdkl.ncs.android.middleware.tcp.TcpClient
-import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
@@ -54,25 +45,9 @@ class WdKeepAliveService : AbsWorkService() {
     }
 
     private var mIsRunning = false
-    val iTcpCallBack: ITcpCallBack = TcpCallbackImpl()
 
     override fun startWork() {
         EventBus.getDefault().register(this)
-
-        /*
-        if (!SocketManager.getInstance().connectFlag){
-            Thread(Runnable {
-                run {
-                    //连接RTC
-                    while (Strings.isNullOrEmpty(Constants.sipId)){
-                        Thread.sleep(400)
-                    }
-                    SocketManager.getInstance().connect(Urls.WS, Constants.sipId, 0)
-                }
-            }).start()
-        }
-         */
-
         checkNetState()
     }
 
@@ -304,24 +279,16 @@ class WdKeepAliveService : AbsWorkService() {
 
     fun reConnect() {
         if (NetHelper.getInstance().getNetworkState(this@WdKeepAliveService) != NetHelper.NETWORK_NONE) {
-            if (!TextUtils.isEmpty(Constants.sipId) && !SocketManager.getInstance().userState.equals(1)) { //webrtc 断线重连
-                SocketManager.getInstance().connect(Urls.WS, Constants.sipId, 0)
-            }
 
-            if (!TcpClientHandler.getConnected()) {
-                Log.w(TAG, "断网唤醒CPU")
-//                val wakeLock = Util.wakeUpAndUnlock(this@WdKeepAliveService)
-                if (TcpClient.getInstance().retryTimes < 30) {
-                   TcpClient.getInstance().init(Constants.tcpServer, Constants.tcpPort, Constants.heartBeat, iTcpCallBack)
-                } else {
-                    AppUtils.restartApp()
-                }
+            if (NettyClient.instance.getChannel() == null){
+                HandleTcpConnect.instance.tcpInitConnect()
+            } else if (!NettyClient.instance.isConnect()){
+                HandleTcpConnect.instance.tcpReConnect()
             } else {
-                //TcpClient.getInstance().sendMsg("0")
                 if (SocketManager.getInstance().connectFlag) {
                     EventBus.getDefault().post(MessageEvent(TcpModel(), Constants.EVENT_RTC_STATE))
                 } else {
-                    iTcpCallBack.connected()
+                    SocketManager.getInstance().reConnect()
                 }
             }
         } else {

+ 59 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/HandleTcpConnect.kt

@@ -0,0 +1,59 @@
+package com.wdkl.ncs.android.component.home.util
+
+import android.annotation.SuppressLint
+import android.util.Log
+import com.wdkl.core.consts.Urls
+import com.wdkl.core.socket.SocketManager
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.tcp.NettyClient
+import io.reactivex.Observable
+
+class HandleTcpConnect {
+    val TAG = HandleTcpConnect::class.simpleName
+
+    /*伴生对象*/
+    companion object {
+        var instance = HandleTcpConnect()
+    }
+
+    @SuppressLint("CheckResult")
+    fun tcpInitConnect(){
+        NettyClient.instance.connect(Constants.tcpServer,Constants.tcpPort,Constants.heartBeat.toLong()).subscribe {
+            if (it){
+                Log.d(TAG, "TCP.连接成功,开始连接RTC")
+                SocketManager.getInstance().unConnect()
+                SocketManager.getInstance().connect(Urls.WS,Constants.sipId,0)
+            } else {
+                Log.e(TAG, "TCP.连接失败")
+            }
+        }
+    }
+
+    @SuppressLint("CheckResult")
+    fun tcpReConnect(){
+        NettyClient.instance.reConnect().subscribe {
+            if (it){
+                Log.d(TAG, "TCP.重连成功,开始重连RTC")
+                SocketManager.getInstance().reConnect()
+            } else {
+                Log.e(TAG, "TCP.重连失败")
+            }
+        }
+    }
+
+    @SuppressLint("CheckResult")
+    fun tcpReConnectWithMsgShow(){
+        showMessage("服务连接失败,正在重连")
+        NettyClient.instance.reConnect().subscribe{
+            if (it){
+                Log.d(TAG, "服务重连成功")
+                SocketManager.getInstance().reConnect()
+                showMessage("重连成功,请重试")
+            } else {
+                Log.d(TAG, "服务重连失败")
+                showMessage("重连失败,请尝试重启APP")
+            }
+        }
+    }
+}

+ 0 - 36
home/src/main/code/com/wdkl/ncs/android/component/home/util/TcpCallbackImpl.java

@@ -1,36 +0,0 @@
-package com.wdkl.ncs.android.component.home.util;
-
-import com.google.common.base.Strings;
-import com.wdkl.core.consts.Urls;
-import com.wdkl.core.socket.SocketManager;
-import com.wdkl.ncs.android.component.nursehome.common.Constants;
-import com.wdkl.ncs.android.middleware.tcp.ITcpCallBack;
-import com.wdkl.ncs.android.middleware.tcp.TcpClient;
-import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler;
-import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil;
-import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
-
-import org.greenrobot.eventbus.EventBus;
-
-public class TcpCallbackImpl implements ITcpCallBack {
-    @Override
-    public void connected() {
-        if (!Strings.isNullOrEmpty(Constants.Companion.getSipId()) && SocketManager.getInstance().getUserState()!=1) {
-            SocketManager.getInstance().connect(Urls.WS, Constants.Companion.getSipId(), 0);
-        }
-
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                while (!TcpClientHandler.getConnected()){
-                    try {
-                        Thread.sleep(1000);
-                    }catch (Exception ex){}
-                }
-                TcpModel tcpModel = DeviceUtil.deviceConnect(Constants.Companion.getImei());
-                TcpClient.getInstance().sendMsg(tcpModel.toJson());
-            }
-        }).start();
-
-    }
-}

+ 4 - 0
keepalive/build.gradle

@@ -35,6 +35,10 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 
 //可根据自己需求更改-+.693  gradlew againMakeJar
 //    task againMakeJar(type: Copy) {

+ 4 - 3
middleware/build.gradle

@@ -41,6 +41,10 @@ android {
     kapt {
         generateStubs = true
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 }
 
 dependencies {
@@ -77,6 +81,3 @@ dependencies {
     compile 'io.swagger:swagger-annotations:1.5.14'
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
 }
-repositories {
-    mavenCentral()
-}

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -15,7 +15,7 @@ class Constants {
         var memberId:Int? = -1
         var userName: String? = "" //当前用户
         var userRoleName: String? = "" //当前用户的角色
-        var tcpServer: String? = "120.76.246.253"
+        var tcpServer: String = "120.76.246.253"
         var tcpPort: Int = 5080   //tcp端口
         var heartBeat: Int = 29    //tcp心跳
         var ttsState: Int = 0

+ 0 - 5
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/ITcpCallBack.java

@@ -1,5 +0,0 @@
-package com.wdkl.ncs.android.middleware.tcp;
-
-public interface ITcpCallBack {
-    void connected();
-}

+ 125 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/NettyClient.kt

@@ -0,0 +1,125 @@
+package com.wdkl.ncs.android.middleware.tcp
+
+import android.util.Log
+import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import io.netty.bootstrap.Bootstrap
+import io.netty.channel.Channel
+import io.netty.channel.ChannelInitializer
+import io.netty.channel.ChannelOption
+import io.netty.channel.nio.NioEventLoopGroup
+import io.netty.channel.socket.SocketChannel
+import io.netty.channel.socket.nio.NioSocketChannel
+import io.netty.handler.codec.LengthFieldBasedFrameDecoder
+import io.netty.handler.codec.LengthFieldPrepender
+import io.netty.handler.codec.string.StringDecoder
+import io.netty.handler.codec.string.StringEncoder
+import io.netty.handler.timeout.IdleStateHandler
+import io.netty.util.CharsetUtil
+import io.reactivex.Observable
+import java.util.concurrent.TimeUnit
+import kotlin.properties.Delegates
+
+class NettyClient{
+    private val TAG = NettyClient::class.java.simpleName
+
+    /*是否连接*/
+    private var isConnect = false
+
+    /*伴生对象*/
+    companion object {
+        var instance = NettyClient()
+    }
+
+    private lateinit var group: NioEventLoopGroup
+    private lateinit var bootstrap: Bootstrap
+    private var channel: Channel? = null
+
+    private lateinit var ip: String
+    private var port by Delegates.notNull<Int>()
+    private var heartBeatSeconds by Delegates.notNull<Long>()
+
+    //数据处理
+    private var tcpClientHandler = TcpClientHandler()
+
+    fun getChannel(): Channel? {
+        return channel
+    }
+
+    /*连接*/
+    fun connect(ip: String, port: Int, heartBeatSeconds: Long): Observable<Boolean> {
+        Log.d(TAG, "开始连接 " + ip + ":" + port +","+heartBeatSeconds)
+
+        this.ip = ip
+        this.port = port
+        this.heartBeatSeconds = heartBeatSeconds
+
+        return Observable.create<Boolean> {
+            group = NioEventLoopGroup()
+            bootstrap = Bootstrap()
+                    .remoteAddress(ip, port)
+                    .group(group)
+                    .channel(NioSocketChannel::class.java)
+                    .option(ChannelOption.SO_KEEPALIVE, true)
+                    .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
+                    .handler(object : ChannelInitializer<SocketChannel>() {
+                        override fun initChannel(sc: SocketChannel) {
+                            val pipeline = sc.pipeline()
+
+                            // 这里将LengthFieldBasedFrameDecoder添加到pipeline的首位,因为其需要对接收到的数据
+                            // 进行长度字段解码,这里也会对数据进行粘包和拆包处理
+                            pipeline.addLast(LengthFieldBasedFrameDecoder(1024, 0, 2, 0, 2))
+                            // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
+                            pipeline.addLast(LengthFieldPrepender(2))
+                            //心跳包应当小于服务器间隔
+                            pipeline.addLast(IdleStateHandler(heartBeatSeconds * 2, heartBeatSeconds, 0, TimeUnit.SECONDS))
+                            pipeline.addLast(StringDecoder(CharsetUtil.UTF_8))
+                            pipeline.addLast(StringEncoder(CharsetUtil.UTF_8))
+                            pipeline.addLast(tcpClientHandler)
+                        }
+                    })
+
+
+            try {
+                channel = bootstrap.connect().sync().channel()
+                it.onNext(channel!!.isActive)
+                isConnect = channel!!.isActive
+            } catch (e: Exception) {
+                it.onNext(false)
+                isConnect = false
+            }
+        }.compose(ThreadFromUtils.defaultSchedulers())
+    }
+
+
+    /*发送命令*/
+    fun sendMsg(msg: String): Observable<Boolean> {
+
+        return Observable.create<Boolean> { emitter ->
+            if (isConnect) {
+                channel?.writeAndFlush(msg)?.addListener {
+                    emitter.onNext(it.isSuccess)
+                }
+            } else {
+                emitter.onNext(false)
+            }
+        }.compose(ThreadFromUtils.defaultSchedulers())
+    }
+
+    /*是否连接*/
+    fun isConnect(): Boolean {
+        return isConnect
+    }
+
+    /*重连*/
+    fun reConnect(): Observable<Boolean> {
+        disConnect()
+        return connect(ip, port, heartBeatSeconds)
+    }
+
+
+    /*关闭连接*/
+    private fun disConnect() {
+        isConnect = false
+        group.shutdownGracefully()
+    }
+}

+ 0 - 185
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -1,185 +0,0 @@
-package com.wdkl.ncs.android.middleware.tcp;
-
-import android.util.Log;
-
-import com.wdkl.ncs.android.component.nursehome.common.Constants;
-
-import java.util.Scanner;
-import java.util.concurrent.TimeUnit;
-
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
-import io.netty.handler.codec.LengthFieldPrepender;
-import io.netty.handler.codec.string.StringDecoder;
-import io.netty.handler.codec.string.StringEncoder;
-import io.netty.handler.timeout.IdleStateHandler;
-import io.netty.util.CharsetUtil;
-
-//单例
-public class TcpClient {
-    private String TAG = TcpClient.class.getSimpleName();
-
-    private NioEventLoopGroup workGroup = new NioEventLoopGroup();
-    public Channel channel;
-    public Bootstrap bootstrap;
-
-    //数据处理
-    TcpClientHandler tcpClientHandler = new TcpClientHandler();
-    //重试间隔
-    private Integer retrySeconds = 3;
-    //重试计数
-    public Integer retryTimes = 1;
-
-
-    //单例
-    private static class TcpClientHolder {
-        private static TcpClient instance = new TcpClient();
-    }
-
-    public static TcpClient getInstance() {
-        return TcpClientHolder.instance;
-    }
-
-    //初始化Netty Tcp Client 并连接
-    public synchronized void init(String serverIP, Integer serverPort, Integer heartBeatSeconds, ITcpCallBack iTcpCallBack) {
-        if (TcpClientHandler.getConnected()){
-            return;
-        }
-
-        if (channel!=null){
-            if (channel.isActive()||channel.isOpen()) {
-                return;
-            }
-        }
-
-        if (bootstrap!=null){
-            if (channel!=null) {
-                channel.disconnect();
-                channel = null;
-            }
-            bootstrap = null;
-            workGroup = null;
-        }
-
-        final Integer hbSeconds = heartBeatSeconds;
-        bootstrap = new Bootstrap();
-        if (workGroup==null){
-            workGroup = new NioEventLoopGroup();
-        }
-        bootstrap.group(workGroup)
-                .channel(NioSocketChannel.class)
-                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 15 * 1000)
-                .option(ChannelOption.SO_KEEPALIVE, true)
-                .handler(new ChannelInitializer<SocketChannel>() {
-                    @Override
-                    protected void initChannel(SocketChannel socketChannel) throws Exception {
-                        // 这里将LengthFieldBasedFrameDecoder添加到pipeline的首位,因为其需要对接收到的数据
-                        // 进行长度字段解码,这里也会对数据进行粘包和拆包处理
-                        socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 2, 0, 2));
-                        // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
-                        socketChannel.pipeline().addLast(new LengthFieldPrepender(2));
-                        //心跳包应当小于服务器间隔
-                        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);
-                    }
-                }).remoteAddress(serverIP, serverPort);
-        doConnect(iTcpCallBack);
-    }
-
-    //独立连接方法,用于重新连接
-    public synchronized void doConnect(final ITcpCallBack iTcpCallBack) {
-        if (channel != null && channel.isActive()) {
-            System.out.println("TcpClient connecting");
-            return;
-        }
-
-        if (TcpClientHandler.getConnected()){
-            System.out.println("TcpClient is connected");
-            return;
-        }
-
-        System.out.println("TcpClient connect start");
-        ChannelFuture future = bootstrap.connect().addListener(new ChannelFutureListener() {
-            @Override
-            public void operationComplete(final ChannelFuture channelFuture) throws Exception {
-                if (channelFuture.isSuccess()) {
-                    channel = channelFuture.channel();
-                    retryTimes = 0;
-                    System.out.println("TcpClient connect success");
-                    if (iTcpCallBack!=null) {
-                        iTcpCallBack.connected();
-                    }
-                } else {
-                    //连接失败时的处理
-                    System.out.println("TcpClient connect retry : " + retryTimes);
-
-                    channelFuture.channel().eventLoop().schedule(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (retryTimes > 30) {
-                                System.out.println("TcpClient 重试" + (retryTimes - 1) + "次,结束");
-
-                                channelFuture.channel().eventLoop().schedule(new Runnable() {
-                                    @Override
-                                    public void run() {
-                                        retryTimes = 1;
-                                        System.out.println("TcpClient 10分钟后 重试连接");
-                                        init(Constants.Companion.getTcpServer(),Constants.Companion.getTcpPort(),Constants.Companion.getHeartBeat(),iTcpCallBack);
-//                                        doConnect(iTcpCallBack);
-                                    }
-                                },60*10, TimeUnit.SECONDS);
-                            } else {
-                                retryTimes++;
-//                                doConnect(iTcpCallBack);
-                                init(Constants.Companion.getTcpServer(),Constants.Companion.getTcpPort(),Constants.Companion.getHeartBeat(),iTcpCallBack);
-                            }
-                        }
-                    }, retrySeconds, TimeUnit.SECONDS);
-                }
-            }
-        });
-//        try {
-//            future.sync();
-//            future.channel().closeFuture().sync();
-//        } catch (InterruptedException e) {
-//            e.printStackTrace();
-//        } finally {
-        //重试之前不关
-//            try {
-//                Thread.sleep(retrySeconds * retryTimes*1000 + 1000);
-//            } catch (InterruptedException e) {
-//            }
-//            workGroup.shutdownGracefully();
-//        }
-    }
-
-    //发送消息,线程安全
-    public synchronized void sendMsg(final String content) {
-        Log.d(TAG, "准备发送的数据 " + content);
-        tcpClientHandler.sendMsg(content);
-    }
-
-    //测试
-    public static void main(String[] args) {
-
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                TcpClient.getInstance().init("192.168.1.188", 5080, 9,null);
-            }
-        }).start();
-
-        Scanner scanner = new Scanner(System.in);
-        while (true) {
-            System.out.println("please type : ");
-            String line = scanner.nextLine();
-            TcpClient.getInstance().sendMsg(line);
-        }
-    }
-}

+ 19 - 47
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java

@@ -56,7 +56,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         retrySendMsg = 0;
 
         TcpModel tcpModel = DeviceUtil.deviceConnect(Constants.Companion.getImei());
-        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+        ctx.writeAndFlush(tcpModel.toJson());
     }
 
     //断开连接
@@ -66,9 +66,15 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         connected = false;
         this.ctx = null;
         Log.i(TAG, "TcpClientHandler 失去连接");
-        EventBus.getDefault().post(new MessageEvent("net off",Constants.EVENT_TCP_BREAK));
-//        TcpClient.getInstance().doConnect(null);
-//        reConnect(ctx);
+
+        NettyClient.Companion.getInstance().reConnect().subscribe(it->{
+            if (it){
+                Log.d(TAG, "TCP.重连成功");
+            } else {
+                Log.e(TAG, "TCP.重连失败");
+            }
+        });
+        //EventBus.getDefault().post(new MessageEvent("net off",Constants.EVENT_TCP_BREAK));
     }
 
     //读取String消息
@@ -82,7 +88,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
 
             TcpModel responseTcpModel = DeviceChannel.handleTcpReceived(tcpModel);
             if (responseTcpModel!=null){
-                TcpClient.getInstance().sendMsg(responseTcpModel.toJson());
+                ctx.writeAndFlush(tcpModel.toJson());
             } else {
                 ReferenceCountUtil.release(source);
             }
@@ -95,11 +101,9 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         if (evt instanceof IdleStateEvent){
             IdleStateEvent event = (IdleStateEvent)evt;
             if (event.state()== IdleState.WRITER_IDLE){
-//                TcpClient.getInstance().sendMsg("0");
                 ctx.writeAndFlush("0");
             }else if (event.state() == IdleState.READER_IDLE){
                 Log.i(TAG,"TcpClientHandler ===> pong from server failed");
-//                EventBus.getDefault().post(new MessageEvent("net off",Constants.EVENT_TCP_BREAK));
                 ctx.close();
             }
         }
@@ -107,41 +111,17 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
-//        ctx.close();
+        ctx.close();
         connected = false;
         Log.i(TAG,"TcpClientHandler 失去连接,错误引起 " + cause.getMessage());
     }
 
-    //发送消息,不直接调用些方法,调用TcpClient中的发送消息
-    public void sendMsg(final String msg){
-        if (ctx!=null && ctx.channel().isActive()){
-            ctx.writeAndFlush(Unpooled.copiedBuffer(msg, CharsetUtil.UTF_8));
-            Log.i(TAG,"TcpClientHandler 发送成功:" + msg);
-        }
-        //掉线后的消息处理
-        /*
-        new Thread(new Runnable() {
-            @Override
-            public void run() {
-                try{
-                    Thread.sleep(1000);
-                }catch (Exception ex){}
-
-                if (retrySendMsg < 3){
-                    retrySendMsg++;
-                    sendMsg(msg);
-                }
-            }
-        }).start();
-         */
-    }
-
     //已经连接上,中途失去连接时的处理
     private void reConnect(final ChannelHandlerContext ctx){
         if (totalRetryTimes>100){
             //todo: 存储数据库,并告警
         }
-        if (connected && (TcpClient.getInstance().channel != null && TcpClient.getInstance().channel.isActive())){
+        if (NettyClient.Companion.getInstance().isConnect()){
             return;
         }
         totalRetryTimes++;
@@ -152,22 +132,14 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
             Log.i(TAG,"TcpClientHandler 重新连接"+(retryTimes-1)+"次,结束");
             retryTimes = 0;
 
-            new Thread(new Runnable() {
+            //10分钟后重连
+            ctx.channel().eventLoop().schedule(new Runnable() {
                 @Override
                 public void run() {
-                    while (!TcpClientHandler.connected) {
-                        if (TcpClient.getInstance().channel == null || !TcpClient.getInstance().channel.isActive()) {
-                            TcpClient.getInstance().init(Constants.Companion.getTcpServer(), Constants.Companion.getTcpPort(), Constants.Companion.getHeartBeat(),null);
-                            try {
-                                Thread.sleep(10 * 60 * 1000);   //每10分钟重试
-                            } catch (InterruptedException e) {
-                                e.printStackTrace();
-                            }
-                        }
-                    }
+                    System.out.println("TcpClientHandler 重新连接,第"+retryTimes+"次");
+                    NettyClient.Companion.getInstance().reConnect();
                 }
-            }).start();
-            //TcpClient.getInstance().init();
+            },10, TimeUnit.MINUTES);
             return;
         }
 
@@ -175,7 +147,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
             @Override
             public void run() {
                 System.out.println("TcpClientHandler 重新连接,第"+retryTimes+"次");
-                TcpClient.getInstance().doConnect(null);
+                NettyClient.Companion.getInstance().reConnect();
             }
         },retrySeconds*retryTimes, TimeUnit.SECONDS);
     }

+ 7 - 1
readme.md

@@ -26,7 +26,13 @@
 
 ---
 
-## [1.1.60] version 78 - 2020-09-03
+## [1.2.0] version 80 - 2020-11-02
+### Changed
+- 更换TcpClient 为 NettyClient,使用观察者,连接,重连及发送消息须实现 subscribe
+
+---
+
+## [1.1.61] version 79 - 2020-09-10
 ### Fixed
 - 同事之间主动拨打挂断的BUG
 

+ 4 - 0
resource/build.gradle

@@ -30,6 +30,10 @@ android {
         */
        testCompile 'junit:junit:4.12'
    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 }
 
 

+ 4 - 0
rtc-chat/build.gradle

@@ -22,6 +22,10 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
 
 }