瀏覽代碼

增加手动配置服务器地址功能

weizhengliang 1 年之前
父節點
當前提交
321db959f6

+ 94 - 190
app/src/main/java/com/wdkl/ncs/entraceguard/activity/MainActivity.kt

@@ -12,6 +12,7 @@ import android.os.Handler
 import android.os.Looper
 import android.util.Log
 import android.view.View
+import android.widget.Button
 import android.widget.ImageView
 import android.widget.TextView
 import androidx.annotation.RequiresApi
@@ -20,6 +21,7 @@ import com.google.common.base.Strings
 import com.szeasco.facesdk.helper.GpioHelper
 import com.wdkl.ncs.entraceguard.contracts.MainActivityContract
 import com.wdkl.ncs.entraceguard.di.DaggerApplicationComponent
+import com.wdkl.ncs.entraceguard.helper.ServerConfigDialogHelper
 import com.wdkl.ncs.entraceguard.model.dos.DeviceDO
 import com.wdkl.ncs.entraceguard.model.dto.TcpSeverDTO
 import com.wdkl.ncs.entraceguard.model.vo.InteractionVO
@@ -31,6 +33,7 @@ import com.wdkl.ncs.entraceguard.tcp.enums.TcpAction
 import com.wdkl.ncs.entraceguard.tcp.enums.TcpType
 import com.wdkl.ncs.entraceguard.utils.LocaleMangerUtils
 import com.wdkl.ncs.framework.base.BaseActivity
+import com.wdkl.ncs.framework.beans.ServerInfo
 import com.wdkl.ncs.framework.common.Constants
 import com.wdkl.ncs.framework.di.ApiProviders
 import com.wdkl.ncs.framework.di.DaggerFrameWorkComponent
@@ -45,6 +48,7 @@ import com.wdkl.ncs.janus.entity.Room
 import com.wdkl.ncs.janus.rtc.WebRTCEngine
 import com.wdkl.ncs.janus.util.Constant
 import com.wdkl.ncs.janus.util.EnumType
+import iot.facereco.smart.terminal.BuildConfig
 import iot.facereco.smart.terminal.R
 import iot.facereco.smart.terminal.databinding.ActivityMainBinding
 import kotlinx.android.synthetic.main.activity_main.*
@@ -66,27 +70,21 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
                 .setAudioAttributes(audioAttributes.build())
                 .build()
     }
-//    private var gEngineKit: SkyEngineKit? = null
-    private var gpioHelper: GpioHelper? = null
 
+    private var gpioHelper: GpioHelper? = null
     private var interactionVO: InteractionVO? = null
 
     //呼叫倒计时
     lateinit var countDownTimer: CountDownTimer
-
     //呼叫倒计时
     lateinit var responseCountDownTimer: CountDownTimer
 
     // 识别通过的语音 ,这里只是 demo 所以在这里加载,实际场景可以缓存起来
     var passSoundID: Int? = null
-
     // 陌生人
     var strangerSoundID: Int? = null
-
     var janusClient: JanusClient? = null
-
     var videoRoomCallback: VideoRoomCallback? = null
-
     var room: Room? = null
 
     private var language = "zh"
