Просмотр исходного кода

添加485电源控制板串口控制逻辑,添加响应服务端重启机器,打开网络调试指令

DESKTOP-34DQRNR\TJK 2 лет назад
Родитель
Сommit
4d212712db

+ 11 - 11
build.gradle

@@ -47,12 +47,12 @@ buildscript {
     /**
      * APP版本码
      */
-    ext.app_version_code = 36
+    ext.app_version_code = 37
 
     /**
      * APP版本号
      */
-    ext.app_version = "1.1.23"
+    ext.app_version = "1.1.24"
 
     /**
      * 项目依赖库
@@ -62,9 +62,9 @@ buildscript {
             /**
              * 依赖仓储
              */
-            maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
-            maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
-            maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+            maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
+            maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
+            maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
 
             //jcenter()
             mavenCentral()
@@ -97,9 +97,9 @@ buildscript {
     }
 
     repositories {
-        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
-        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
-        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
+        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
+        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
 
         jcenter()
         mavenCentral()
@@ -113,9 +113,9 @@ buildscript {
  */
 allprojects {
     repositories {
-        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
-        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
-        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
+        maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
+        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
 
         jcenter()
         mavenCentral()

+ 26 - 0
conversion_box/src/main/java/com/wdkl/app/ncs/conversion_box/activity/MainActivity.kt

@@ -42,6 +42,7 @@ import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.DeviceNurseInfoVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.OtherUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
@@ -137,6 +138,8 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
     private var serverSuccess = false
     private val handler by lazy { Handler(Looper.getMainLooper()) }
 
+    private var countDownTimer:CountDownTimer? = null
+
     override fun getLayId(): Int {
         return R.layout.main_activity_layout
     }
@@ -211,6 +214,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
         }
 
         SoundPoolManager.getInstance().init()
+
     }
 
     private fun checkAppExist() : Boolean {
@@ -1678,6 +1682,28 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                             } else {
                                 Constant.LATER_RESTART = true
                             }
+                        }else if(tcpModel.action == TcpAction.DeviceAction.REBOOT){ //重启转换盒系统
+
+                            AppUpdateHelper.reboot(activity)
+
+                        }else if(tcpModel.action==TcpAction.DeviceAction.OPEN_DEBUG){ //打开设备网络调试
+                            AppUpdateHelper.openNetWorkDebug()
+                        }else if (tcpModel.action==TcpAction.DeviceAction.S485_POWER_RESET){ //控制485线路板通断 0_1 重启第一路 0_1_0 关闭第一路 0_1_1 打开第一路 0_0_0关闭板上所有电路
+
+
+                            val pwcontrol = tcpModel.data.toString().split('_')
+                            DeviceUtil.s485PowerResetSuccess(Constant.DEVICE_ID,tcpModel.data.toString(),tcpModel.tid)
+                            if(pwcontrol.size==2){
+                                PowerControlUtil.controlPowerControl(pwcontrol[0].toInt(),pwcontrol[1].toInt(),true)
+                                AppTool.Time.delay(3000){
+                                    PowerControlUtil.controlPowerControl(pwcontrol[0].toInt(),pwcontrol[1].toInt(),false)
+                                }
+                            }else if(pwcontrol.size==3){
+                                    PowerControlUtil.controlPowerControl(pwcontrol[0].toInt(),pwcontrol[1].toInt(),pwcontrol[2].toInt()==0)
+
+                            }
+
+
                         }
                     } /*else if (tcpModel.type == TcpType.BROADCAST) {
                         if (tcpModel.action == TcpAction.BroadcastAction.START) {

+ 25 - 0
conversion_box/src/main/java/com/wdkl/app/ncs/conversion_box/helper/AppUpdateHelper.java

@@ -228,6 +228,31 @@ public class AppUpdateHelper {
         }
     }
 
+    //开启网络调试
+    public static void openNetWorkDebug(){
+
+        Process process;
+        PrintWriter printWriter;
+        try {
+            process = Runtime.getRuntime().exec("su");
+            printWriter = new PrintWriter(process.getOutputStream());
+            printWriter.println("/system/bin/sh");
+            printWriter.println("setprop service.adb.tcp.port 5555");
+            printWriter.println("stop adbd");
+            printWriter.println("start adbd");
+            printWriter.println("exit");
+            printWriter.flush();
+            printWriter.close();
+            int res = process.waitFor();
+            Log.e(TAG, "changePingMode res: " + res);
+        } catch (Exception e) {
+            Log.e(TAG, "changePingMode exception:" + e.getMessage());
+        }
+    }
+
+
+
+
     public static void restartApp(Context context) {
         //重新启动app
         Intent mStartActivity = new Intent(context.getApplicationContext(), WelcomeActivity.class);

+ 22 - 0
conversion_box/src/main/java/com/wdkl/app/ncs/conversion_box/helper/PowerControlUtil.java

@@ -0,0 +1,22 @@
+package com.wdkl.app.ncs.conversion_box.helper;
+
+import android.os.CountDownTimer;
+
+public class PowerControlUtil {
+
+    public static void controlPowerControl(Integer address,Integer lineNumber,Boolean off){
+        new CountDownTimer(3000,1000){
+
+            @Override
+            public void onTick(long l) { //每隔1秒发送一次控制指令,总共下发3次
+                SerialPortHelper.s485PowerControl(address,lineNumber,off);
+            }
+            @Override
+            public void onFinish() {
+
+            }
+        }.start();
+    }
+
+
+}

+ 93 - 0
conversion_box/src/main/java/com/wdkl/app/ncs/conversion_box/helper/SerialPortHelper.java

@@ -4,10 +4,24 @@ import android.util.Log;
 
 import com.wdkl.ncs.android.middleware.common.Constant;
 
+import java.nio.ByteBuffer;
+
 import serialporttest.utils.SerialPortUtil;
 
 public class SerialPortHelper {
 
+    //电源控制板关闭指令集,数组索引代表该索引+1路电路关闭指令。索引0 关闭第一路,1关闭第二路。
+    static String[] POWER_CONTROL_STATUS=new String[]{
+            "FFFFFFFE","FFFFFFFD","FFFFFFFB","FFFFFFF7",
+            "FFFFFFEF","FFFFFFDF","FFFFFFBF","FFFFFF7F",
+            "FFFFFEFF","FFFFFDFF","FFFFFBFF","FFFFF7FF",
+            "FFFFEFFF","FFFFDFFF","FFFFBFFF","FFFF7FFF",
+            "FFFEFFFF","FFFDFFFF","FFFBFFFF","FFF7FFFF",
+            "FFEFFFFF","FFDFFFFF","FFBFFFFF","FF7FFFFF",
+            "FEFFFFFF","FDFFFFFF","FBFFFFFF","F7FFFFFF",
+            "EFFFFFFF","DFFFFFFF","BFFFFFFF","7FFFFFFF"
+    };
+
     //重置设备
     public static void resetDevice() {
         SerialPortUtil.getInstance().sendCommand(SerialPortUtil.NET_STATUS , "1", "F");
@@ -109,4 +123,83 @@ public class SerialPortHelper {
     public static void changeCallingMode(String mode) {
         SerialPortUtil.getInstance().send(SerialPortUtil.C_HEARD + "F" + SerialPortUtil.C_SEPARATE + "FFFF" + mode + SerialPortUtil.C_END);
     }
+
+    public static void s485PowerControl(Integer controlAddress,Integer lineNumber,Boolean off){
+        if(lineNumber<0||lineNumber>32){ //传入线路序号小于0或者大于28,认为无效线路,如果是0认为是控制所有线路
+            return;
+        }
+        String address = String.format("%02x",controlAddress&0xFF);
+        StringBuilder sb = new StringBuilder();
+        sb.append("24").append(address).append("2C");
+//
+        byte[] bytes = new byte[9];
+//        bytes[0]=0x24;//$
+//        bytes[1]=; //控制板地址 0-7
+//        bytes[2]=0x2c;//,
+//        bytes[3]=0x00;//指令高位
+//        bytes[4]=0x00;
+//        bytes[5]=0x00;
+//        bytes[6]=0x00;//指令低位
+//        bytes[7]=0x46;//F
+//        bytes[8]=0x23;//#
+        String  controlStatus = "FFFFFFFF";
+        if(lineNumber>0){
+            controlStatus=POWER_CONTROL_STATUS[lineNumber-1];
+        }
+        if(off){//关闭电路
+            if(lineNumber==0){
+             controlStatus="00000000"; //关闭所有
+            }
+
+        }else{ //打开电路
+          controlStatus =  "FFFFFFFF";
+        }
+
+
+        byte[] commandBytes = hexStringToByteArray(controlStatus);
+
+        for (int i = 0; i < commandBytes.length; i++) { //与协议相反,按位取反
+            commandBytes[i]=(byte)~commandBytes[i];
+        }
+        sb.append(byteArrToHexString(commandBytes)).append("4623");
+        bytes=hexStringToByteArray(sb.toString());
+        Log.i("s485PowerControl", "s485PowerControl: "+bytes[0]+","+bytes[1]+","+bytes[2]+","+bytes[3]+","+bytes[4]+","+bytes[5]+","+bytes[6]+","+bytes[7]+","+bytes[8]+",");
+        SerialPortUtil.getInstance().send(bytes);
+    }
+
+
+    public static byte[] intToBytes(int a){
+        ByteBuffer bb = ByteBuffer.allocate(4);
+        bb.putInt(a);
+        return bb.array();
+    }
+
+
+
+    // 16进制表示的字符串转换为字节数组
+    public static byte[] hexStringToByteArray(String hexString) {
+        hexString = hexString.replaceAll(" ", "");
+        int len = hexString.length();
+        byte[] bytes = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
+            bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
+                    .digit(hexString.charAt(i + 1), 16));
+        }
+        return bytes;
+    }
+
+    /**
+     * 字节数组转16进制字符串
+     * @param b
+     * @return
+     */
+    public static String byteArrToHexString(byte[] b){
+        String result="";
+        for (int i=0; i < b.length; i++) {
+            result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring(1);
+        }
+        return result;
+    }
+
 }

