Przeglądaj źródła

增加网络检测功能

weizhengliang 2 lat temu
rodzic
commit
55133d495b

+ 1 - 1
app/src/main/code/com/wdkl/app/ncs/application/Application.kt

@@ -77,7 +77,7 @@ class Application : BaseApplication() {
      */
     private fun initFrame() {
         //禁止滑掉退出
-        BaseConfig.getInstance().addActivity("WatchHome2Activity", "NewEventListActivity", "AppUpdateActivity")
+        BaseConfig.getInstance().addActivity("WatchHome2Activity", "NewEventListActivity", "AppUpdateActivity", "NetworkCheckActivity")
 
         NetEngineConfig.init(baseContext)
                 .openLogger()

+ 1 - 0
home/src/main/AndroidManifest.xml

@@ -40,6 +40,7 @@
         <activity android:screenOrientation="portrait" android:name=".activity.WatchUserSettingActivity" />
         <activity android:screenOrientation="portrait" android:name=".activity.TakeoverActivity" />
         <activity android:screenOrientation="portrait" android:name=".activity.AppUpdateActivity" />
+        <activity android:screenOrientation="portrait" android:name=".activity.NetworkCheckActivity" />
         <activity android:screenOrientation="portrait" android:name=".activity.NewEventListActivity"
             android:launchMode="singleTask"/>
         <activity android:name=".activity.VoiceMsgActivity" android:screenOrientation="portrait"/>

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

@@ -0,0 +1,151 @@
+package com.wdkl.ncs.android.component.home.activity
+
+import android.graphics.Color
+import android.util.Log
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.databinding.ActivityNetworkCheckBinding
+import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.util.PingUtil
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.lib.vo.MessageEvent
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
+import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
+import com.wdkl.ncs.android.middleware.model.ServerIpInfo
+import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.ChannelDO
+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.WatchContactVO
+import com.wdkl.ncs.android.middleware.utils.CommonUtils
+import kotlinx.android.synthetic.main.activity_network_check.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class NetworkCheckActivity: BaseActivity<WatchHomeActivityPresenter, ActivityNetworkCheckBinding>(), WatchHomeActivityContract.View {
+    private var clickTime: Long = 0
+
+    var builder = StringBuilder()
+
+    override fun getLayId(): Int {
+        return R.layout.activity_network_check
+    }
+
+    override fun bindDagger() {
+        HomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        tv_check_host_ip.setText("Host IP: " + CommonUtils.getUrl(this))
+
+        Thread {
+            PingUtil.setCallback(object : PingUtil.PingCallback {
+                override fun onPingInfo(info: String?) {
+                    updatePingInfo("ping result: $info")
+                }
+
+                override fun onPingResult(rtt: Int, lostRate: Float) {
+                    updatePingInfo("RTT: $rtt, LostRate: $lostRate")
+                }
+            })
+
+            //val result = PingUtil.parseRTT(CommonUtils.getUrl(BaseApplication.appContext), PingUtil.TYPE_AVG, 10, 100);
+            val result = PingUtil.parseRTT(CommonUtils.getUrl(BaseApplication.appContext))
+            Log.d("ping", "check result: $result")
+            updatePingResult(result)
+        }.start()
+    }
+
+    private fun updatePingInfo(info: String) {
+        builder.append(info)
+        runOnUiThread {
+            tv_check_net_info.setText(builder.toString())
+        }
+    }
+
+    private fun updatePingResult(result: String) {
+        runOnUiThread {
+            /*if (PingUtil.RESULT_BAD == result) {
+                tv_check_net_result.setTextColor(Color.RED)
+            } else if (PingUtil.RESULT_NORMAL == result) {
+                tv_check_net_result.setTextColor(Color.YELLOW)
+            } else if (PingUtil.RESULT_GOOD == result) {
+                tv_check_net_result.setTextColor(Color.GREEN)
+            }
+            tv_check_net_result.setText(result)*/
+
+            tv_check_net_result.setTextColor(Color.RED)
+            tv_check_net_result.setText("Check complete")
+        }
+    }
+
+    override fun bindEvent() {
+        //
+    }
+
+    override fun destory() {
+        //
+    }
+
+    override fun enableHeadsetVoiceMsg(): Boolean {
+        return false
+    }
+
+    override fun handleAppVersion(appInfo: AppVersionDO) {
+    }
+
+    override fun setDeviceDo(data: DeviceVO) {
+    }
+
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+    }
+
+    override fun setServerInfo(serverIpInfo: ServerIpInfo) {
+    }
+
+    override fun setDeviceSettingData(partSettingDO: PartSettingDO) {
+    }
+
+    override fun setDeviceVoiceChannel(channelList: ArrayList<ChannelDO>) {
+    }
+
+    override fun setPhoneNumberWhiteList(phoneList: ArrayList<String>) {
+    }
+
+    override fun setContact(contactsVOs: List<WatchContactVO>) {
+
+    }
+
+    override fun onBackPressed() {
+        if (System.currentTimeMillis() - clickTime > 2000) {
+            showMessage(R.string.click_twice_to_back)
+        } else {
+            super.onBackPressed()
+        }
+        clickTime = System.currentTimeMillis()
+    }
+
+    override fun onError(message: String, type: Int) {
+        showMessage(message)
+    }
+
+    override fun complete(message: String, type: Int) {
+
+    }
+
+    override fun start() {
+
+    }
+
+    override fun networkMonitor(state: NetState) {
+
+    }
+
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        //
+    }
+}

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