@@ -106,35 +104,21 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
     override fun init() {
 
         if(!NetHelper.getInstance().netAvailable){
-            showTipView(R.drawable.net_inavailable,R.string.no_network)
-            exitApp(5000)
+            showTipView(R.drawable.net_inavailable,R.string.no_network, true, 5000)
+            //exitApp(5000)
         }else {
-
-            Constants.imei = android.os.Build.SERIAL
+            Constants.imei = Build.SERIAL
             passSoundID = mSoundPool.load(this, R.raw.pass, 1)
             strangerSoundID = mSoundPool.load(this, R.raw.not_allow, 1)
             // 门禁SDK
             gpioHelper = GpioHelper.getInstance()
             //获取tcp服务器信息
-            presenter.getTcpServerInfo()
-
-//            try {
-//                SkyEngineKit.init(VoipEvent()) //重新初始化
-//                gEngineKit = SkyEngineKit.Instance()
-//            } catch (e: NotInitializedException) {
-//                SkyEngineKit.init(VoipEvent()) //重新初始化
-//                try {
-//                    gEngineKit = SkyEngineKit.Instance()
-//                } catch (ex: NotInitializedException) {
-////                finish()
-//                }
-//
-//            }
+            //presenter.getTcpServerInfo()
+            presenter.getServerInfo()
+
             initResponseCountDownTimer()
             responseCountDownTimer.start() //开始计时,正常呼叫tcp发出,服务器立即响应成功或失败,如果超过8秒没响应,退出程序
             Log.i("WDKL", "IMEI=" + Util.IMEI)
-
-
         }
 
         language = LocaleMangerUtils.getApplicationLocale().language
@@ -149,13 +133,23 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
     }
 
     override fun showTcpServerInfo(tcpSeverDTO: TcpSeverDTO) {
-        Thread {
+        /*Thread {
             TcpClient.getInstance().init(tcpSeverDTO.publicIp, tcpSeverDTO.tcpPort, tcpSeverDTO.readerIdleTime)
-        }.start()
+        }.start()*/
+    }
 
+    override fun setServerInfo(serverInfo: ServerInfo) {
+        Constant.JANUS_URL = "ws://" + serverInfo.rtcLocalIp + ":" + serverInfo.rtcPort
+        Constant.STUN_SERVER = arrayOf<String>(serverInfo.stunServer)
+
+        Thread {
+            TcpClient.getInstance().init(serverInfo.tcpLocalIp, serverInfo.tcpPort, serverInfo.tcpIdleSeconds)
+        }.start()
     }
 
     override fun initDevice(deviceDO: DeviceDO) {
+        responseCountDownTimer.cancel()
+
         Log.i("设备信息:", JSON.toJSONString(deviceDO))
         if (!Strings.isNullOrEmpty(deviceDO.sipId)&&deviceDO.status.equals(1)) {
             Constants.sipId = deviceDO.sipId
@@ -166,6 +160,7 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
 
 
             //初始化 janusClient
+            Log.d("janus", "janus url: " + Constant.JANUS_URL + ", id: " + Constants.sipId)
             janusClient = JanusClient(Constant.JANUS_URL, Constants.sipId!!.toBigInteger())
             janusClient!!.callState = EnumType.CallState.Outgoing
             room = Room(Constants.sipId!!.toBigInteger())
@@ -174,23 +169,17 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
             janusClient!!.setJanusCallback(videoRoomCallback)
             janusClient!!.connect()
             initCountDownTimer()
-//            SocketManager.getInstance().addUserStateCallback(this)
-            //初始化webrtc
-//            SocketManager.getInstance().connect(Urls.WS, Constants.sipId, 0)
+
             TcpClient.getInstance().sendMsg(EntraceGuardUtil.startVisit(Constants.deviceId).toJson())
         }else{
-            showTipView(R.drawable.unregister,R.string.device_unregister)
-            exitApp(3000)
+            showTipView(R.drawable.unregister,R.string.device_unregister, true, 3000)
+            //exitApp(3000)
         }
-
-
     }
 
 
     override fun onError(message: String, type: Int) {
 
-
-
     }
 
     override fun complete(message: String, type: Int) {
@@ -203,30 +192,26 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
-
         when (messageEvent.tag) {
             Constants.ENTRACEGUARD -> {
                 Log.i("收到tcp消息:", JSON.toJSONString(messageEvent.tcpModel))
-                var tcpModel = messageEvent.tcpModel as TcpModel
+                val tcpModel = messageEvent.tcpModel as TcpModel
                 if (tcpModel.type.equals(TcpType.ENTRACEGUARD)) {
                     when (tcpModel.action) {
                         TcpAction.EntraceGuardAction.ACCEPT -> { //接通视频
                             //取消响应计时
-                            responseCountDownTimer?.cancel()
+                            responseCountDownTimer.cancel()
                             interactionVO = JSON.parseObject(tcpModel.data.toString(), InteractionVO::class.java)
-                            //janusClient!!.connect()
 
                             countDownTimer.start()
                             RingPlayHelper.playRingTone(this, R.raw.alice, true)
-//                            WebRTCEngine.getInstance().switchCamera()
-//                            startCall(interactionVO!!.toSipId, false)
                         }
 
                         TcpAction.EntraceGuardAction.FAILED ->{  //护士主机不在线
                             //取消响应计时
-                            responseCountDownTimer?.cancel()
-                            showTipView(R.drawable.host_offline,R.string.call_failed)
-                            exitApp(3000)
+                            responseCountDownTimer.cancel()
+                            showTipView(R.drawable.host_offline,R.string.call_failed, false, 3000)
+                            //exitApp(3000)
                         }
 
 
@@ -240,41 +225,31 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
                             janusClient!!.destroyRoom(janusClient!!.currentHandleId, null)
                             janusClient!!.disConnect()
 
-
-
-
-
-                            //处理界面
-
-                            showTipView(R.drawable.allow_in,R.string.door_opened)
-//                            if (Locale.CHINESE.getLanguage().equals(language)) {
+                            showTipView(R.drawable.allow_in,R.string.door_opened, false, 10000)
                             play(passSoundID!!)
-//                            }
+
                             //10秒后退出程序,调起门禁默认应用
-                            exitApp(10000)
+                            //exitApp(10000)
 
                         }
 
                         TcpAction.EntraceGuardAction.REJECT ->{
                             //停止等待音乐,停止倒计时
                             cancelCountDownTimer()
-//                            if (Locale.CHINESE.getLanguage().equals(language)) {
-                                play(strangerSoundID!!)
-//                            }
-                            showTipView(R.drawable.busyline,R.string.call_busy)
+
+                            play(strangerSoundID!!)
+                            showTipView(R.drawable.busyline,R.string.call_busy, false, 3000)
 
                             janusClient!!.destroyRoom(janusClient!!.currentHandleId, null)
                             janusClient!!.disConnect()
                             //3秒后退出程序
-                            exitApp(3000)
+                            //exitApp(3000)
 
                         }
                         TcpAction.EntraceGuardAction.LOCKDOOR -> {
                             // 陌生人,亮起红外灯光
                             gpioHelper!!.setPassStatus(false)
-//                            if (Locale.CHINESE.getLanguage().equals(language)) {
-                                play(strangerSoundID!!)
-//                            }
+                            play(strangerSoundID!!)
                         }
 
                         TcpAction.EntraceGuardAction.OPENSPEAKER -> { //打开音频
@@ -283,12 +258,6 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
 
                             WebRTCEngine.getInstance().toggleSpeaker(true)
                             WebRTCEngine.getInstance().muteAudio(false)
-//                            var session = gEngineKit?.currentSession
-//                            Log.i("session", session?.roomId)
-//                            if (session != null) {
-//                                session.toggleSpeaker(true)
-//                                session.toggleMuteAudio(false)
-//                            }
                         }
 
                         TcpAction.EntraceGuardAction.CLOSESPEAKER -> { //关闭音频
@@ -296,25 +265,18 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
                             cancelCountDownTimer()
                             WebRTCEngine.getInstance().toggleSpeaker(false)
                             WebRTCEngine.getInstance().muteAudio(true)
-//                            var session = gEngineKit?.currentSession
-//                            if (session != null) {
-//                                session.toggleSpeaker(false)
-//                                session.toggleMuteAudio(true)
-//                            }
                         }
 
                         TcpAction.EntraceGuardAction.HANGUP -> { //主机直接挂断,不开门显示
                             //停止等待音乐,停止倒计时
                             cancelCountDownTimer()
-//                            if (Locale.CHINESE.getLanguage().equals(language)) {
-                                play(strangerSoundID!!)
-//                            }
-                            showTipView(R.drawable.not_allow,R.string.not_allowed)
+                            play(strangerSoundID!!)
+                            showTipView(R.drawable.not_allow,R.string.not_allowed, false, 3000)
                             janusClient!!.destroyRoom(janusClient!!.currentHandleId, null)
                             janusClient!!.disConnect()
-//                            SkyEngineKit.Instance().endCall()
+
                             //3秒后退出程序
-                            exitApp(3000)
+                            //exitApp(3000)
                         }
 
                     }
@@ -359,106 +321,23 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
         return result
     }
 
-//    override fun userLogout() {
-//        Log.i("webrtc", "用户退出登录")
-//    }
-//
-//    override fun userLogin() {
-//        Log.i("webrtc", "用户登录成功")
-//        //发送视频请求
-//        TcpClient.getInstance().sendMsg(EntraceGuardUtil.startVisit(Constants.deviceId).toJson())
-//
-//    }
-
-//    //创建会话
-//    private fun startCall(targetId: String, audioOnly: Boolean): Boolean {
-//        val room = UUID.randomUUID().toString() + System.currentTimeMillis()
-//        val b = gEngineKit!!.startOutCall(this, room, targetId, audioOnly)
-//        Log.i("wdlk", "发送通话邀请")
-//        if (b) {
-//            val session = gEngineKit?.currentSession
-//            if (session == null) {
-//                return false
-//            } else {
-////                Constants.CALL_STATE = Constants.CALL_CALLING
-////                DeviceChannel.calling = true
-//
-//                initCountDownTimer()
-//                countDownTimer.start()
-//                RingPlayHelper.playRingTone(this, R.raw.alice, true)
-//                session.setSessionCallback(this)
-//                session.switchCamera()
-//
-//                session.toggleSpeaker(false)
-//                session.toggleMuteAudio(true)
-//
-////                3s还未连接上则判定为通话失败
-//                Handler().postDelayed({
-//                    if (session.state == EnumType.CallState.Connected) {
-//                        //showCalling(onlyAudio)
-//                    } else {
-//
-//                    }
-//                    Log.i("创建通话,session state=", session.state.name)
-//                }, 3000)
-//            }
-//        }
-//        return b
-//    }
-
-//    override fun didChangeState(var1: EnumType.CallState?) {
-//
-//    }
-//
-//    override fun didDisconnected(userId: String?) {
-//
-//    }
-
-//    override fun didCreateLocalVideoTrack() {
-//        Log.d("wzlll", "didCreateLocalVideoTrack")
-//        handler.post {
-//            if (localSurfaceView == null) {
-//                val surfaceView = gEngineKit!!.currentSession.setupLocalVideo(true)
-//                if (surfaceView != null) {
-//                    localSurfaceView = surfaceView as SurfaceViewRenderer
-//                } else {
-//                    EventBus.getDefault().post(MessageEvent("back_to_main", Constants.BACK_TO_MAIN_MSG))
-//                }
-//            } else {
-//                localSurfaceView!!.setZOrderMediaOverlay(true)
-//            }
-//            surface_view!!.addView(localSurfaceView)
-//        }
-//    }
-//
-//
-//    override fun didError(error: String?) {
-//
-//    }
-//
-//    override fun didReceiveRemoteVideoTrack(userId: String?) {
-//
-//    }
-//
-//    override fun didCallEndWithReason(var1: EnumType.CallEndReason?) {
-//
-//    }
-//
-//    override fun didChangeMode(isAudioOnly: Boolean) {
-//
-//    }
-//
-//    override fun didUserLeave(userId: String?) {
-//
-//    }
-
 
     private fun play(soundID: Int) {
         mSoundPool.play(soundID, 1.0f, 1.0f, 1, 0, 1.0f)
     }
 
     private fun exitApp(delay: Long) {
-        handler.postDelayed({
+        if (delay > 0) {
+            handler.postDelayed({
+                //关闭灯光,闭合继电器
+                gpioHelper!!.ledDismiss(false);
+
+                val packageManager: PackageManager = packageManager
+                val intent: Intent = packageManager.getLaunchIntentForPackage("com.rlapk")
+                startActivity(intent)
+                System.exit(0)
+            }, delay)
+        } else {
             //关闭灯光,闭合继电器
             gpioHelper!!.ledDismiss(false);
 
@@ -466,25 +345,26 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
             val intent: Intent = packageManager.getLaunchIntentForPackage("com.rlapk")
             startActivity(intent)
             System.exit(0)
-        }, delay)
+        }
     }
 
     fun initCountDownTimer() {
         countDownTimer = object : CountDownTimer(100 * 1000L, 1000) {
+
             override fun onTick(millisUntilFinished: Long) {
                 val time = millisUntilFinished / 1000
                 val text = getString(R.string.call_timeout, time)
                 counter_down.setText(text)
             }
+
             override fun onFinish() {
                 //呼叫超时,返回到主界面
-//                SkyEngineKit.Instance().endCall()
                 janusClient!!.destroyRoom(janusClient!!.currentHandleId, null)
                 janusClient!!.disConnect()
                 RingPlayHelper.stopRingTone()
                 TcpClient.getInstance().sendMsg(EntraceGuardUtil.timeOut(interactionVO).toJson())
-                showTipView(R.drawable.no_reponse,R.string.call_no_response)
-                exitApp(3000)
+                showTipView(R.drawable.no_reponse,R.string.call_no_response, false, 3000)
+                //exitApp(3000)
             }
         }
     }
@@ -494,32 +374,56 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
         counter_down_wrap.visibility=View.GONE
         RingPlayHelper.stopRingTone()
     }
-   //等待响应倒计时 8秒内未响应呼叫请求回复,结束界面
+
+    //等待响应倒计时 8秒内未响应呼叫请求回复,结束界面
     fun initResponseCountDownTimer() {
        responseCountDownTimer = object : CountDownTimer(5 * 1000L, 1000) {
            override fun onTick(millisUntilFinished: Long) {
 
            }
            override fun onFinish() {
-               showTipView(R.drawable.no_reponse,R.string.call_no_response)
-               exitApp(3000)
+               showTipView(R.drawable.no_reponse,R.string.call_no_response, true, 3000)
+               //exitApp(3000)
            }
        }
     }
 
-    fun showTipView(imageId: Int, resId: Int) {
-        showTipView(imageId, getString(resId))
+    fun showTipView(imageId: Int, resId: Int, serverConfig: Boolean, delayExit: Long) {
+        showTipView(imageId, getString(resId), serverConfig, delayExit)
     }
 
-    fun showTipView(imageId :Int, message:String){
+    fun showTipView(imageId: Int, message: String, serverConfig: Boolean, delayExit: Long){
         counter_down_wrap.visibility=View.GONE
         surface_view.removeAllViews()
-        var view = layoutInflater.inflate(R.layout.view_tips_layout, null)
-        var imageView = view.findViewById<ImageView>(R.id.tips_image)
+        val view = layoutInflater.inflate(R.layout.view_tips_layout, null)
+        val imageView = view.findViewById<ImageView>(R.id.tips_image)
         imageView.setImageResource(imageId)
-        var messageView = view.findViewById<TextView>(R.id.tips_message)
+        val messageView = view.findViewById<TextView>(R.id.tips_message)
+        val serverBtn = view.findViewById<Button>(R.id.btn_server_config)
+        val exitBtn = view.findViewById<Button>(R.id.btn_exit)
+        val tvVersion = view.findViewById<TextView>(R.id.tv_version)
+        tvVersion.setText("V" + BuildConfig.VERSION_NAME)
         messageView.setText(message)
         surface_view.addView(view)
+
+        if (serverConfig) {
+            exitApp(60000)
+
+            tvVersion.visibility = View.VISIBLE
+            serverBtn.visibility = View.VISIBLE
+            serverBtn.setOnClickListener {
+                //服务器IP配置
+                ServerConfigDialogHelper.showPasswordDialog(activity)
+            }
+
+            exitBtn.visibility = View.VISIBLE
+            exitBtn.setOnClickListener {
+                handler.removeCallbacksAndMessages(null)
+                exitApp(0)
+            }
+        } else {
+            exitApp(delayExit)
+        }
     }
 
     override fun didChangeState(var1: EnumType.CallState?) {
@@ -538,7 +442,7 @@ class MainActivity : BaseActivity<MainActivityPresenter, ActivityMainBinding>(),
     }
 
     override fun didCreateLocalVideoTrack() {
-        handler.post {
+        runOnUiThread {
             if (localSurfaceView == null) {
 
                 val surfaceView = WebRTCEngine.getInstance().startPreview(true)

+ 56 - 0
app/src/main/java/com/wdkl/ncs/entraceguard/adapter/NumAdapter.java

@@ -0,0 +1,56 @@
+package com.wdkl.ncs.entraceguard.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import iot.facereco.smart.terminal.R;
+
+public class NumAdapter extends BaseAdapter {
+    private String[] num;
+    private Context context;
+
+    public NumAdapter(String[] numbers, Context context) {
+        this.num = numbers;
+        this.context = context;
+    }
+
+
+    @Override
+    public int getCount() {
+        return num.length;
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return num[position];
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return position;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder viewHolder;
+        if (convertView == null) {
+            convertView = LayoutInflater.from(context).inflate(R.layout.digital_item, null);
+            viewHolder = new ViewHolder();
+            viewHolder.numTv = convertView.findViewById(R.id.tv_number);
+            convertView.setTag(viewHolder);
+        } else {
+            viewHolder = (ViewHolder) convertView.getTag();
+        }
+        viewHolder.numTv.setText(num[position]);
+
+        return convertView;
+    }
+
+    static class ViewHolder {
+        TextView numTv;
+    }
+}

+ 10 - 1
app/src/main/java/com/wdkl/ncs/entraceguard/contracts/MainActivityContract.kt

@@ -4,14 +4,23 @@ import com.wdkl.ncs.entraceguard.model.dos.DeviceDO
 import com.wdkl.ncs.entraceguard.model.dto.TcpSeverDTO
 import com.wdkl.ncs.entraceguard.model.vo.DeviceVO
 import com.wdkl.ncs.framework.base.BaseContract
+import com.wdkl.ncs.framework.beans.ServerInfo
 
 interface MainActivityContract{
     interface View : BaseContract.BaseView{
-       fun showTcpServerInfo(tcpSeverDTO: TcpSeverDTO)
+
+        fun showTcpServerInfo(tcpSeverDTO: TcpSeverDTO)
+
+        fun setServerInfo(serverInfo: ServerInfo)
+
         fun initDevice(deviceDO: DeviceDO)
     }
     interface Presenter : BaseContract.BasePresenter{
+
         fun getTcpServerInfo()
+
+        fun getServerInfo()
+
         fun getDeviceInfo()
     }
 }

+ 159 - 0
app/src/main/java/com/wdkl/ncs/entraceguard/helper/ServerConfigDialogHelper.java

@@ -0,0 +1,159 @@
+package com.wdkl.ncs.entraceguard.helper;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.EditText;
+import android.widget.GridView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.wdkl.ncs.entraceguard.adapter.NumAdapter;
+import com.wdkl.ncs.framework.base.BaseApplication;
+import com.wdkl.ncs.framework.utils.CommonUtils;
+
+import iot.facereco.smart.terminal.R;
+
+
+public class ServerConfigDialogHelper {
+
+    private static AlertDialog callDialog;
+    private static String pwd = "";
+
+    public static void showPasswordDialog(final Activity activity) {
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.server_config_dialog_lay, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        final String[] numbers = {"1","2","3","4","5","6","7","8","9"};
+        final TextView password = contentView.findViewById(R.id.tv_psw_view);
+        final LinearLayout llPwd = contentView.findViewById(R.id.ll_password);
+        final LinearLayout llServer = contentView.findViewById(R.id.ll_server_config);
+        GridView gridView = contentView.findViewById(R.id.grid_psw);
+        NumAdapter adapter = new NumAdapter(numbers, activity);
+        gridView.setAdapter(adapter);
+        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                if (pwd.length() <= 2) {
+                    pwd = pwd + numbers[position];
+                    password.setText(pwd);
+                }
+                Log.d("serverIp", "input password len: " + pwd.length() + "--" + pwd);
+            }
+        });
+
+        TextView delete = contentView.findViewById(R.id.btn_delete);
+        TextView cancel = contentView.findViewById(R.id.btn_cancel);
+        TextView confirm = contentView.findViewById(R.id.btn_confirm);
+        delete.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Log.d("serverIp", "delete password len: " + pwd.length() + "--" + pwd);
+                if (pwd.length() > 1) {
+                    pwd = pwd.substring(0, pwd.length()-1);
+                    password.setText(pwd);
+                } else {
+                    pwd = "";
+                    password.setText(pwd);
+                    password.setHint("请输密码");
+                }
+            }
+        });
+
+        cancel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismissCallDialog();
+            }
+        });
+
+        confirm.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if ("666".equals(pwd)) {
+                    llPwd.setVisibility(View.GONE);
+                    llServer.setVisibility(View.VISIBLE);
+                } else {
+                    Toast.makeText(activity, "密码错误", Toast.LENGTH_SHORT).show();
+                }
+            }
+        });
+
+        final EditText editUrl = contentView.findViewById(R.id.edit_url);
+        final EditText editPort = contentView.findViewById(R.id.edit_port);
+        final EditText editSipUrl = contentView.findViewById(R.id.edit_sip_url);
+        final EditText editSipPort = contentView.findViewById(R.id.edit_sip_port);
+        TextView saveConfig = contentView.findViewById(R.id.btn_save_config);
+        TextView cancelConfig = contentView.findViewById(R.id.btn_cancel_config);
+        editUrl.setText(CommonUtils.getUrl(BaseApplication.appContext));
+        editPort.setText(CommonUtils.getUrlPort(BaseApplication.appContext));
+        //editSipUrl.setText(CommonUtils.getSipUrl(BaseApplication.appContext));
+        //editSipPort.setText(CommonUtils.getSipPort(BaseApplication.appContext));
+        saveConfig.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                String url = editUrl.getText().toString();
+                String port = editPort.getText().toString();
+                if (TextUtils.isEmpty(url) || TextUtils.isEmpty(port)) {
+                    Toast.makeText(activity, "数据为空", Toast.LENGTH_SHORT).show();
+                } else {
+                    //保存配置
+                    CommonUtils.setUrl(BaseApplication.appContext, editUrl.getText().toString());
+                    CommonUtils.setUrlPort(BaseApplication.appContext, editPort.getText().toString());
+                    //CommonUtils.setSipUrl(BaseApplication.appContext, editSipUrl.getText().toString());
+                    //CommonUtils.setSipPort(BaseApplication.appContext, editSipPort.getText().toString());
+                    dismissCallDialog();
+                }
+            }
+        });
+        cancelConfig.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismissCallDialog();
+            }
+        });
+
+
+        callDialog = builder.create();
+        callDialog.setCanceledOnTouchOutside(false);
+        callDialog.setCancelable(false);
+        callDialog.show();
+
+        //设置dialog宽高及位置
+        try {
+            Window window = callDialog.getWindow();
+            window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+            WindowManager.LayoutParams lp = window.getAttributes();
+            lp.width = 400;
+            lp.height = 480;
+            lp.gravity = Gravity.CENTER;
+            window.setAttributes(lp);
+
+            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | View.SYSTEM_UI_FLAG_FULLSCREEN);
+            window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void dismissCallDialog() {
+        pwd = "";
+        if (callDialog != null && callDialog.isShowing()) {
+            callDialog.dismiss();
+        }
+    }
+}