+ 23 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceUtil.java

@@ -3,6 +3,7 @@ package com.wdkl.ncs.android.middleware.tcp.channel;
 import android.os.Build;
 
 import com.wdkl.ncs.android.middleware.BuildConfig;
+import com.wdkl.ncs.android.middleware.tcp.TcpClient;
 import com.wdkl.ncs.android.middleware.tcp.dto.DeviceConnectDTO;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
@@ -22,4 +23,26 @@ public class DeviceUtil {
         tcpModel.setData(connectDTO);
         return tcpModel;
     }
+
+
+    public static TcpModel deviceRs485PowerResetSuccess(Integer fromId, Object data,String tid){
+        return deviceRs485PowerResetSuccess(fromId,null,data,tid);
+    }
+
+    public static TcpModel deviceRs485PowerResetSuccess(Integer fromId, Integer toId, Object data,String tid){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.DEVICE);
+        tcpModel.setAction(TcpAction.DeviceAction.S485_POWER_RESET_SUCCESS);
+        tcpModel.setFromId(fromId);
+        tcpModel.setToId(toId);
+        tcpModel.setData(data);
+        tcpModel.setTid(tid);
+        return tcpModel;
+    }
+
+    //485电路控制成功
+    public static void s485PowerResetSuccess(Integer fromId, Object data,String tid) {
+        TcpModel tcpModel = DeviceUtil.deviceRs485PowerResetSuccess(fromId, data,tid);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
 }

