Browse Source

1.同步服务器时间
2.修改tcp消息长度到2048
3.tcp连接成功后发送版本信息

weizhengliang 3 years ago
parent
commit
c46789cfe9

+ 2 - 2
build.gradle

@@ -47,12 +47,12 @@ buildscript {
     /**
     /**
      * APP版本码
      * APP版本码
      */
      */
-    ext.app_version_code = 10
+    ext.app_version_code = 11
 
 
     /**
     /**
      * APP版本号
      * APP版本号
      */
      */
-    ext.app_version = "1.0.10"
+    ext.app_version = "1.0.11"
 
 
     /**
     /**
      * 项目依赖库
      * 项目依赖库

+ 18 - 3
conversion_box/src/main/java/com/wdkl/app/ncs/conversion_box/activity/MainActivity.kt

@@ -27,6 +27,7 @@ import com.wdkl.core.socket.IUserState
 import com.wdkl.core.socket.SocketManager
 import com.wdkl.core.socket.SocketManager
 import com.wdkl.core.voip.VoipEvent
 import com.wdkl.core.voip.VoipEvent
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.base.BaseApplication
 import com.wdkl.ncs.android.lib.utils.*
 import com.wdkl.ncs.android.lib.utils.*
 import com.wdkl.ncs.android.lib.vo.filter
 import com.wdkl.ncs.android.lib.vo.filter
 import com.wdkl.ncs.android.middleware.api.UrlManager
 import com.wdkl.ncs.android.middleware.api.UrlManager
@@ -46,6 +47,7 @@ import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
+import com.wdkl.ncs.android.middleware.utils.AppUtil
 import com.wdkl.skywebrtc.CallSession
 import com.wdkl.skywebrtc.CallSession
 import com.wdkl.skywebrtc.EnumType
 import com.wdkl.skywebrtc.EnumType
 import com.wdkl.skywebrtc.SkyEngineKit
 import com.wdkl.skywebrtc.SkyEngineKit
@@ -69,6 +71,7 @@ import kotlin.collections.ArrayList
 @Router(path = "/conversion_box/main")
 @Router(path = "/conversion_box/main")
 class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBinding>(), MainActivityContract.View,
 class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBinding>(), MainActivityContract.View,
     SerialPortUtil.ISerialPortBedOnclickEvent, SerialPort485Util.ISerialPortData, IUserState, CallSession.CallSessionCallback {
     SerialPortUtil.ISerialPortBedOnclickEvent, SerialPort485Util.ISerialPortData, IUserState, CallSession.CallSessionCallback {
+    private val TAG = "MainActivity"
 
 
     private lateinit var receiver: TimeReceiver
     private lateinit var receiver: TimeReceiver
     private lateinit var curFragment: String
     private lateinit var curFragment: String
@@ -146,7 +149,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
         val buildUrl = UrlManager.build()
         val buildUrl = UrlManager.build()
         serverIp =  buildUrl.buyer.substringAfterLast("//").substringBefore(":")
         serverIp =  buildUrl.buyer.substringAfterLast("//").substringBefore(":")
 
 
-        tv_mac_addr.setText("MAC: " + Constant.LOCAL_MAC + "\nIP: " + NetHelper.getInstance().localIP + ", server: " + serverIp)
+        tv_mac_addr.setText("MAC: " + Constant.LOCAL_MAC + "\nIP: " + NetHelper.getInstance().localIP + ", server: " + serverIp + ", tcp: " + Constant.TCP_SERVER_URL)
         tv_version.setText("V" + BuildConfig.VERSION_NAME + "_" + BuildConfig.VERSION_CODE)
         tv_version.setText("V" + BuildConfig.VERSION_NAME + "_" + BuildConfig.VERSION_CODE)
 
 
         //设置默认时区
         //设置默认时区
@@ -321,7 +324,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
         }).start()
         }).start()
 
 
         //更新
         //更新
-        tv_mac_addr.setText("MAC: " + Constant.LOCAL_MAC + "\nIP: " + NetHelper.getInstance().localIP + ", server: " + serverIp)
+        tv_mac_addr.setText("MAC: " + Constant.LOCAL_MAC + "\nIP: " + NetHelper.getInstance().localIP + ", server: " + serverIp + ", tcp: " + Constant.TCP_SERVER_URL)
     }
     }
 
 
     //显示设备信息
     //显示设备信息
@@ -832,7 +835,7 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
         when (messageEvent.getType()) {
         when (messageEvent.getType()) {
             Constant.EVENT_SIP_CALL_STATUS -> {
             Constant.EVENT_SIP_CALL_STATUS -> {
                 //收到sip通话邀请,加入通话
                 //收到sip通话邀请,加入通话
-                Log.e("dds", "EVENT_SIP_CALL_STATUS: " + messageEvent.message)
+                Log.e(TAG, "EVENT_SIP_CALL_STATUS: " + messageEvent.message)
                 if (messageEvent.message is String) {
                 if (messageEvent.message is String) {
                     Constant.CALL_STATE = Constant.CALL_CALLING
                     Constant.CALL_STATE = Constant.CALL_CALLING
                     val session = gEngineKit?.getCurrentSession()
                     val session = gEngineKit?.getCurrentSession()
@@ -1074,6 +1077,18 @@ class MainActivity :BaseActivity<MainActivityPresenter, MainActivityLayoutBindin
                     } else if (tcpModel.action == TcpAction.DataAction.REFRESH) {
                     } else if (tcpModel.action == TcpAction.DataAction.REFRESH) {
                         //重新加载数据,比如出院,入院等
                         //重新加载数据,比如出院,入院等
                         initDevice()
                         initDevice()
+                    } else if(tcpModel.action == TcpAction.TimeAction.SYNC){
+                        val time =  tcpModel.data.toString().toLong()*1000
+                        //设置系统时间
+                        try {
+                            AppUtil.setSystemTime(BaseApplication.appContext, time)
+                            Log.d(TAG, "set sys time1: $time")
+                        } catch (e: Exception) {
+                            //"20211213:092314"
+                            val time2 = TimeHandle.getDateTime(time, "yyyyMMdd.hhmmss")
+                            AppUtil.setSysTime(time2)
+                            Log.d(TAG, "set sys time2: $time2")
+                        }
                     }
                     }
                 }
                 }
             }
             }

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -69,7 +69,7 @@ public class TcpClient {
                     protected void initChannel(SocketChannel socketChannel) throws Exception {
                     protected void initChannel(SocketChannel socketChannel) throws Exception {
                         // 这里将LengthFieldBasedFrameDecoder添加到pipeline的首位,因为其需要对接收到的数据
                         // 这里将LengthFieldBasedFrameDecoder添加到pipeline的首位,因为其需要对接收到的数据
                         // 进行长度字段解码,这里也会对数据进行粘包和拆包处理
                         // 进行长度字段解码,这里也会对数据进行粘包和拆包处理
-                        socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 2, 0, 2));
+                        socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(2048, 0, 2, 0, 2));
                         // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
                         // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
                         socketChannel.pipeline().addLast(new LengthFieldPrepender(2));
                         socketChannel.pipeline().addLast(new LengthFieldPrepender(2));
                         //心跳包应当小于服务器间隔
                         //心跳包应当小于服务器间隔

+ 2 - 7
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java

@@ -62,9 +62,6 @@ public class DeviceChannel {
                     EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
                     EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
                 }
                 }
                 break;
                 break;
-            case VIDEO:
-                EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
-                break;
             case IM:
             case IM:
                 if (tcpModel.getAction()==TcpAction.IMAction.MSG){
                 if (tcpModel.getAction()==TcpAction.IMAction.MSG){
                     //todo: 从接口重新获取左侧数据;使用通话中界面,显示有语音留言,停留3秒,结束至正常界面
                     //todo: 从接口重新获取左侧数据;使用通话中界面,显示有语音留言,停留3秒,结束至正常界面
@@ -88,12 +85,10 @@ public class DeviceChannel {
                     EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
                     EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
                 }
                 }
                 break;
                 break;
+            case VIDEO:
             case DEVICE:
             case DEVICE:
-                EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
-                break;
             case BROADCAST:
             case BROADCAST:
-                EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
-                break;
+            case TIME:
             case SOS:
             case SOS:
                 EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
                 EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
                 break;
                 break;

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

@@ -1,5 +1,9 @@
 package com.wdkl.ncs.android.middleware.tcp.channel;
 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.dto.DeviceConnectDTO;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
@@ -7,9 +11,15 @@ import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
 public class DeviceUtil {
 public class DeviceUtil {
     public static TcpModel deviceConnect(String mac){
     public static TcpModel deviceConnect(String mac){
         TcpModel tcpModel = new TcpModel();
         TcpModel tcpModel = new TcpModel();
+        DeviceConnectDTO connectDTO = new DeviceConnectDTO();
+        connectDTO.setIdentification(mac);
+        connectDTO.setHardware_version(Build.PRODUCT.toLowerCase());
+        connectDTO.setSoftware_version("V"+BuildConfig.VERSION_NAME);
+        connectDTO.setModel(Build.MODEL);
+        connectDTO.setCode(Build.SERIAL);
         tcpModel.setType(TcpType.DEVICE);
         tcpModel.setType(TcpType.DEVICE);
         tcpModel.setAction(TcpAction.DeviceAction.CONNECT);
         tcpModel.setAction(TcpAction.DeviceAction.CONNECT);
-        tcpModel.setData(mac);
+        tcpModel.setData(connectDTO);
         return tcpModel;
         return tcpModel;
     }
     }
 }
 }

+ 74 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/DeviceConnectDTO.java

@@ -0,0 +1,74 @@
+package com.wdkl.ncs.android.middleware.tcp.dto;
+
+import java.io.Serializable;
+
+/**
+ * @author wuyunfeng
+ * 2021-12-07 16:29
+ */
+public class DeviceConnectDTO implements Serializable {
+
+    /**设备唯一标识 */
+    private String identification;
+
+    /**
+     * 软件版本,客户端运行的app 版本号
+     */
+    private String software_version;
+
+    /**
+     * 固件版本号
+     */
+    private String hardware_version;
+
+    /**
+     * 设备型号
+     */
+    private String model;
+
+    /**
+     * 设备序列号
+     */
+    private String code;
+
+
+    public String getIdentification() {
+        return identification;
+    }
+
+    public void setIdentification(String identification) {
+        this.identification = identification;
+    }
+
+    public String getSoftware_version() {
+        return software_version;
+    }
+
+    public void setSoftware_version(String software_version) {
+        this.software_version = software_version;
+    }
+
+    public String getHardware_version() {
+        return hardware_version;
+    }
+
+    public void setHardware_version(String hardware_version) {
+        this.hardware_version = hardware_version;
+    }
+
+    public String getModel() {
+        return model;
+    }
+
+    public void setModel(String model) {
+        this.model = model;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}

+ 92 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/AppUtil.java

@@ -0,0 +1,92 @@
+package com.wdkl.ncs.android.middleware.utils;
+
+import android.app.AlarmManager;
+import android.content.Context;
+import android.text.TextUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Calendar;
+
+public class AppUtil {
+
+    /**
+     * 设置系统时间
+     *
+     * @param time
+     */
+    public static void setSysTime(String time) {
+        try {
+            Process process = Runtime.getRuntime().exec("su");
+            if (null == process) return;
+            DataOutputStream os = new DataOutputStream(process.getOutputStream());
+            os.writeBytes("setprop persist.sys.timezone Asia/Shanghai\n");
+            if (android.os.Build.VERSION.SDK_INT >= 24) {//7.1以上的系统
+                String datetime = changeTimeForm(time); //20211213:092314  ------  051315372019.00
+                os.writeBytes("/system/bin/date " + datetime + " set\n");
+            } else {
+                os.writeBytes("/system/bin/date -s " + time + "\n");//【时间格式 yyyyMMdd.HHmmss】"20131023.112800"
+            }
+            os.writeBytes("clock -w\n");
+            os.writeBytes("exit\n");
+            os.flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String changeTimeForm(String t) {
+        if (!TextUtils.isEmpty(t) && t.length() >= 15) {
+            String yyyy = substringByLengh(t, 0, 4);
+            String MMdd = substringByLengh(t, 4, 8);
+            String HHmm = substringByLengh(t, 9, 13);
+            String ss = substringByLengh(t, 13, 15);
+
+            return MMdd + HHmm + yyyy + "." + ss;
+        } else {
+            return "051315372019.00";
+        }
+    }
+
+    /**
+     * 字符串按索引截取
+     *
+     * @param str
+     * @return
+     */
+    public static String substringByLengh(String str, int start, int end) {
+        if (str == null) {
+            return "";
+        }
+        if (start > end) {
+            return "";
+        }
+        if (str.length() - 1 < start || str.length() < end) {
+            return "";
+        }
+
+        return str.substring(start, end);
+    }
+
+
+    public static void setSystemTime(Context context, int year, int month, int day, int hour, int minute, int mill) {
+        Calendar c = Calendar.getInstance();
+        c.set(Calendar.YEAR, year);
+        c.set(Calendar.MONTH, month);
+        c.set(Calendar.DAY_OF_MONTH, day);
+        c.set(Calendar.HOUR_OF_DAY, hour);
+        c.set(Calendar.MINUTE, minute);
+        c.set(Calendar.SECOND, mill);
+        c.set(Calendar.MILLISECOND, 0);
+        long when = c.getTimeInMillis();
+        if (when / 1000 < Integer.MAX_VALUE) {
+            ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).setTime(when);
+        }
+    }
+
+    public static void setSystemTime(Context context, long timeMills) {
+        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        alarmManager.setTimeZone("Asia/Shanghai");
+        alarmManager.setTime(timeMills);
+    }
+}

+ 5 - 0
readme.md

@@ -25,6 +25,11 @@
 在发布新版本时,可以直接将Unreleased区块中的内容移动至新发 布版本的描述区块就可以了
 在发布新版本时,可以直接将Unreleased区块中的内容移动至新发 布版本的描述区块就可以了
 
 
 ---
 ---
+## [1.0.11] version 11 - 2021-12-24
+1.同步服务器时间
+2.修改tcp消息长度到2048
+3.tcp连接成功后发送版本信息
+
 ## [1.0.10] version 10 - 2021-12-06
 ## [1.0.10] version 10 - 2021-12-06
 ### FIXED
 ### FIXED
 - 修改默认时区
 - 修改默认时区