+ 38 - 16
app/src/main/java/com/wdkl/ncs/entraceguard/presenters/MainActivityPresenter.kt

@@ -9,6 +9,7 @@ import com.wdkl.ncs.entraceguard.model.dos.DeviceDO
 import com.wdkl.ncs.entraceguard.model.dto.TcpSeverDTO
 import com.wdkl.ncs.framework.api.DeviceApi
 import com.wdkl.ncs.framework.base.RxPresenter
+import com.wdkl.ncs.framework.beans.ServerInfo
 import com.wdkl.ncs.framework.common.Constants
 import com.wdkl.ncs.framework.di.ApiProviders
 import com.wdkl.ncs.framework.di.DaggerFrameWorkComponent
@@ -31,26 +32,41 @@ class MainActivityPresenter @Inject constructor(): RxPresenter<MainActivityContr
     }
 
     override fun getTcpServerInfo() {
-        deviceApi.getTcpServerHost().map {
-
-            val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
-            val tcpServer = gson.fromJson(it.getJsonString(), TcpSeverDTO::class.java)
-            Log.e("responsebody",it.getJsonString())
-            return@map tcpServer
-        }
-                .compose(ThreadFromUtils.defaultSchedulers())
-                .subscribe(observer)
+        deviceApi.getTcpServerHost()
+            .map {
+                val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                val tcpServer = gson.fromJson(it.getJsonString(), TcpSeverDTO::class.java)
+                Log.e("responsebody",it.getJsonString())
+                return@map tcpServer
+            }
+            .compose(ThreadFromUtils.defaultSchedulers())
+            .subscribe(observer)
 
     }
 
     override fun getDeviceInfo() {
-        deviceApi.getDeviceInfo(Constants.imei).map {
-            val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
-            val device = gson.fromJson(it.getJsonString(), DeviceDO::class.java)
-            Log.e("responsebody",it.getJsonString())
-            return@map device
-        }.compose(ThreadFromUtils.defaultSchedulers())
-                .subscribe(observer)
+        deviceApi.getDeviceInfo(Constants.imei)
+            .map {
+                val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                val device = gson.fromJson(it.getJsonString(), DeviceDO::class.java)
+                Log.e("responsebody",it.getJsonString())
+                return@map device
+            }
+            .compose(ThreadFromUtils.defaultSchedulers())
+            .subscribe(observer)
+    }
+
+    override fun getServerInfo() {
+        deviceApi.getServerInfo()
+            .map {
+                val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                val serverInfo = gson.fromJson(it.getJsonString(), ServerInfo::class.java)
+                Log.e("responsebody",it.getJsonString())
+
+                return@map serverInfo
+            }
+            .compose(ThreadFromUtils.defaultSchedulers())
+            .subscribe(observer)
     }
 
     private val observer = object : ConnectionObserver<Any>(){
@@ -63,12 +79,18 @@ class MainActivityPresenter @Inject constructor(): RxPresenter<MainActivityContr
             providerView().complete()
             //网络请求完成
             when(result){
+
                 is TcpSeverDTO->{
                     providerView().showTcpServerInfo(result)
                 }
+
                 is DeviceDO->{
                     providerView().initDevice(result)
                 }
+
+                is ServerInfo -> {
+                    providerView().setServerInfo(result)
+                }
             }
         }
 