+ 3 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VoiceUtil.java

@@ -133,4 +133,7 @@ public class VoiceUtil {
         TcpModel tcpModel = VoiceUtil.voiceReject(fromId, toId, interactionId);
         TcpClient.getInstance().sendMsg(tcpModel.toJson());
     }
+
+
+
 }

+ 13 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java

@@ -20,6 +20,8 @@ import java.util.Map;
  * 2021-03-30 11:49
  */
 public class TcpModel implements Serializable {
+
+    private String tid;
     /**
      * TCP传输对象的类型
      */
@@ -38,6 +40,7 @@ public class TcpModel implements Serializable {
      */
     private Integer toId;
 
+
     /**
      * TCP传输对象的数据
      */
@@ -87,6 +90,14 @@ public class TcpModel implements Serializable {
         return JSON.toJSONString(this);
     }
 
+    public String getTid() {
+        return tid;
+    }
+
+    public void setTid(String tid) {
+        this.tid = tid;
+    }
+
     public static TcpModel getModelByJson(String tcpModelJsonString){
         if (Strings.isNullOrEmpty(tcpModelJsonString)){
             return null;
@@ -99,6 +110,7 @@ public class TcpModel implements Serializable {
         Integer fromId = jsonObject.getInteger("fromId");
         Integer toId = jsonObject.getInteger("toId");
         String dataString = jsonObject.getString("data");
+        String tid = jsonObject.getString("tid");
 
         TcpType tcpType = TcpType.fromString(type);
         TcpAction tcpAction = null;
@@ -143,7 +155,7 @@ public class TcpModel implements Serializable {
         tcpModel.setToId(toId);
         tcpModel.setFromId(fromId);
         tcpModel.setData(dataString);
-
+        tcpModel.setTid(tid);
         return tcpModel;
     }
 

+ 5 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

@@ -319,7 +319,9 @@ public interface TcpAction {
     }
 
     enum DeviceAction implements TcpAction {
-        RESTART("重启"),
+        RESTART("重启APP"),
+        REBOOT("重启机器"),
+        OPEN_DEBUG("打开网络调试"),
         CONNECT("连接"),
         APP_UPDATE("APP更新"),
         DEVICE_REFRESH("设备刷新"),
@@ -327,6 +329,8 @@ public interface TcpAction {
         DEVICE_CHANGE("设备更换"),
         USER_CHANGE("用户绑定"),
         SERVER_CHANGE("设备ip地址更换"),
+        S485_POWER_RESET("485控制板电路复位"),
+        S485_POWER_RESET_SUCCESS("485控制板电路复位成功"),
         NO_MATCH("没有匹配");
 
         private final String description;

+ 13 - 0
traditionlib/src/main/java/serialporttest/utils/SerialPortUtil.java

@@ -279,6 +279,19 @@ public class SerialPortUtil {
         }
     }
 
+    public void send(byte[] bytes){
+        try {
+            if (isOpenSerialPortUtil) {
+                outputStream.write(bytes,0,bytes.length);
+                Log.i(TAG, "串口数据发送成功:" + new String(bytes));
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            Log.i(TAG, "串口数据发送失败");
+        }
+    }
+
+
     public void setOnDataReceiveListener(ISerialPortBedOnclickEvent dataReceiveListener) {
         onDataReceiveListener = dataReceiveListener;
     }