@@ -635,7 +635,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 presenter.getServerInfo()
 
                 try {
-                    Thread.sleep(5000)
+                    Thread.sleep(30000)
                 } catch (e: Exception) {
                 }
                 count--

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

@@ -24,12 +24,14 @@ import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig;
 import com.wdkl.ncs.android.component.home.util.AppUtils;
 import com.wdkl.ncs.android.component.home.util.LocaleMangerUtils;
 import com.wdkl.ncs.android.component.home.util.NetHelper;
+import com.wdkl.ncs.android.component.home.util.PingUtil;
 import com.wdkl.ncs.android.middleware.common.Constants;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
 import com.wdkl.ncs.android.lib.utils.ExtendMethodsKt;
 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.CommonUtils;
 
 public class WatchUserSettingActivity extends Activity {
     private static final String TAG = WatchUserSettingActivity.class.getSimpleName();
@@ -223,6 +225,15 @@ public class WatchUserSettingActivity extends Activity {
                 }
             }
         });
+
+
+        findViewById(R.id.btn_check_network).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(getApplicationContext(), NetworkCheckActivity.class);
+                startActivity(intent);
+            }
+        });
     }
 
     @Override

+ 2 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt

@@ -31,4 +31,6 @@ interface HomeComponent {
     fun inject(activity: VoiceMsgActivity)
 
     fun inject(activity: ChannelImActivity)
+
+    fun inject(activity: NetworkCheckActivity)
 }

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