+ 3 - 28
app/src/main/res/layout/activity_main.xml

@@ -6,36 +6,11 @@
         android:orientation="vertical"
         android:layout_height="match_parent">
 
-<!--        <TextView-->
-<!--            android:id="@+id/hello"-->
-<!--            android:layout_width="wrap_content"-->
-<!--            android:layout_height="wrap_content"-->
-<!--            android:text="Hello World!" />-->
-
-<!--        <Button-->
-<!--            android:id="@+id/unlock_test"-->
-<!--            android:text="sdk开门"-->
-<!--            android:layout_width="wrap_content"-->
-<!--            android:layout_height="wrap_content">-->
-
-
-<!--        </Button>-->
-<!--        <Button-->
-<!--            android:id="@+id/exit"-->
-<!--            android:text="sdk开门"-->
-<!--            android:layout_width="wrap_content"-->
-<!--            android:layout_height="wrap_content"/>-->
-<!--        <Button-->
-<!--            android:id="@+id/open_test"-->
-<!--            android:text="打开默认应用"-->
-<!--            android:layout_width="wrap_content"-->
-<!--            android:layout_height="wrap_content"/>-->
-
-
         <FrameLayout
             android:id="@+id/surface_view"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"></FrameLayout>
+            android:layout_height="match_parent"/>
+
         <FrameLayout
             android:id="@+id/counter_down_wrap"
             android:layout_width="match_parent"
