浏览代码

sip音频广播和喊话广播功能调通,待优化

weizhengliang 1 年之前
父节点
当前提交
27b724b88c

+ 12 - 3
android_host/src/main/common/java/com/wdkl/ncs/host/service/WdklSipService.java

@@ -18,11 +18,13 @@ import android.widget.Toast;
 import com.wdkl.ncs.android.component.nursehome.R;
 import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
+import com.wdkl.ncs.android.lib.utils.ExtendMethodsKt;
 import com.wdkl.ncs.android.middleware.common.Constants;
 import com.wdkl.ncs.android.middleware.utils.MessageEvent;
 import com.wdkl.ncs.host.activity.CallActivity;
 
 import org.greenrobot.eventbus.EventBus;
+import org.linphone.core.AVPFMode;
 import org.linphone.core.Call;
 import org.linphone.core.CallParams;
 import org.linphone.core.Core;
@@ -34,6 +36,7 @@ import org.linphone.core.PayloadType;
 import org.linphone.core.ProxyConfig;
 import org.linphone.core.Reason;
 import org.linphone.core.RegistrationState;
+import org.linphone.core.VideoDefinition;
 import org.linphone.mediastream.Version;
 
 import java.io.File;
@@ -126,18 +129,18 @@ public class WdklSipService extends Service {
                     return;
                 }
 