@@ -0,0 +1,306 @@
+package com.wdkl.ncs.android.component.home.util;
+
+import android.util.Log;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.util.regex.Pattern;
+
+public class PingUtil {
+
+    //ip地址正则表达式
+    private static final String ipRegex =
+            "((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))";
+
+    //默认超时时间
+    private static final int TIME_OUT = 100;
+    //默认ping的次数
+    private static final int DEFAULT_COUNT = 5;
+
+    //最小RTT
+    public static final int TYPE_MIN = 1;
+    //平均RTT
+    public static final int TYPE_AVG = 2;
+    //最大RTT
+    public static final int TYPE_MAX = 3;
+    //RTT偏差
+    public static final int TYPE_MDEV = 4;
+
+    //网络ping的结果
+    public static final String RESULT_BAD = "bad";
+    public static final String RESULT_NORMAL = "normal";
+    public static final String RESULT_GOOD = "good";
+
+    private static PingCallback pingCallback;
+
+    /**
+     * 解析数据,延迟小于50为good,延迟在50~100之间或者丢包率为0为normal,
+     * 延迟在100以上或者返回失败或丢包率大于0,则返回bad
+     *
+     * @param url ping的地址
+     * @return
+     */
+    public static String parseRTT(String url) {
+        int pingRtt = getRTT(url);
+        float pingLostRate = getPacketLossFloat(url);
+        if (pingCallback != null) {
+            pingCallback.onPingResult(pingRtt, pingLostRate);
+        }
+
+        if (pingRtt > 0 && pingRtt < 50) {
+            return RESULT_GOOD;
+        } else if ((pingRtt <= 100 && pingRtt > 50) || pingLostRate == 0) {
+            return RESULT_NORMAL;
+        } else if (pingRtt > 100 || pingRtt < 0 || pingLostRate > 0) {
+            return RESULT_BAD;
+        }
+        return RESULT_BAD;
+    }
+
+    /**
+     * 解析数据,延迟小于50为good,延迟在50~100之间或者丢包率为0为normal,
+     * 延迟在100以上或者返回失败或丢包率大于0,则返回bad
+     *
+     * @param url     ping的地址
+     * @param type    ping的类型
+     * @param count   ping的次数
+     * @param timeout ping的超时时间
+     * @return
+     */
+    public static String parseRTT(String url, int type, int count, int timeout) {
+        int pingRtt = getRTT(url, type, count, timeout);
+        float pingLostRate = getPacketLossFloat(url, count, timeout);
+        if (pingRtt > 0 && pingRtt < 50) {
+            return RESULT_GOOD;
+        } else if ((pingRtt <= 100 && pingRtt > 50) || pingLostRate == 0) {
+            return RESULT_NORMAL;
+        } else if (pingRtt > 100 || pingRtt < 0 || pingLostRate > 0) {
+            return RESULT_BAD;
+        }
+        return RESULT_BAD;
+    }
+
+    /**
+     * 获取pingPTT值,默认为平均RTT
+     *
+     * @param url 需要ping的url地址
+     * @return RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
+     */
+    public static int getRTT(String url) {
+        return getRTT(url, TYPE_AVG);
+    }
+
+    /**
+     * 获取ping的RTT值
+     *
+     * @param url  需要ping的url地址
+     * @param type ping的类型
+     * @return RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
+     */
+    public static int getRTT(String url, int type) {
+        return getRTT(url, type, DEFAULT_COUNT, TIME_OUT);
+    }
+
+    /**
+     * 获取ping url的RTT
+     *
+     * @param url     需要ping的url地址
+     * @param type    ping的类型
+     * @param count   需要ping的次数
+     * @param timeout 需要ping的超时时间,单位 ms
+     * @return RTT值,单位 ms 注意:-1是默认值,返回-1表示获取失败
+     */
+    public static int getRTT(String url, int type, int count, int timeout) {
+        String domain = getDomain(url);
+        if(null == domain){
+            return -1;
+        }
+        String pingString = ping(createSimplePingCommand(count, timeout, domain));
+        Log.d("ping", pingString);
+        if (pingCallback != null) {
+            pingCallback.onPingInfo(pingString);
+        }
+        if (null != pingString) {
+            try {
+                //获取以"min/avg/max/mdev"为头的文本,分别获取此次的ping参数
+                String tempInfo = pingString.substring(pingString.indexOf("min/avg/max/mdev") + 19);
+                String[] temps = tempInfo.split("/");
+                switch (type) {
+                    case TYPE_MIN: {
+                        return Math.round(Float.parseFloat(temps[0]));
+                    }
+                    case TYPE_AVG: {
+                        return Math.round(Float.parseFloat(temps[1]));
+                    }
+                    case TYPE_MAX: {
+                        return Math.round(Float.parseFloat(temps[2]));
+                    }
+                    case TYPE_MDEV: {
+                        return Math.round(Float.parseFloat(temps[3]));
+                    }
+                    default: {
+                        return -1;
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 获取ping url的丢包率,浮点型
+     *
+     * @param url 需要ping的url地址
+     * @return 丢包率 如50%可得 50,注意:-1是默认值,返回-1表示获取失败
+     */
+    public static float getPacketLossFloat(String url) {
+        String packetLossInfo = getPacketLoss(url);
+        if (null != packetLossInfo) {
+            try {
+                return Float.parseFloat(packetLossInfo.replace("%", ""));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 获取ping url的丢包率,浮点型
+     *
+     * @param url     需要ping的url地址
+     * @param count   需要ping的次数
+     * @param timeout 需要ping的超时时间,单位 ms
+     * @return 丢包率 如50%可得 50,注意:-1是默认值,返回-1表示获取失败
+     */
+    public static float getPacketLossFloat(String url, int count, int timeout) {
+        String packetLossInfo = getPacketLoss(url, count, timeout);
+        if (null != packetLossInfo) {
+            try {
+                return Float.parseFloat(packetLossInfo.replace("%", ""));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 获取ping url的丢包率
+     *
+     * @param url 需要ping的url地址
+     * @return 丢包率 x%
+     */
+    public static String getPacketLoss(String url) {
+        return getPacketLoss(url, DEFAULT_COUNT, TIME_OUT);
+    }
+
+    /**
+     * 获取ping url的丢包率
+     *
+     * @param url     需要ping的url地址
+     * @param count   需要ping的次数
+     * @param timeout 需要ping的超时时间,单位ms
+     * @return 丢包率 x%
+     */
+    public static String getPacketLoss(String url, int count, int timeout) {
+        String domain = getDomain(url);
+        if (null == domain) {
+            return null;
+        }
+        String pingString = ping(createSimplePingCommand(count, timeout, domain));
+        if (null != pingString) {
+            try {
+                String tempInfo = pingString.substring(pingString.indexOf("received,"));
+                return tempInfo.substring(9, tempInfo.indexOf("packet"));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+
+    // ********************以下是一些辅助方法,设为private********************//
+
+    /**
+     * 域名获取
+     *
+     * @param url 网址
+     * @return
+     */
+    private static String getDomain(String url) {
+        String domain = null;
+        try {
+            domain = URI.create(url).getHost();
+            if (null == domain && isMatch(ipRegex,url)) {
+                domain = url;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return domain;
+    }
+
+    private static boolean isMatch(String regex, String string) {
+        return Pattern.matches(regex, string);
+    }
+
+    /**
+     * ping方法,调用ping指令
+     *
+     * @param command ping指令文本
+     * @return
+     */
+    private static String ping(String command) {
+        Process process = null;
+        try {
+            process = Runtime.getRuntime().exec(command);       //执行ping指令
+            InputStream is = process.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+            StringBuilder sb = new StringBuilder();
+            String line;
+            while (null != (line = reader.readLine())) {
+                sb.append(line);
+                sb.append("\n");
+            }
+            reader.close();
+            is.close();
+            return sb.toString();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (null != process) {
+                process.destroy();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * ping指令格式文本
+     *
+     * @param count   调用次数
+     * @param timeout 超时时间
+     * @param domain  地址
+     * @return
+     */
+    private static String createSimplePingCommand(int count, int timeout, String domain) {
+        return "/system/bin/ping -c " + count + " -w " + timeout + " " + domain;
+    }
+
+    public static void setCallback(PingCallback callback) {
+        pingCallback = callback;
+    }
+
+    public interface PingCallback {
+        void onPingInfo(String info);
+        void onPingResult(int rtt, float lostRate);
+    }
+}
+

+ 39 - 0
home/src/main/res/layout/activity_network_check.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="8dp"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_check_host_ip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="host IP:"
+                android:textColor="@color/colorPrimary"
+                android:textSize="18sp"/>
+
+            <TextView
+                android:id="@+id/tv_check_net_result"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text="Checking..."
+                android:textSize="28sp" />
+
+            <TextView
+                android:id="@+id/tv_check_net_info"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text=""
+                android:textSize="16sp"/>
+
+        </LinearLayout>
+    </ScrollView>
+</layout>

+ 14 - 1
home/src/main/res/layout/user_setting_layout.xml

@@ -256,11 +256,24 @@
                     android:text="@string/str_system_settings"
                     android:textSize="14dp" />
 
+                <Button
+                    android:id="@+id/btn_check_network"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:layout_marginRight="10dp"
+                    android:layout_toLeftOf="@id/view_center_base"
+                    android:layout_gravity="center_horizontal"
+                    android:layout_below="@id/btn_check_update"
+                    android:background="@drawable/javashop_btn_balck_line_bg"
+                    android:text="@string/str_check_net"
+                    android:textSize="14dp" />
+
                 <TextView
                     android:id="@+id/tv_call_title"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_below="@id/btn_check_update"
+                    android:layout_below="@id/btn_check_network"
                     android:layout_marginTop="16dp"
                     android:text="使用普通电话:"
                     android:textSize="16sp"

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

@@ -181,6 +181,7 @@
     <string name="str_user_change">Cambio de usuario</string>
     <string name="str_check_update">Comprobar actualización</string>
     <string name="str_system_settings">Configuración del sistema</string>
+    <string name="str_check_net">Net check</string>
     <string name="media_button_message">Habilitar mensaje de botón multimedia:</string>
 
     <string name="permission_tips">Otorgue permisos</string>

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

@@ -181,6 +181,7 @@
     <string name="str_user_change">User change</string>
     <string name="str_check_update">Check update</string>
     <string name="str_system_settings">System settings</string>
+    <string name="str_check_net">Net check</string>
     <string name="media_button_message">Enable media button message:</string>
 
     <string name="permission_tips">Please grant permissions</string>

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

@@ -181,6 +181,7 @@
     <string name="str_user_change">PC 关联</string>
     <string name="str_check_update">检查升级</string>
     <string name="str_system_settings">系统设置</string>
+    <string name="str_check_net">网络检测</string>
     <string name="media_button_message">开启按键留言:</string>
 
     <string name="permission_tips">请先授权再进入APP</string>

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

@@ -181,6 +181,7 @@
     <string name="str_user_change">User change</string>
     <string name="str_check_update">Check update</string>
     <string name="str_system_settings">System settings</string>
+    <string name="str_check_net">Net check</string>
     <string name="media_button_message">Enable media button message:</string>
 
     <string name="permission_tips">Please grant permissions</string>