@@ -50,7 +25,7 @@
                 android:textColor="@color/white"
                 android:textSize="22sp"
                 android:textStyle="bold"
-                ></TextView>
+                />
         </FrameLayout>
 
     </FrameLayout>

+ 17 - 0
app/src/main/res/layout/digital_item.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_number"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@color/color_gray"
+        android:layout_margin="4dp"
+        android:padding="10dp"
+        android:gravity="center"
+        android:textSize="32sp"
+        android:textColor="@color/color_main"/>
+
+</LinearLayout>

+ 189 - 0
app/src/main/res/layout/server_config_dialog_lay.xml

@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <!--密码框-->
+    <LinearLayout
+        android:id="@+id/ll_password"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tv_psw_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:textSize="24sp"
+            android:hint="@string/input_password"
+            android:textColor="@color/color_main"/>
+
+        <GridView
+            android:id="@+id/grid_psw"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="10dp"
+            android:verticalSpacing="5dp"
+            android:horizontalSpacing="5dp"
+            android:numColumns="3"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:orientation="horizontal">
+            <TextView
+                android:id="@+id/btn_delete"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:padding="4dp"
+                android:gravity="center_horizontal"
+                android:text="@string/str_delete"
+                android:textSize="24sp"
+                android:textColor="@color/color_main"/>
+
+            <TextView
+                android:id="@+id/btn_cancel"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:padding="4dp"
+                android:gravity="center_horizontal"
+                android:text="@string/str_cancel"
+                android:textSize="24sp"
+                android:textColor="@color/color_main"/>
+            <TextView
+                android:id="@+id/btn_confirm"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:padding="4dp"
+                android:gravity="center_horizontal"
+                android:text="@string/str_confirm"
+                android:textSize="24sp"
+                android:textColor="@color/color_main"/>
+        </LinearLayout>
+    </LinearLayout>
+
+
+    <!--服务器ip配置-->
+    <LinearLayout
+        android:id="@+id/ll_server_config"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="20dp"
+        android:padding="10dp"
+        android:orientation="vertical"
+        android:visibility="gone">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Server IP:"
+                android:textSize="20sp"
+                android:textColor="@color/color_main"/>
+
+            <EditText
+                android:id="@+id/edit_url"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="4dp"
+                android:inputType="textUri"
+                android:textSize="20sp"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Port:"
+                android:textSize="20sp"
+                android:textColor="@color/color_main"/>
+
+            <EditText
+                android:id="@+id/edit_port"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="4dp"
+                android:inputType="number"
+                android:textSize="20sp"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:visibility="gone">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Sip IP:"
+                android:textSize="20sp"
+                android:textColor="@color/color_main"/>
+
+            <EditText
+                android:id="@+id/edit_sip_url"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="4dp"
+                android:inputType="textUri"
+                android:textSize="20sp"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:visibility="gone">
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:text="Sip port:"
+                android:textSize="20sp"
+                android:textColor="@color/color_main"/>
+
+            <EditText
+                android:id="@+id/edit_sip_port"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="4dp"
+                android:inputType="number"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp">
+            <TextView
+                android:id="@+id/btn_cancel_config"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="取消"
+                android:textSize="28sp"
+                android:textColor="@color/black"/>
+
+            <TextView
+                android:id="@+id/btn_save_config"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:text="保存"
+                android:textSize="28sp"
+                android:textColor="@color/black" />
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>

+ 32 - 8
app/src/main/res/layout/view_tips_layout.xml

@@ -6,27 +6,51 @@
     android:background="#2A9798"
     android:layout_gravity="center"
     android:gravity="center"
-    android:orientation="vertical"
-    >
+    android:orientation="vertical">
 
     <ImageView
         android:id="@+id/tips_image"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:src="@drawable/allow_in"
-
-        />
+        android:src="@drawable/allow_in" />
 
         <TextView
             android:id="@+id/tips_message"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="正在为您开门,请等待"
             android:textSize="40sp"
             android:textColor="@color/white"
             android:textStyle="bold"
-            android:layout_marginTop="20dp"
-            ></TextView>
+            android:layout_marginTop="20dp" />
 
+    <Button
+        android:id="@+id/btn_server_config"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="80dp"
+        android:padding="20dp"
+        android:text="@string/server_config"
+        android:textSize="40sp"
+        android:visibility="gone"/>
+
+    <Button
+        android:id="@+id/btn_exit"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="40dp"
+        android:padding="20dp"
+        android:text="@string/str_exit"
+        android:textSize="40sp"
+        android:visibility="gone"/>
+
+    <TextView
+        android:id="@+id/tv_version"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:textColor="@color/white"
+        android:textSize="30sp"
+        android:text="V--"
+        android:visibility="gone"/>
 </LinearLayout>
 

+ 11 - 0
app/src/main/res/values/colors.xml

@@ -7,4 +7,15 @@
     <color name="teal_700">#FF018786</color>
     <color name="black">#FF000000</color>
     <color name="white">#FFFFFFFF</color>
+
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
+    <color name="color_mask">#77000000</color>
+    <color name="color_white">#ffffffff</color>
+    <color name="color_gray">#e4e6e5</color>
+    <color name="color_red">#ea3a3d</color>
+    <color name="color_pop_header">#878a8a</color>
+
+    <color name="color_main">#2F9DF1</color>
 </resources>

+ 3 - 0
framework/build.gradle

