浏览代码

增加网卡断电功能

weizhengliang 1 年之前
父节点
当前提交
c2e29b5acc

+ 60 - 15
android_bed/src/main/h7_3128/java/com/wdkl/app/ncs/callingbed/activity/CallingbedActivity.kt

@@ -114,9 +114,11 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2M
 
     private var clickTime : Long = 0
     private var clickSosTime : Long = 0
+    private var checkTime: Long = 0
 
     //网络异常计数
     private var netErrCount : Int = 0
+    private var serverConnectTimes: Int = 0
 
     private var copyDone = false
     private var serverSuccess = false
@@ -176,6 +178,8 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2M
             Constant.LOCAL_MAC = NetHelper.getInstance().imei
         }
 
+        checkTime = System.currentTimeMillis()
+
         //注册广播
         regReceiver()
         RecordHelper.getInstance().init()
@@ -219,6 +223,8 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2M
 
         checkServer()
 
+        checkServerConnect()
+
         SoundPoolManager.getInstance().init()
 
         if ("rk3128".equals(Build.MODEL)) {
@@ -290,6 +296,28 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2M
     }
 
 
+    private fun checkServerConnect() {
+        val timerTask: TimerTask = object : TimerTask() {
+            override fun run() {
+                if (Constant.TCP_CONNECTED) {
+                    serverConnectTimes = 0
+                } else {
+                    //设备有ip地址,但是tcp未连接,可能是服务器地址不对或者中途网络断开或者服务端异常
+                    if (!TextUtils.isEmpty(NetHelper.getInstance().localIP)) {
+                        serverConnectTimes++
+                    }
+                    Log.e(TAG, "check tcp server connect ===> serverConnectTimes=$serverConnectTimes")
+                    if (serverConnectTimes >= 20) {
+                        //tcp检测断开连接次数超过20则重启设备
+                        AppUpdateHelper.systemRestart()
+                    }
+                }
+            }
+        }
+        val executor = Executors.newSingleThreadScheduledExecutor()
+        executor.scheduleAtFixedRate(timerTask, 120, 100, TimeUnit.SECONDS)
+    }
+
     private fun checkServer() {
         Thread {
             while (!serverSuccess) {
@@ -806,18 +834,18 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2M
         SettingConfig.setNetErrResetCount(this, 0)
         WarningDialogHelper.dismiss()
 
-        Thread(Runnable {
+        Thread {
             while (!initialized) {
-                runOnUiThread(Runnable {
-                    initDevice()
-                })
+
+                initDevice()
+
                 try {
-                    Thread.sleep(20000)
+                    Thread.sleep(30000)
                 } catch (e: Exception) {
                     //
                 }
             }
-        }).start()
+        }.start()
 
 
         //通过服务端设置语言
@@ -1446,6 +1474,7 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2M
                     + ", net error count: " + count)
             if (!Constant.TCP_CONNECTED && TextUtils.isEmpty(NetHelper.getInstance().localIP)) {
                 netErrCount++
+                Log.e(TAG, "network error!!! ==> netErrCount: $netErrCount, reset count: $count")
             } else {
                 netErrCount = 0
                 if (count > 0) {
@@ -1463,27 +1492,43 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, Callingbed2M
                     handler.postDelayed({
                         AppUpdateHelper.reboot(this, true)
                     }, 5000)
+
+                    netOffReset()
                 } else {
                     runOnUiThread {
                         WarningDialogHelper.showDialog(this@CallingbedActivity)
                     }
 
-
                     //隔2个小时再重启
-                    val calendar = Calendar.getInstance()
-                    val hour = calendar[Calendar.HOUR_OF_DAY]
-                    val minute = calendar[Calendar.MINUTE]
-                    Log.e(TAG, "show net error dialog --> hour: $hour, minute: $minute")
-                    if (hour%2 == 0 && minute == 0) {
-                        handler.postDelayed({
-                            AppUpdateHelper.reboot(activity, true)
-                        }, 5000)
+                    val time = System.currentTimeMillis()
+                    val errTime = time - checkTime
+                    Log.e(TAG, "show net error dialog --> errTime = $errTime")
+                    if (errTime >= 2*60*60*1000) {
+                        checkTime = time
+                        netOffReset()
                     }
                 }
             }
         }
     }
 
+    //网卡断电再上电,并重启设备
+    private fun netOffReset() {
+        Thread {
+            try {
+                SerialPortHelper.netOff(true)
+                Thread.sleep(5000)
+                SerialPortHelper.netOff(false)
+
+                //重启
+                Thread.sleep(5000)
+                AppUpdateHelper.reboot(activity, true)
+            } catch (ex: Exception) {
+                //
+            }
+        }.start()
+    }
+
     private fun updateStatus(state: String) {
         this.runOnUiThread {
             when (state) {

+ 19 - 4
android_bed/src/main/h7_3128/java/com/wdkl/app/ncs/callingbed/fragment/QrCodeFragment.kt

@@ -73,7 +73,7 @@ class QrCodeFragment : BaseFragment<QrCodeFragmentPresenter, QrCodeLayBinding>()
             builder.append(Constant.DEVICE_TYPE)
             builder.append("&device_name=")
             builder.append(Constant.DEVICE_NAME)
-            val code = EcodeHelper().createQRImage(builder.toString(),200, null)
+            val code = EcodeHelper().createQRImage(builder.toString(),220, null)
             activity.runOnUiThread {
                 if (view_qr_code != null) {
                     view_qr_code?.setImageBitmap(code)
@@ -107,7 +107,7 @@ class QrCodeFragment : BaseFragment<QrCodeFragmentPresenter, QrCodeLayBinding>()
 
         tv_about_me.movementMethod = ScrollingMovementMethod.getInstance()
 
-        if ("rk3128".equals(Build.MODEL)) {
+        /*if ("rk3128".equals(Build.MODEL)) {
             if (Constant.CUSTOM_ID == -1) {
                 tv_device_test.visibility = View.VISIBLE
             } else {
@@ -115,7 +115,7 @@ class QrCodeFragment : BaseFragment<QrCodeFragmentPresenter, QrCodeLayBinding>()
             }
         } else {
             tv_device_test.visibility = View.GONE
-        }
+        }*/
     }
 
     override fun bindEvent() {
@@ -130,7 +130,22 @@ class QrCodeFragment : BaseFragment<QrCodeFragmentPresenter, QrCodeLayBinding>()
         }
 
         tv_btn_reboot.setOnClickListener {
-            AppUpdateHelper.reboot(context, false)
+
+            tv_btn_reboot.isEnabled = false
+
+            Thread {
+                try {
+                    SerialPortHelper.netOff(true)
+                    Thread.sleep(5000)
+                    SerialPortHelper.netOff(false)
+
+                    //重启
+                    Thread.sleep(5000)
+                    AppUpdateHelper.reboot(activity, true)
+                } catch (ex: Exception) {
+                    //
+                }
+            }.start()
         }
 
         //长按二维码启动camera预览

+ 34 - 9
android_bed/src/main/h7_3128/java/com/wdkl/app/ncs/callingbed/fragment/TestFragment.kt

@@ -1,15 +1,13 @@
 package com.wdkl.app.ncs.callingbed.fragment
 
 import android.hardware.Camera
+import android.text.method.ScrollingMovementMethod
 import android.view.SurfaceHolder
 import android.view.View
 import com.enation.javashop.net.engine.model.NetState
 import com.wdkl.app.ncs.callingbed.R
 import com.wdkl.app.ncs.callingbed.databinding.TestFragmentLayBinding
-import com.wdkl.app.ncs.callingbed.helper.MediaPlayHelper
-import com.wdkl.app.ncs.callingbed.helper.RecordHelper
-import com.wdkl.app.ncs.callingbed.helper.SerialPortHelper
-import com.wdkl.app.ncs.callingbed.helper.SoundPoolManager
+import com.wdkl.app.ncs.callingbed.helper.*
 import com.wdkl.app.ncs.callingbed.launch.CallingbedLaunch
 import com.wdkl.ncs.android.lib.base.BaseFragment
 import com.wdkl.ncs.android.lib.vo.filter
@@ -31,6 +29,8 @@ class TestFragment : BaseFragment<QrCodeFragmentPresenter, TestFragmentLayBindin
     var testButton2 = false
     var testButton3 = false
 
+    var netOff = false
+
     private var mCamera: Camera? = null
 
     override fun getLayId(): Int {
@@ -44,16 +44,41 @@ class TestFragment : BaseFragment<QrCodeFragmentPresenter, TestFragmentLayBindin
     override fun init() {
         RecordHelper.getInstance().init()
         SoundPoolManager.getInstance().playSound(4, 1.0f, 1.0f, 0)
+        tv_test_info.movementMethod = ScrollingMovementMethod.getInstance()
+        tv_ip.text = "IP:" + NetHelper.getInstance().localIP
 
         startCameraPreview()
     }
 
     override fun bindEvent() {
-        /*btn_test.setOnClickListener {
-            btn_test.isEnabled = false
-            //开始测试
-            startTest()
-        }*/
+        btn_reset.setOnClickListener {
+            SerialPortHelper.resetDevice()
+        }
+
+        btn_net_off.setOnClickListener {
+            if (netOff) {
+                netOff = false
+                SerialPortHelper.netOff(false)
+            } else {
+                netOff = true
+                SerialPortHelper.netOff(true)
+            }
+            btn_net_off.isEnabled = false
+
+            Thread {
+                try {
+                    Thread.sleep(5000)
+
+                    activity.runOnUiThread {
+                        tv_ip.text = "IP:" + NetHelper.getInstance().localIP
+                        btn_net_off.isEnabled = true
+                    }
+
+                } catch (ex: Exception) {
+                    //
+                }
+            }.start()
+        }
     }
 
     private fun startTest() {

+ 15 - 0
android_bed/src/main/h7_3128/java/com/wdkl/app/ncs/callingbed/helper/AppUpdateHelper.java

@@ -181,6 +181,21 @@ public class AppUpdateHelper {
         }
     }
 
+    public static void systemRestart() {
+        Process process;
+        PrintWriter printWriter;
+        try {
+            process = Runtime.getRuntime().exec("su");
+            printWriter = new PrintWriter(process.getOutputStream());
+            printWriter.println("reboot");
+            printWriter.flush();
+            printWriter.close();
+            process.waitFor();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
     public static void reboot(Context context, boolean reset) {
         if (Build.MODEL.equals("rk3128")) {
             SerialPortHelper.resetDevice();

+ 9 - 0
android_bed/src/main/h7_3128/java/com/wdkl/app/ncs/callingbed/helper/SerialPortHelper.java

@@ -62,4 +62,13 @@ public class SerialPortHelper {
             SerialPortUtil.getInstance().sendCommand(SerialPortUtil.NET_STATUS, "1", "F");
         }
     }
+
+    //网卡断电
+    public static void netOff(boolean off) {
+        if (off) {
+            SerialPortUtil.getInstance().sendCommand(SerialPortUtil.RTLRESET, "1", "F");
+        } else {
+            SerialPortUtil.getInstance().sendCommand(SerialPortUtil.RTLRESET, "0", "F");
+        }
+    }
 }

+ 19 - 1
android_bed/src/main/h7_3128/java/com/wdkl/app/ncs/callingbed/helper/WarningDialogHelper.java

@@ -26,7 +26,25 @@ public class WarningDialogHelper {
         button.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                AppUpdateHelper.reboot(activity, true);
+
+                button.setEnabled(false);
+
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            SerialPortHelper.netOff(true);
+                            Thread.sleep(5000);
+                            SerialPortHelper.netOff(false);
+
+                            //重启
+                            Thread.sleep(5000);
+                            AppUpdateHelper.reboot(activity, true);
+                        } catch (Exception e) {
+                            //
+                        }
+                    }
+                }).start();
             }
         });
 

+ 35 - 10
android_bed/src/main/h7_3128/res/layout/test_fragment_lay.xml

@@ -7,17 +7,42 @@
     android:orientation="vertical"
     android:padding="10dp">
 
-    <!--<Button
-        android:id="@+id/btn_test"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Start"
-        android:textSize="28sp"/>-->
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+        <SurfaceView
+            android:id="@+id/camera_preview_surface"
+            android:layout_width="160dp"
+            android:layout_height="160dp" />
+
+        <Button
+            android:id="@+id/btn_reset"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="10dp"
+            android:layout_toRightOf="@id/camera_preview_surface"
+            android:text="重置"
+            android:textSize="28sp"/>
+
+        <Button
+            android:id="@+id/btn_net_off"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="10dp"
+            android:layout_toRightOf="@id/btn_reset"
+            android:text="网络开关"
+            android:textSize="28sp"/>
 
-    <SurfaceView
-        android:id="@+id/camera_preview_surface"
-        android:layout_width="160dp"
-        android:layout_height="160dp" />
+        <TextView
+            android:id="@+id/tv_ip"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="10dp"
+            android:layout_toRightOf="@id/camera_preview_surface"
+            android:layout_below="@id/btn_reset"
+            android:textSize="20sp"
+            android:text="IP:"/>
+    </RelativeLayout>
 
     <TextView
         android:id="@+id/tv_camera"

+ 2 - 0
bedlib/src/main/java/serialporttest/utils/SerialPortUtil.java

@@ -473,6 +473,8 @@ public class SerialPortUtil {
      */
     public static final String NET_STATUS = "NETRESET";
 
+    public static final String RTLRESET = "RTLRESET";
+
     /**
      * 心跳控制<br>
      * 若MCU在10秒内没有收到信号,将自动重启Android.  随机数为“W”时将关闭心跳<br>