-                Toast.makeText(WdklSipService.this, message, Toast.LENGTH_SHORT).show();
+                ExtendMethodsKt.showMessage(message);
                 Log.d("sipCall", ">>>>>>>>>>>> call state: " + state + ", " + call.getRemoteAddress().asString());
 
                 if (state == Call.State.IncomingReceived || state == Call.State.IncomingEarlyMedia) {
                     //Toast.makeText(WdklSipService.this, "Incoming call", Toast.LENGTH_LONG).show();
                     //如果当前在通话界面则说明接听了通话,此时将自动接听,否则挂断
-                    if (Constants.Companion.getShowCall()) {
+                    if (Constants.Companion.getShowCall() || Constants.Companion.getBcVoiceOn()) {
                         CallParams params = mCore.createCallParams(call);
                         CallParams remoteParams = call.getRemoteParams();
                         if (remoteParams != null && params != null && remoteParams.isVideoEnabled()) {
                             params.setVideoEnabled(true);
-                            params.setMediaEncryption(MediaEncryption.None);
+                            //params.setMediaEncryption(MediaEncryption.None);
                             //params.setLowBandwidthEnabled(true);
                         }
                         call.acceptWithParams(params);
@@ -290,6 +293,12 @@ public class WdklSipService extends Service {
             }
         }
         mCore.setAudioPayloadTypes(payloads);
+
+        //VideoDefinition preferredVideoDefinition = mCore.getPreferredVideoDefinition().clone();
+        //preferredVideoDefinition.setDefinition(480,640);
+        //mCore.setPreferredVideoDefinition(preferredVideoDefinition);
+        //mCore.setAvpfMode(AVPFMode.Disabled);
+        //mCore.setPreferredFramerate(30);
     }
 
     private void dumpDeviceInformation() {

+ 4 - 0
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -614,6 +614,10 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
             Constants.sip_port = data.sipPort
         }
 
+        if (data.mediaLocalIp != null) {
+            Constants.media_ip = data.mediaLocalIp
+        }
+
         JanusConstant.JANUS_URL = "ws://" + data.rtcLocalIp + ":" + data.rtcPort
         JanusConstant.STUN_SERVER = arrayOf<String>(data.stunServer)
         //JanusConstant.TURN_SERVER = data.turnServer

+ 116 - 43
android_host/src/main/h10_z3128_1h/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcastFragment.kt

@@ -12,6 +12,7 @@ import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity
 import com.wdkl.ncs.android.component.nursehome.adapter.AudioBroadcastAdapter
 import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBroadcastBinding
 import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.lib.base.BaseFragment
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.common.Constants
@@ -25,10 +26,14 @@ import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import com.wdkl.ncs.host.service.WdklSipService
 import kotlinx.android.synthetic.main.fragment_broadcast.*
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
+import org.linphone.core.CallParams
+import org.linphone.core.Core
+import org.linphone.core.MediaEncryption
 
 /**
  * 广播管理界面
@@ -38,10 +43,11 @@ class BroadcastFragment : BaseFragment<BroadcastPresenter, FragmentBroadcastBind
 
     var audioBcAdapter: AudioBroadcastAdapter? = null
 
-    private var bcVoiceOn = false
     private var initDone = false
     private var clickTime: Long = 0
 
+    var core: Core? = null
+
     /**
      * 提供layoutID
      */
@@ -99,6 +105,10 @@ class BroadcastFragment : BaseFragment<BroadcastPresenter, FragmentBroadcastBind
         }
 
         btn_record.setOnClickListener {
+            if (SettingConfig.getSipEnabled(activity)) {
+                return@setOnClickListener
+            }
+
             if (!Constants.gstreamer_init) {
                 tv_broadcast_title.setText(R.string.broadcast_init_error)
                 showMessage(R.string.broadcast_init_error)
@@ -106,12 +116,12 @@ class BroadcastFragment : BaseFragment<BroadcastPresenter, FragmentBroadcastBind
                 tv_broadcast_title.setText(R.string.broadcast_start_warning)
                 showMessage(R.string.broadcast_start_warning)
             } else {
-                if (!bcVoiceOn) {
+                if (!Constants.bcVoiceOn) {
                     //start broadcast
                     tv_broadcast_title.setText(R.string.broadcast_playing)
                     btn_record.setImageResource(R.drawable.mic_off)
                     tv_record.setText(R.string.broadcast_record_stop)
-                    bcVoiceOn = true
+                    Constants.bcVoiceOn = true
 
                     MyGStreamManager.getInstance().play()
                     my_voice_load_view.start()
@@ -120,7 +130,7 @@ class BroadcastFragment : BaseFragment<BroadcastPresenter, FragmentBroadcastBind
                     tv_broadcast_title.setText(R.string.broadcast_stop)
                     btn_record.setImageResource(R.drawable.mic_on)
                     tv_record.setText(R.string.broadcast_record_start)
-                    bcVoiceOn = false
+                    Constants.bcVoiceOn = false
 
                     MyGStreamManager.getInstance().pause()
                     my_voice_load_view.stop()
@@ -131,56 +141,105 @@ class BroadcastFragment : BaseFragment<BroadcastPresenter, FragmentBroadcastBind
         btn_broadcast.setOnClickListener {
             if (Constants.bcStart) {
                 showMessage(R.string.broadcast_playing)
-            } else if (!Constants.gstreamer_init) {
-                tv_broadcast_title.setText(R.string.broadcast_init_error)
-            } else {
-                MyGStreamManager.getInstance().setCallBack(object : MyGStreamManager.StreamerCallBack {
-                    override fun onMessage(message: String?) {
-                        Log.d(TAG, "广播 ==> onMessage: $message")
-                    }
+                return@setOnClickListener
+            }
 
-                    override fun onStreamerInitialized() {
-                        Log.d(TAG, "广播 ==> 初始化完成...开始喊话")
-                        initDone = true
+            if (SettingConfig.getSipEnabled(activity)) {
+                val tcpModel = BroadcastUtil.startVoiceBroadcast(Constants.ids, "[0]")  //给所有分机设备发
+                val transaction = object : TcpCallback(tcpModel.tid) {
+                    override fun onSuccess(jsonObject: JSONObject) {
+                        try {
+                            val port = jsonObject.get(CALLBACK_DATA)
+                            core = WdklSipService.getCore()
+                            val addressToCall = core?.interpretUrl(port.toString())
+                            val params = core?.createCallParams(null)
+                            params?.isVideoEnabled = false
+                            if (addressToCall != null) {
+                                Log.e(TAG, "addressToCall: " + addressToCall.asString() + ", param: " + params.toString())
+                                core?.inviteAddressWithParams(addressToCall, params!!)
+                            }
+                        } catch (ex: Exception) {
+                            ex.printStackTrace()
+                        }
+                    }
 
+                    override fun onFailed(jsonObject: JSONObject) {
+                        // 这里写发送失败的方法
                         activity.runOnUiThread {
-                            tv_broadcast_title.setText(R.string.broadcast_playing)
-                            btn_record.setImageResource(R.drawable.mic_off)
-                            tv_record.setText(R.string.broadcast_record_stop)
-                            btn_broadcast.setText(R.string.broadcast_exit)
-                            my_voice_load_view.start()
-                            showMessage(R.string.broadcast_record_start)
-                            bcVoiceOn = true
+                            showMessage("broadcast send fail")
                         }
-
-                        MyGStreamManager.getInstance().play()
                     }
-                })
+                }
 
-                if (initDone) {
+                if (Constants.bcVoiceOn) {
                     (activity as NurseHomeActivity).showHome(false)
                 } else {
-                    //先发起喊话广播请求,服务端返回端口再初始化
-                    val tcpModel = BroadcastUtil.startVoiceBroadcast(Constants.ids, "[0]")  //给所有分机设备发
-                    val transaction = object : TcpCallback(tcpModel.tid) {
-                        override fun onSuccess(jsonObject: JSONObject) {
-                            try {
-                                val port = jsonObject.get(CALLBACK_DATA)
-                                //gstream初始化,指定服务器 IP 和端口
-                                MyGStreamManager.getInstance().init("host=172.28.100.100 port=" + port)
-                            } catch (ex: Exception) {
-                                ex.printStackTrace()
+                    tv_broadcast_title.setText(R.string.broadcast_playing)
+                    btn_record.setImageResource(R.drawable.mic_off)
+                    tv_record.setText(R.string.broadcast_record_stop)
+                    btn_broadcast.setText(R.string.broadcast_exit)
+                    my_voice_load_view.start()
+                    showMessage(R.string.broadcast_record_start)
+                    Constants.bcVoiceOn = true
+
+                    TcpClient.getInstance().sendTcp(tcpModel, false, transaction)
+                }
+
+            } else {
+                //gstream + webrtc喊话广播
+                if (!Constants.gstreamer_init) {
+                    tv_broadcast_title.setText(R.string.broadcast_init_error)
+                } else {
+                    MyGStreamManager.getInstance()
+                        .setCallBack(object : MyGStreamManager.StreamerCallBack {
+                            override fun onMessage(message: String?) {
+                                Log.d(TAG, "广播 ==> onMessage: $message")
                             }
-                        }
 
-                        override fun onFailed(jsonObject: JSONObject) {
-                            // 这里写发送失败的方法
-                            activity.runOnUiThread {
-                                showMessage("broadcast send fail")
+                            override fun onStreamerInitialized() {
+                                Log.d(TAG, "广播 ==> 初始化完成...开始喊话")
+                                initDone = true
+
+                                activity.runOnUiThread {
+                                    tv_broadcast_title.setText(R.string.broadcast_playing)
+                                    btn_record.setImageResource(R.drawable.mic_off)
+                                    tv_record.setText(R.string.broadcast_record_stop)
+                                    btn_broadcast.setText(R.string.broadcast_exit)
+                                    my_voice_load_view.start()
+                                    showMessage(R.string.broadcast_record_start)
+                                    Constants.bcVoiceOn = true
+                                }
+
+                                MyGStreamManager.getInstance().play()
+                            }
+                        })
+
+                    if (initDone) {
+                        (activity as NurseHomeActivity).showHome(false)
+                    } else {
+                        //先发起喊话广播请求,服务端返回端口再初始化
+                        val tcpModel = BroadcastUtil.startVoiceBroadcast(Constants.ids, "[0]")  //给所有分机设备发
+                        val transaction = object : TcpCallback(tcpModel.tid) {
+                            override fun onSuccess(jsonObject: JSONObject) {
+                                try {
+                                    val port = jsonObject.get(CALLBACK_DATA)
+                                    val uri = "host=" + Constants.media_ip + " port=" + port
+                                    //gstream初始化,指定服务器 IP 和端口
+                                    MyGStreamManager.getInstance().init(uri)
+                                } catch (ex: Exception) {
+                                    ex.printStackTrace()
+                                }
+                            }
+
+                            override fun onFailed(jsonObject: JSONObject) {
+                                // 这里写发送失败的方法
+                                activity.runOnUiThread {
+                                    showMessage("broadcast send fail")
+                                }
                             }
                         }
+                        TcpClient.getInstance().sendTcp(tcpModel, false, transaction)
                     }
-                    TcpClient.getInstance().sendTcp(tcpModel, false, transaction)
                 }
             }
         }
@@ -233,11 +292,25 @@ class BroadcastFragment : BaseFragment<BroadcastPresenter, FragmentBroadcastBind
      *页面销毁回调
      */
     override fun destory() {
-        if (initDone && !Constants.bcStart) {
+        if ((initDone || Constants.bcVoiceOn) && !Constants.bcStart) {
             val tcpModel = BroadcastUtil.stopBroadcast(Constants.ids, Constants.bcInteractionId)
             TcpClient.getInstance().sendMsg(tcpModel.toJson())
         }
-        MyGStreamManager.getInstance().release()
+        Constants.bcVoiceOn = false
+
+        if (SettingConfig.getSipEnabled(getActivity())) {
+            if (core != null) {
+                if (core!!.callsNb > 0) {
+                    var call = core!!.currentCall
+                    if (call == null) {
+                        call = core!!.calls[0]
+                    }
+                    call!!.terminate()
+                }
+            }
+        }else{
+            MyGStreamManager.getInstance().release()
+        }
     }
 
     /**

+ 2 - 1
android_host/src/main/h10_z3128_1h/res/layout/fragment_broadcast.xml

@@ -212,9 +212,10 @@
 
             <LinearLayout
                 android:id="@+id/ll_bc_action"
-                android:layout_width="match_parent"
+                android:layout_width="wrap_content"
                 android:layout_height="80dp"
                 android:layout_marginBottom="20dp"
+                android:layout_centerHorizontal="true"
                 android:gravity="center"
                 android:layout_alignParentBottom="true">
                 <ImageView

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

@@ -25,6 +25,7 @@ class Constants {
         var sip_port: Int? = 5060
         var tcp_ip: String? = ""  //tcpip
         var tcp_port: Int = 8006  //tcp端口
+        var media_ip: String = "172.28.100.100"
         var reader_idle_time: Int = 60  //tcp心跳
         var app_path: String = ""  //apk下载路径
         var tcp_connected: Boolean = false
@@ -69,6 +70,7 @@ class Constants {
         var gstreamer_init = false
         var selectBcId: Int = 0
         var bcStart: Boolean = false
+        var bcVoiceOn = false
         var bcFrameIds: String = "[0]"
         var bcInteractionId: Int = -1
         var bcVoiceId: Int = 0