@@ -78,6 +78,9 @@ dependencies {
      */
     compile 'com.alibaba:fastjson:1.2.23'
 
+    compile 'com.fasterxml.jackson.core:jackson-databind:2.9.5'
+    compile 'io.swagger:swagger-annotations:1.5.14'
+
     /**
      *   突破方法数限制
      */

+ 4 - 0
framework/src/main/java/com/wdkl/ncs/framework/api/DeviceApi.kt

@@ -11,6 +11,10 @@ interface DeviceApi {
     @GET("/ncs_url/getHostIP")
     fun getTcpServerHost(): Observable<ResponseBody>
 
+    //获取tcp服务器地址
+    @GET("/ncs_url/server_info")
+    fun getServerInfo(): Observable<ResponseBody>
+
     @GET("/api/v1/device/{ethMac}")
     fun getDeviceInfo(@Path("ethMac")ethMac:String): Observable<ResponseBody>
 }

+ 7 - 2
framework/src/main/java/com/wdkl/ncs/framework/api/UrlManager.kt

@@ -1,5 +1,8 @@
 package com.wdkl.ncs.framework.api
 
+import com.wdkl.ncs.framework.base.BaseApplication
+import com.wdkl.ncs.framework.utils.CommonUtils
+
 
 /**
  * @author LDD
@@ -47,9 +50,11 @@ interface UrlManager {
  */
 private class ProUrlManager : UrlManager{
 
-
+    val url: String = CommonUtils.getUrl(BaseApplication.appContext)
+    val port: String = CommonUtils.getUrlPort(BaseApplication.appContext)
 
     override val device_url: String
-        get() = "http://172.28.100.100:8006"
+        //get() = "http://172.28.100.100:8006"
+        get() = "http://$url:$port"
 
 }

+ 347 - 48
framework/src/main/java/com/wdkl/ncs/framework/beans/ServerInfo.java

@@ -1,80 +1,379 @@
 package com.wdkl.ncs.framework.beans;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+
 import java.io.Serializable;
 
+import io.swagger.annotations.ApiModelProperty;
 
+@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
 public class ServerInfo implements Serializable {
+    @ApiModelProperty(notes = "局域网TCP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String tcpLocalIp;
+    @ApiModelProperty(notes = "互联网TCP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String tcpPublicIp;
+    @ApiModelProperty(notes = "TCP端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer tcpPort;
+    @ApiModelProperty(notes = "TCP体征数据库端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer tcpVsPort;
+    @ApiModelProperty(notes = "TCP心跳间隔,单位:秒")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer tcpIdleSeconds;
+    @ApiModelProperty(notes = "TCP心跳是否开启")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Boolean tcpIdleLogEnabled;
+    @ApiModelProperty(notes = "平行主机模式是否开启")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Boolean openHostDeviceCombinedUse;
+
+    @ApiModelProperty(notes = "局域网HTTP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String httpLocalIp;
+    @ApiModelProperty(notes = "互联网HTTP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String httpPublicIp;
+    @ApiModelProperty(notes = "HTTP端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer httpPort;
+    @ApiModelProperty(notes = "HTTP System端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer httpSystemPort;
+
+    @ApiModelProperty(notes = "互联网HTTP服务器IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String voiceType;
+
+    @ApiModelProperty(notes = "媒体服务是否启用")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Boolean mediaEnable;
+    @ApiModelProperty(notes = "每个科室限制的广播数")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer mediaPartLimit;
+    @ApiModelProperty(notes = "局域网媒体服务IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String mediaLocalIp;
+    @ApiModelProperty(notes = "互联网媒体服务IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String mediaPublicIp;
+    @ApiModelProperty(notes = "媒体服务端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer mediaPort;
+
+    @ApiModelProperty(notes = "RTC Local IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String rtcLocalIp;
+    @ApiModelProperty(notes = "RTC Public IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String rtcPublicIp;
+    @ApiModelProperty(notes = "RTC 端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer rtcPort;
+
+    @ApiModelProperty(notes = "SIP LOCAL IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String sipIp;
+    @ApiModelProperty(notes = "SIP LOCAL 端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer sipPort;
+    @ApiModelProperty(notes = "SIP PUBLIC IP")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String sipPublicIp;
+    @ApiModelProperty(notes = "SIP LOCAL 端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer sipPublicPort;
+    @ApiModelProperty(notes = "SIP LOCAL 端口")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Integer sipBroadcastStart;
+
+    @ApiModelProperty(notes = "stun地址", example = "stun:xxx.xxx.xxx.xxx:3478")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String stunServer;
+    @ApiModelProperty(notes = "turn地址", example = "turn:xxx.xxx.xxx.xxx:3478|username|password")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String[] turnServer;
+
+    @ApiModelProperty(notes = "语言")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String lang;
+
+    @ApiModelProperty(notes = "led屏控制,true就是服务器控制,false就是护士主机控制")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Boolean ledControl;
+    @ApiModelProperty(notes = "true就是科室控制点阵屏,false就是医院控制点阵屏")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private Boolean ledControlPart;
+
+    @ApiModelProperty(notes = "录像文件的网关")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String recordGateway;
+    @ApiModelProperty(notes = "录像文件的存储路径")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String recordDir;
+
+    private Long serverTime;
+
+
+    private String appName;
+
+    public String getTcpLocalIp() {
+        return tcpLocalIp;
+    }
+
+    public void setTcpLocalIp(String tcpLocalIp) {
+        this.tcpLocalIp = tcpLocalIp;
+    }
+
+    public String getTcpPublicIp() {
+        return tcpPublicIp;
+    }
+
+    public void setTcpPublicIp(String tcpPublicIp) {
+        this.tcpPublicIp = tcpPublicIp;
+    }
+
+    public Integer getTcpPort() {
+        return tcpPort;
+    }
+
+    public void setTcpPort(Integer tcpPort) {
+        this.tcpPort = tcpPort;
+    }
+
+    public Integer getTcpVsPort() {
+        return tcpVsPort;
+    }
+
+    public void setTcpVsPort(Integer tcpVsPort) {
+        this.tcpVsPort = tcpVsPort;
+    }
+
+    public Integer getTcpIdleSeconds() {
+        return tcpIdleSeconds;
+    }
+
+    public void setTcpIdleSeconds(Integer tcpIdleSeconds) {
+        this.tcpIdleSeconds = tcpIdleSeconds;
+    }
+
+    public Boolean getTcpIdleLogEnabled() {
+        return tcpIdleLogEnabled;
+    }
+
+    public void setTcpIdleLogEnabled(Boolean tcpIdleLogEnabled) {
+        this.tcpIdleLogEnabled = tcpIdleLogEnabled;
+    }
+
+    public Boolean getOpenHostDeviceCombinedUse() {
+        return openHostDeviceCombinedUse;
+    }
+
+    public void setOpenHostDeviceCombinedUse(Boolean openHostDeviceCombinedUse) {
+        this.openHostDeviceCombinedUse = openHostDeviceCombinedUse;
+    }
+
+    public String getHttpLocalIp() {
+        return httpLocalIp;
+    }
+
+    public void setHttpLocalIp(String httpLocalIp) {
+        this.httpLocalIp = httpLocalIp;
+    }
+
+    public String getHttpPublicIp() {
+        return httpPublicIp;
+    }
+
+    public void setHttpPublicIp(String httpPublicIp) {
+        this.httpPublicIp = httpPublicIp;
+    }
+
+    public Integer getHttpPort() {
+        return httpPort;
+    }
+
+    public void setHttpPort(Integer httpPort) {
+        this.httpPort = httpPort;
+    }
+
+    public Integer getHttpSystemPort() {
+        return httpSystemPort;
+    }
+
+    public void setHttpSystemPort(Integer httpSystemPort) {
+        this.httpSystemPort = httpSystemPort;
+    }
+
+    public String getRtcLocalIp() {
+        return rtcLocalIp;
+    }
+
+    public void setRtcLocalIp(String rtcLocalIp) {
+        this.rtcLocalIp = rtcLocalIp;
+    }
+
+    public String getRtcPublicIp() {
+        return rtcPublicIp;
+    }
+
+    public void setRtcPublicIp(String rtcPublicIp) {
+        this.rtcPublicIp = rtcPublicIp;
+    }
+
+    public Integer getRtcPort() {
+        return rtcPort;
+    }
+
+    public void setRtcPort(Integer rtcPort) {
+        this.rtcPort = rtcPort;
+    }
+
+    public String getSipIp() {
+        return sipIp;
+    }
+
+    public void setSipIp(String sipIp) {
+        this.sipIp = sipIp;
+    }
+
+    public Integer getSipPort() {
+        return sipPort;
+    }
+
+    public void setSipPort(Integer sipPort) {
+        this.sipPort = sipPort;
+    }
+
+    public String getStunServer() {
+        return stunServer;
+    }
+
+    public void setStunServer(String stunServer) {
+        this.stunServer = stunServer;
+    }
+
+    public String[] getTurnServer() {
+        return turnServer;
+    }
+
+    public void setTurnServer(String[] turnServer) {
+        this.turnServer = turnServer;
+    }
+
+    public Long getServerTime() {
+        return serverTime;
+    }
 
-    /**
-     * api ip地址
-     */
-    private String apiServer;
-    /**
-     * api 接口地址
-     */
-    private Long apiServerPort;
-    /**
-     * webrtc 服务器Ip
-     */
-    private String webrtcServer;
-    /**
-     * webrtc 服务器端口
-     */
-    private Long webrtcServerPort;
-    /**
-     * webrtc stun 服务器地址
-     */
-    private String webrtcStunServer;
-    /**
-     * webrtc stun 端口
-     */
-    private Long webrtcStunServerPort;
+    public void setServerTime(Long serverTime) {
+        this.serverTime = serverTime;
+    }
+
+    public String getLang() {
+        return lang;
+    }
+
+    public void setLang(String lang) {
+        this.lang = lang;
+    }
+
+    public Boolean getMediaEnable() {
+        return mediaEnable;
+    }
+
+    public void setMediaEnable(Boolean mediaEnable) {
+        this.mediaEnable = mediaEnable;
+    }
+
+    public String getMediaLocalIp() {
+        return mediaLocalIp;
+    }
+
+    public void setMediaLocalIp(String mediaLocalIp) {
+        this.mediaLocalIp = mediaLocalIp;
+    }
+
+    public String getMediaPublicIp() {
+        return mediaPublicIp;
+    }
+
+    public void setMediaPublicIp(String mediaPublicIp) {
+        this.mediaPublicIp = mediaPublicIp;
+    }
+
+    public Integer getMediaPort() {
+        return mediaPort;
+    }
+
+    public void setMediaPort(Integer mediaPort) {
+        this.mediaPort = mediaPort;
+    }
+
+    public Integer getMediaPartLimit() {
+        return mediaPartLimit;
+    }
+
+    public void setMediaPartLimit(Integer mediaPartLimit) {
+        this.mediaPartLimit = mediaPartLimit;
+    }
+
+    public Boolean getLedControl() {
+        return ledControl;
+    }
+
+    public void setLedControl(Boolean ledControl) {
+        this.ledControl = ledControl;
+    }
 
-    public String getApiServer() {
-        return apiServer;
+    public Boolean getLedControlPart() {
+        return ledControlPart;
     }
 
-    public void setApiServer(String apiServer) {
-        this.apiServer = apiServer;
+    public void setLedControlPart(Boolean ledControlPart) {
+        this.ledControlPart = ledControlPart;
     }
 
-    public Long getApiServerPort() {
-        return apiServerPort;
+    public String getRecordGateway() {
+        return recordGateway;
     }
 
-    public void setApiServerPort(Long apiServerPort) {
-        this.apiServerPort = apiServerPort;
+    public void setRecordGateway(String recordGateway) {
+        this.recordGateway = recordGateway;
     }
 
-    public String getWebrtcServer() {
-        return webrtcServer;
+    public String getRecordDir() {
+        return recordDir;
     }
 
-    public void setWebrtcServer(String webrtcServer) {
-        this.webrtcServer = webrtcServer;
+    public void setRecordDir(String recordDir) {
+        this.recordDir = recordDir;
     }
 
-    public Long getWebrtcServerPort() {
-        return webrtcServerPort;
+    public String getVoiceType() {
+        return voiceType;
     }
 
-    public void setWebrtcServerPort(Long webrtcServerPort) {
-        this.webrtcServerPort = webrtcServerPort;
+    public String getSipPublicIp() {
+        return sipPublicIp;
     }
 
-    public String getWebrtcStunServer() {
-        return webrtcStunServer;
+    public Integer getSipPublicPort() {
+        return sipPublicPort;
     }
 
-    public void setWebrtcStunServer(String webrtcStunServer) {
-        this.webrtcStunServer = webrtcStunServer;
+    public Integer getSipBroadcastStart() {
+        return sipBroadcastStart;
     }
 
-    public Long getWebrtcStunServerPort() {
-        return webrtcStunServerPort;
+    public String getAppName() {
+        return appName;
     }
 
-    public void setWebrtcStunServerPort(Long webrtcStunServerPort) {
-        this.webrtcStunServerPort = webrtcStunServerPort;
+    public void setAppName(String appName) {
+        this.appName = appName;
     }
 }

+ 85 - 0
framework/src/main/java/com/wdkl/ncs/framework/utils/CommonUtils.java

@@ -0,0 +1,85 @@
+package com.wdkl.ncs.framework.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.text.TextUtils;
+
+public class CommonUtils {
+
+    private static final String SP_NAME = "SP_URL";
+    private static final String KEY_SP_THIRD_URL = "KEY_SP_THIRD_URL";
+    private static final String KEY_SP_THIRD_URL_PORT = "KEY_SP_THIRD_URL_PORT";
+    private static final String KEY_SP_URL = "KEY_SP_URL";
+    private static final String KEY_SP_URL_PORT = "KEY_SP_URL_PORT";
+    private static final String KEY_SP_SIP_URL = "KEY_SP_SIP_URL";
+    private static final String KEY_SP_SIP_PORT = "KEY_SP_SIP_PORT";
+
+    //默认ip端口
+    //private static final String DEFAULT_URL = "8.129.220.143";
+    private static final String DEFAULT_URL = "172.28.100.100";
+    //private static final String DEFAULT_URL = "192.168.9.200";
+    //private static final String DEFAULT_URL = "192.168.8.5";
+    //private static final String DEFAULT_URL = "192.168.101.1";
+    //private static final String DEFAULT_URL = "47.106.137.131";  //新云服
+    private static final String DEFAULT_URL_PORT = "8006";
+    private static final String DEFAULT_SIP_PORT = "8188";
+
+
+    public static String subStringBefore(String origin, String delimiter) {
+        if (!TextUtils.isEmpty(origin) && !TextUtils.isEmpty(delimiter) && origin.length() > 0) {
+            int index = origin.indexOf(delimiter);
+            if (index > 0) {
+                return origin.substring(0, index);
+            } else {
+                return origin;
+            }
+        } else {
+            return origin;
+        }
+    }
+
+    public static String subStringAfter(String origin, String delimiter) {
+        if (!TextUtils.isEmpty(origin) && !TextUtils.isEmpty(delimiter) && origin.length() > 0) {
+            int index = origin.indexOf(delimiter)+1;
+            int len = origin.length();
+            if (index > 0 && index < len) {
+                return origin.substring(index);
+            } else {
+                return origin;
+            }
+        } else {
+            return origin;
+        }
+    }
+
+
+    public static String getUrl(Context context) {
+        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_URL, DEFAULT_URL))) {
+            return DEFAULT_URL;
+        }
+        return getSP(context).getString(KEY_SP_URL, DEFAULT_URL);
+    }
+
+    public static void setUrl(Context context, String url) {
+        getEditor(context).putString(KEY_SP_URL, url).apply();
+    }
+
+    public static String getUrlPort(Context context) {
+        if (TextUtils.isEmpty(getSP(context).getString(KEY_SP_URL_PORT, DEFAULT_URL_PORT))) {
+            return DEFAULT_URL_PORT;
+        }
+        return getSP(context).getString(KEY_SP_URL_PORT, DEFAULT_URL_PORT);
+    }
+
+    public static void setUrlPort(Context context, String port) {
+        getEditor(context).putString(KEY_SP_URL_PORT, port).apply();
+    }
+
+    private static SharedPreferences getSP(Context context) {
+        return context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
+    }
+
+    private static SharedPreferences.Editor getEditor(Context context) {
+        return getSP(context).edit();
+    }
+}

+ 17 - 10
janus/src/main/java/com/wdkl/ncs/janus/util/Constant.java

@@ -8,14 +8,21 @@ public class Constant {
 
     public final static ServerInfo serverInfo = ServerInfoUtil.getServerInfo();
 
-//    public final static String GATEWAY_URL="8.129.220.143";
-    public final static String GATEWAY_URL=(serverInfo==null?"172.28.100.100":serverInfo.getWebrtcServer());
-    public final static String GATEWAY_WS_PORT=(serverInfo==null?"8188":serverInfo.getWebrtcServerPort().toString());
-//    public final static String GATEWAY_URL="120.76.246.253";
-//    public final static String GATEWAY_WS_PORT="5089";
-    public final static String JANUS_URL = "ws://"+Constant.GATEWAY_URL+":" + Constant.GATEWAY_WS_PORT;
-
-//    public final static String[] STUN_SERVER = new String[]{"stun:120.76.246.253:3478"};
-public final static String[] STUN_SERVER = new String[]{"stun:"+(serverInfo==null?GATEWAY_URL:serverInfo.getWebrtcStunServer())+":"+(serverInfo==null?"3478":serverInfo.getWebrtcStunServerPort().toString())};
-    public final static String[] TURN_SERVER = null; //new String[]{"turn:stun.l.google.com:19302|username|password"};
+    //public final static String GATEWAY_URL="8.129.220.143";
+    //public final static String GATEWAY_URL=(serverInfo==null?"172.28.100.100":serverInfo.getWebrtcServer());
+    //public final static String GATEWAY_WS_PORT=(serverInfo==null?"8188":serverInfo.getWebrtcServerPort().toString());
+    //public final static String GATEWAY_URL="120.76.246.253";
+    //public final static String GATEWAY_WS_PORT="5089";
+    //public final static String JANUS_URL = "ws://"+Constant.GATEWAY_URL+":" + Constant.GATEWAY_WS_PORT;
+
+    //public final static String[] STUN_SERVER = new String[]{"stun:120.76.246.253:3478"};
+    //public final static String[] STUN_SERVER = new String[]{"stun:"+(serverInfo==null?GATEWAY_URL:serverInfo.getWebrtcStunServer())+":"+(serverInfo==null?"3478":serverInfo.getWebrtcStunServerPort().toString())};
+    //public final static String[] TURN_SERVER = null; //new String[]{"turn:stun.l.google.com:19302|username|password"};
+
+
+    public static String JANUS_URL = "ws://172.28.100.100:8188"; //默认的
+    //public static String STUN1 = "stun:" +GATEWAY_URL+ ":3478";
+    public static String[] STUN_SERVER = null; //new String[]{STUN1};
+
+    public static String[] TURN_SERVER = null; //new String[]{"turn:stun.l.google.com:19302|username|password"};
 }

+ 14 - 0
resource/src/main/res/values-es/strings.xml

@@ -8,4 +8,18 @@
     <string name="not_allowed">Desautorizado</string>
     <string name="call_timeout">cuenta regresiva: %ds</string>
     <string name="call_no_response">Sin respuesta</string>
+
+    <string name="server_config">Server config</string>
+    <string name="str_exit">Exit</string>
+    <string name="input_password">Introducir contrase?a</string>
+    <string name="invalid_password">Error de contrase?a</string>
+    <string name="input_empty">Error de parámetros</string>
+    <string name="confirm_down_time">Confirmar(%d)</string>
+    <string name="str_confirm">Confirmar</string>
+    <string name="str_cancel">Cancelar</string>
+    <string name="str_delete">Eliminar</string>
+    <string name="str_save">Guardar</string>
+    <string name="str_loading">Carga</string>
+    <string name="str_yes">Sí</string>
+    <string name="str_no">No</string>
 </resources>

+ 14 - 0
resource/src/main/res/values-ru/strings.xml

@@ -8,4 +8,18 @@
     <string name="not_allowed">Несанкционированный</string>
     <string name="call_timeout">отсчёт: %ds</string>
     <string name="call_no_response">Нет ответа</string>
+
+    <string name="server_config">Server config</string>
+    <string name="str_exit">Exit</string>
+    <string name="input_password">Введите пароль</string>
+    <string name="invalid_password">Ошибка пароля</string>
+    <string name="input_empty">Ошибка параметров</string>
+    <string name="confirm_down_time">Подтверждать(%d)</string>
+    <string name="str_confirm">Подтвердить</string>
+    <string name="str_cancel">Отменить</string>
+    <string name="str_delete">Удалить</string>
+    <string name="str_save">Сохранить</string>
+    <string name="str_loading">Загрузка</string>
+    <string name="str_yes">Да</string>
+    <string name="str_no">Нет</string>
 </resources>

+ 14 - 0
resource/src/main/res/values-zh/strings.xml

@@ -8,4 +8,18 @@
     <string name="not_allowed">未授权通行</string>
     <string name="call_timeout">等待响应倒计时: %d秒</string>
     <string name="call_no_response">无人应答,请稍后再试</string>
+
+    <string name="server_config">服务器配置</string>
+    <string name="str_exit">退出</string>
+    <string name="input_password">请输入密码</string>
+    <string name="invalid_password">密码错误</string>
+    <string name="input_empty">参数不能为空</string>
+    <string name="confirm_down_time">确定(%d)</string>
+    <string name="str_confirm">确定</string>
+    <string name="str_cancel">取消</string>
+    <string name="str_delete">删除</string>
+    <string name="str_save">保存</string>
+    <string name="str_loading">正在加载</string>
+    <string name="str_yes">是</string>
+    <string name="str_no">否</string>
 </resources>

+ 14 - 0
resource/src/main/res/values/strings.xml

@@ -8,4 +8,18 @@
     <string name="not_allowed">Not allowed</string>
     <string name="call_timeout">Countdown: %ds</string>
     <string name="call_no_response">No response</string>
+
+    <string name="server_config">Server config</string>
+    <string name="str_exit">Exit</string>
+    <string name="input_password">Input password</string>
+    <string name="invalid_password">Password error</string>
+    <string name="input_empty">Params error</string>
+    <string name="confirm_down_time">Confirm(%d)</string>
+    <string name="str_confirm">Confirm</string>
+    <string name="str_cancel">Cancel</string>
+    <string name="str_delete">Delete</string>
+    <string name="str_save">Save</string>
+    <string name="str_loading">Loading</string>
+    <string name="str_yes">Yes</string>
+    <string name="str_no">No</string>
 </resources>