1.增减Sharedpreference文件读写封装类;2.增加信号配置数据库(需要卸载重新安装app);3.增加发送信号配置命令(0x8008)
6个文件已修改
8个文件已添加
901 ■■■■■ 已修改文件
app/src/main/assets/signal_config_file.json 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/Constant.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/WorkRoomDataBase.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigDao.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigInitWorker.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigViewModel.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigWorkRepo.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SingalConfig.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/app.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/bean/SignalConfigRemote.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/SignalConfigFragment.java 269 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/util/SPUtils.java 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/util/Utils.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/signal_config_file.json
New file
@@ -0,0 +1,115 @@
[
  {
    "signalName": "安全带",
    "index":1,
    "id":0,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "左转向",
    "index":2,
    "id":1,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "右转向",
    "index":3,
    "id":2,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "手刹",
    "index":4,
    "id":3,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "脚刹",
    "index":5,
    "id":4,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "近光灯",
    "index":6,
    "id":5,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "远光灯",
    "index":7,
    "id":6,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "门锁",
    "index":8,
    "id":7,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "空挡",
    "index":9,
    "id":8,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "1档",
    "index":10,
    "id":9,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "2档",
    "index":11,
    "id":10,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "3档",
    "index":12,
    "id":11,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "4档",
    "index":13,
    "id":12,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "5档",
    "index":14,
    "id":13,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "倒档",
    "index":15,
    "id":14,
    "highLevel":2,
    "mainBoard":2
  },
  {
    "signalName": "START位",
    "index":1,
    "id":15,
    "highLevel":0,
    "mainBoard":2
  }
]
app/src/main/java/safeluck/drive/evaluation/Constant.java
@@ -73,5 +73,7 @@
    public static final String BIND_DEBUG_TXT = "BIND_DEBUG_TXT";
    public static final int UPGRADE_MCU_CONTENT_FILE = 0x8100;
    public static final String MCU_FILE_NAME = "dfu.bin";
    public static final int MCU_SN = 8;
    public static final int SEND_CONFIG_SIGNAL = 0x8008;
    public static String exam_enter_exitdata="exam_enter_exitdata";
}
app/src/main/java/safeluck/drive/evaluation/DB/WorkRoomDataBase.java
@@ -35,6 +35,9 @@
import safeluck.drive.evaluation.DB.rtktb.RTKConfig;
import safeluck.drive.evaluation.DB.rtktb.RTKConfigDao;
import safeluck.drive.evaluation.DB.rtktb.RTKConfigWork;
import safeluck.drive.evaluation.DB.signalConfigdb.SignalConfigDao;
import safeluck.drive.evaluation.DB.signalConfigdb.SignalConfigInitWorker;
import safeluck.drive.evaluation.DB.signalConfigdb.SingalConfig;
/**
@@ -43,7 +46,7 @@
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
@Database(entities = {Student.class, CriteriaForI.class, FailedProj.class, CriteriaForII.class, RTKConfig.class, GPSInfo.class, AppStatus.class, ExamStatus.class},version = 1,exportSchema = false)
@Database(entities = {Student.class, CriteriaForI.class, FailedProj.class, CriteriaForII.class, RTKConfig.class, GPSInfo.class, AppStatus.class, ExamStatus.class, SingalConfig.class},version = 1,exportSchema = false)
public abstract class WorkRoomDataBase extends RoomDatabase {
    private static final String TAG = "WorkRoomDataBase";
    public abstract StudentDao getstudentDao();
@@ -86,6 +89,7 @@
                                    OneTimeWorkRequest RTKConfigWorkRequest = OneTimeWorkRequest.from(RTKConfigWork.class);
                                    OneTimeWorkRequest appStatusInitWork = OneTimeWorkRequest.from(AppStatusInitWork.class);
                                    OneTimeWorkRequest examStatusInitWorker = OneTimeWorkRequest.from(ExamStatusInitWorker.class);
                                    OneTimeWorkRequest signalConigInitWorker = OneTimeWorkRequest.from(SignalConfigInitWorker.class);
                                    Log.i(TAG, "onCreate: 创建数据库后建立数据表插入数据");
                                    WorkManager.getInstance(mContext).enqueue(oneTimeWorkRequest);
                                    WorkManager.getInstance(mContext).enqueue(oneTimeWorkRequest1);
@@ -94,6 +98,7 @@
                                    WorkManager.getInstance(mContext).enqueue(RTKConfigWorkRequest);
                                    WorkManager.getInstance(mContext).enqueue(appStatusInitWork);
                                    WorkManager.getInstance(mContext).enqueue(examStatusInitWorker);
                                    WorkManager.getInstance(mContext).enqueue(signalConigInitWorker);
                                }
                                @Override
@@ -117,4 +122,6 @@
    public abstract AppStatusDao getAppStatusDao();
    public abstract ExamStatusDao getExamStatusDao();
    public abstract SignalConfigDao getSignalConfigDao();
}
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigDao.java
New file
@@ -0,0 +1,33 @@
package safeluck.drive.evaluation.DB.signalConfigdb;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import java.util.List;
@Dao
public interface SignalConfigDao {
    @Insert
    void insert(SingalConfig singalConfig );
    //设置id信号的对应的物理索引
    @Query("update signal_config set `index`=:mindex where id =:id ")
    void updateindex(int mindex,int id);
    //设置id信号的对应的高电平有无效
    @Query("update signal_config set `highLevel`=:hightLevel where id =:id ")
    void updateHightlevel(int hightLevel,int id);
    //设置id信号的对应的主板有无效
    @Query("update signal_config set `mainBoard`=:mainBoard where id =:id ")
    void updateMainBoard(int mainBoard,int id);
    //查询所有信号对应的物理所引
    @Query("select `index` from signal_config")
    List<Integer> getAllIndexs();
    @Query("select * from signal_config")
    LiveData<List<SingalConfig>> getSignalConfigs();
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(List<SingalConfig> mstus);
}
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigInitWorker.java
New file
@@ -0,0 +1,49 @@
package safeluck.drive.evaluation.DB.signalConfigdb;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import com.anyun.exam.lib.MyLog;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.List;
import safeluck.drive.evaluation.DB.WorkRoomDataBase;
public class SignalConfigInitWorker extends Worker {
    private static final String TAG = "SignalConfigInitWorker";
    public SignalConfigInitWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }
    @NonNull
    @Override
    public Result doWork() {
        MyLog.i(TAG,"信号配置表初始化");
        try {
            InputStream inputStream = getApplicationContext().getAssets().open("signal_config_file.json");
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            JsonReader jsonReader = new JsonReader(inputStreamReader);
            Gson gson = new Gson();
            Type type = new TypeToken<List<SingalConfig>>(){}.getType();
            List<SingalConfig> mstus=gson.fromJson(jsonReader,   type);
            WorkRoomDataBase.getWorkRoomDataBase(getApplicationContext()).getSignalConfigDao().insertAll(mstus);
        } catch (IOException e) {
            e.printStackTrace();
            return Result.failure();
        }
        return Result.success();
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigViewModel.java
New file
@@ -0,0 +1,43 @@
package safeluck.drive.evaluation.DB.signalConfigdb;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import java.util.List;
public class SignalConfigViewModel extends AndroidViewModel {
    private LiveData<List<SingalConfig>> signalConfigs;
    private SignalConfigWorkRepo workRepo;
    public SignalConfigViewModel(@NonNull Application application) {
        super(application);
        workRepo = new SignalConfigWorkRepo(application);
        signalConfigs = workRepo.getSignalConfigs();
    }
    public void insertSignalConfig(final SingalConfig singalConfig){
        workRepo.insertSignalConig(singalConfig);
    }
    public LiveData<List<SingalConfig>> getSignalConfigs(){
        return signalConfigs;
    }
    public void updateindex(final int index, final int id){
       workRepo.updateindex(index,id);
    }
    public void updateHightlevel(final int highLevel, final int id){
        workRepo.updateHightlevel(highLevel,id);
    }
    public void updateMainBoard(final int mainboard, final int id){
        workRepo.updateMainBoard(mainboard,id);
    }
    public List<Integer> getAllIndexs(){
        return workRepo.getAllIndexs();
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigWorkRepo.java
New file
@@ -0,0 +1,66 @@
package safeluck.drive.evaluation.DB.signalConfigdb;
import android.app.Application;
import androidx.lifecycle.LiveData;
import java.util.List;
import safeluck.drive.evaluation.DB.WorkRoomDataBase;
public class SignalConfigWorkRepo {
    private  SignalConfigDao dao;
    private LiveData<List<SingalConfig>> signalConfigs;
    protected SignalConfigWorkRepo(Application application) {
        dao = WorkRoomDataBase.getWorkRoomDataBase(application).getSignalConfigDao();
        signalConfigs = dao.getSignalConfigs();
    }
    protected void insertSignalConig(final SingalConfig singalConfig){
        WorkRoomDataBase.dataBaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                dao.insert(singalConfig);
            }
        });
    }
    protected LiveData<List<SingalConfig>> getSignalConfigs(){
        return signalConfigs;
    }
    protected void updateindex(final int index, final int id){
        WorkRoomDataBase.dataBaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                dao.updateindex(index,id);
            }
        });
    }
    protected void updateHightlevel(final int highLevel, final int id){
        WorkRoomDataBase.dataBaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                dao.updateHightlevel(highLevel,id);
            }
        });
    }
    protected void updateMainBoard(final int mainboard, final int id){
        WorkRoomDataBase.dataBaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                dao.updateMainBoard(mainboard,id);
            }
        });
    }
    /**
     * 查询所有信号对应的物理索引
     * @return
     */
    protected List<Integer> getAllIndexs(){
        return    dao.getAllIndexs();
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SingalConfig.java
New file
@@ -0,0 +1,56 @@
package safeluck.drive.evaluation.DB.signalConfigdb;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "signal_config")
public class SingalConfig {
    private String signalName;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @PrimaryKey
    private int id;
    private int index;
    private int highLevel;//1-高电平有效
    private int mainBoard;//1-主板有效
    public String getSignalName() {
        return signalName;
    }
    public void setSignalName(String signalName) {
        this.signalName = signalName;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
    public int getHighLevel() {
        return highLevel;
    }
    public void setHighLevel(int highLevel) {
        this.highLevel = highLevel;
    }
    public int getMainBoard() {
        return mainBoard;
    }
    public void setMainBoard(int mainBoard) {
        this.mainBoard = mainBoard;
    }
}
app/src/main/java/safeluck/drive/evaluation/app.java
@@ -3,6 +3,7 @@
import android.app.Application;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
@@ -225,6 +226,8 @@
            case Constant.DEBUG_TXT:
                CEventCenter.dispatchEvent(Constant.BIND_DEBUG_TXT,cmd,0,json);
                break;
            case Constant.MCU_SN:
                break;
        }
app/src/main/java/safeluck/drive/evaluation/bean/SignalConfigRemote.java
New file
@@ -0,0 +1,41 @@
package safeluck.drive.evaluation.bean;
public class SignalConfigRemote {
    /**
     * gpio_num : 0
     * level : 1
     * func_id : 2
     */
    private int gpio_num;
    private int level;
    private int func_id;
    public int getGpio_num() {
        return gpio_num;
    }
    public void setGpio_num(int gpio_num) {
        this.gpio_num = gpio_num;
    }
    public int getLevel() {
        return level;
    }
    public void setLevel(int level) {
        this.level = level;
    }
    public int getFunc_id() {
        return func_id;
    }
    public void setFunc_id(int func_id) {
        this.func_id = func_id;
    }
}
app/src/main/java/safeluck/drive/evaluation/fragment/SignalConfigFragment.java
@@ -1,14 +1,20 @@
package safeluck.drive.evaluation.fragment;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
@@ -17,18 +23,33 @@
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import com.anyun.exam.lib.AYSdk;
import com.anyun.exam.lib.MyLog;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.Constant;
import safeluck.drive.evaluation.DB.signalConfigdb.SignalConfigViewModel;
import safeluck.drive.evaluation.DB.signalConfigdb.SingalConfig;
import safeluck.drive.evaluation.R;
import safeluck.drive.evaluation.bean.SignalConfigBean;
import safeluck.drive.evaluation.bean.SignalConfigRemote;
import safeluck.drive.evaluation.util.Utils;
/**
@@ -40,11 +61,35 @@
public class SignalConfigFragment extends SupportFragment {
    private static final int INDEX  = 1;
    private static final int HIGHLEVEL = 2;
    private static final int MAINBOARD = 3;
    private  Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int id = msg.arg1;
            int sig = msg.arg2;
            switch (msg.what){
                case INDEX:
                    signalConfigViewModel.updateindex(sig,id);
                    break;
                case HIGHLEVEL:
                    break;
                case MAINBOARD:
                    break;
            }
        }
    };
    private  List<SignalConfigBean> signalConfiglist =new ArrayList<>();
    List<SignalConfigRemote> list = new ArrayList<>();//要发送给remoteservice的信号配置,有可能发不出去
    private Toolbar mToobar;
    private ListView listView;
    private LinearLayout linearLayout;
    private static final String TAG = SignalConfigFragment.class.getSimpleName();
    SignalConfigViewModel signalConfigViewModel;
    public static SupportFragment newInstance(){
        return new SignalConfigFragment();
    }
@@ -73,24 +118,83 @@
        listView.setLayoutParams(layoutParams);
        linearLayout.addView(listView);
        listView.setDivider(null);
        MySignalsAdapter mySignalsAdapter = new MySignalsAdapter(_mActivity);
        signalConfiglist .add(new SignalConfigBean("喇叭","双闪",true,false,true,false,1,2));
        signalConfiglist .add(new SignalConfigBean("安全带","脚刹",false,true,true,false,3,4));
        signalConfiglist .add(new SignalConfigBean("熄火","绕车1",false,true,true,false,5,6));
        signalConfiglist .add(new SignalConfigBean("门锁","绕车2",false,true,true,false,7,8));
        signalConfiglist .add(new SignalConfigBean("手刹","离合",true,false,true,false,9,10));
        signalConfiglist .add(new SignalConfigBean("左转向","1档",false,true,true,false,11,12));
        signalConfiglist .add(new SignalConfigBean("右转向","2档",false,true,true,false,13,14));
        signalConfiglist .add(new SignalConfigBean("近光灯","3档",false,true,true,false,15,16));
        signalConfiglist .add(new SignalConfigBean("远光灯","4档",false,true,true,false,17,18));
        signalConfiglist .add(new SignalConfigBean("雾灯","雨刷",false,true,true,false,19,20));
        signalConfiglist .add(new SignalConfigBean("示宽灯","无",false,true,true,false,21,22));
        final MySignalsAdapter mySignalsAdapter = new MySignalsAdapter(_mActivity);
         signalConfigViewModel = ViewModelProviders.of(this).get(SignalConfigViewModel.class);
        signalConfigViewModel.getSignalConfigs().observe(this, new Observer<List<SingalConfig>>() {
            @Override
            public void onChanged(List<SingalConfig> singalConfigs) {
                list.clear();
                signalConfiglist.clear();
                MyLog.i(TAG,"信号配置发生变化");
                for (int i = 0; i < singalConfigs.size(); i++) {
                    SignalConfigRemote signalConfigRemote = new SignalConfigRemote();
                    signalConfigRemote.setFunc_id(i);
                    signalConfigRemote.setGpio_num(singalConfigs.get(i).getIndex());
                    signalConfigRemote.setLevel(singalConfigs.get(i).getHighLevel());
                    list.add(signalConfigRemote);
                }
                sendSignalConfigsToRemote();
                for (int i = 0; i < singalConfigs.size(); i++) {
                    SingalConfig singalConfig = singalConfigs.get(i);
                    i++;
                    SingalConfig singalConfig1 = singalConfigs.get(i);
                    signalConfiglist .add(new SignalConfigBean(singalConfig.getSignalName(),singalConfig1.getSignalName(),singalConfig.getHighLevel()==1?true:false,singalConfig.getMainBoard()==1?true:false,
                            singalConfig1.getHighLevel()==1?true:false,singalConfig1.getMainBoard()==1?true:false,singalConfig.getIndex(),singalConfig1.getIndex()));
                    mySignalsAdapter.notifyDataSetChanged();
                }
            }
        });
        listView.setAdapter(mySignalsAdapter);
        mySignalsAdapter.notifyDataSetChanged();
    }
private Gson gson = new Gson();
    private void sendSignalConfigsToRemote() {
      new AsyncTask<Void, Void, List<Integer>>(
        ) {
            @Override
            protected List<Integer> doInBackground(Void... voids) {
                return   signalConfigViewModel.getAllIndexs();
            }
            @Override
            protected void onPostExecute(List<Integer> indexs) {
                if (listContainsSameValue(indexs)){
                    Log.i(TAG, "sendSignalConfigsToRemote: 有相同的index,不能发送"+gson.toJson(list));
                    Toast.makeText(_mActivity, "不能有相同的物理所引!", Toast.LENGTH_SHORT).show();
                }else{
                    AYSdk.getInstance().sendCmd(Constant.SEND_CONFIG_SIGNAL,gson.toJson(list));
                }
            }
        }.execute();
    }
    private boolean listContainsSameValue(List<Integer> indexs) {
        for (int i = 0; i < indexs.size(); i++) {
            //可以默认是0  0不判断是否有相同的index
            if (indexs.get(i) == 0){
                continue;
            }
           for (int j=i+1;j<indexs.size();j++){
               if (indexs.get(i) == indexs.get(j)){
                   return true;
               }
           }
        }
        return false;
    }
@@ -125,51 +229,15 @@
                viewHolder = new ViewHolder(convertView);
                viewHolder.editText1.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    }
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                    }
                    @Override
                    public void afterTextChanged(Editable s) {
                        Log.i(TAG, "et1 afterTextChanged: "+s.toString());
                        String str = s.toString();
                        int a = Integer.parseInt(str);
                        signalConfiglist.get(position).setPort_one(a);
                    }
                });
                viewHolder.editText2.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    }
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                    }
                    @Override
                    public void afterTextChanged(Editable s) {
                        Log.i(TAG, "et2 afterTextChanged: "+s.toString());
                        String str = s.toString();
                        int a = Integer.parseInt(str);
                        signalConfiglist.get(position).setPort_two(a);
                    }
                });
                viewHolder.checkBox3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        SignalConfigBean signalConfigBean = (SignalConfigBean) viewHolder.checkBox3.getTag();
                        signalConfigBean.setThree(isChecked);
                        signalConfigViewModel.updateHightlevel(isChecked?1:0,position*2+1);
                    }
                });
                viewHolder.checkBox4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@@ -177,6 +245,7 @@
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        SignalConfigBean signalConfigBean = (SignalConfigBean) viewHolder.checkBox4.getTag();
                        signalConfigBean.setFour(isChecked);
                    }
                });viewHolder.checkBox2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
@@ -189,6 +258,8 @@
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        SignalConfigBean signalConfigBean = (SignalConfigBean) viewHolder.checkBox1.getTag();
                        signalConfigBean.setOne(isChecked);
                        signalConfigViewModel.updateHightlevel(isChecked?1:0,position*2);
                    }
                });
                convertView.setTag(viewHolder);
@@ -203,8 +274,11 @@
                viewHolder.checkBox3.setTag(signalConfiglist.get(position));
                viewHolder.checkBox4.setTag(signalConfiglist.get(position));
            }
            viewHolder.editText1.setTag(position);
            viewHolder.editText2.setTag(position);
            viewHolder.editText1.setTag(position*2);
            viewHolder.editText2.setTag((position*2+1));
            final SignalConfigBean signalConfigItem = getItem(position);
            viewHolder.textView1.setText(signalConfigItem.getSignal_name_first());
            viewHolder.textView2.setText(signalConfigItem.getSignal_name_second());
@@ -240,6 +314,76 @@
                editText1 = convertView.findViewById(R.id.et_signal1_port);
                editText2 = convertView.findViewById(R.id.et_signal2_port);
                editText1.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
                editText2.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
                editText1.setImeOptions(EditorInfo.IME_ACTION_DONE);
                editText2.setImeOptions(EditorInfo.IME_ACTION_DONE);
                editText1.setSingleLine();
                editText2.setSingleLine();
                editText1.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    }
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                    }
                    @Override
                    public void afterTextChanged(Editable s) {
                        int pos = (int) editText1.getTag();
                        String str = s.toString();
                        if (!TextUtils.isEmpty(str)&& Utils.isDigital(str)){
                            int a = Integer.parseInt(str);
                            if (a== list.get(pos).getGpio_num()){
                            }else{
                                handler.removeMessages(INDEX);
                                Message message = Message.obtain();
                                message.what = INDEX;
                                message.arg1 = pos;
                                message.arg2 = a;
                                handler.sendMessageDelayed(message,1500);
                            }
                        }
                    }
                });
                editText2.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    }
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                    }
                    @Override
                    public void afterTextChanged(Editable s) {
                        int pos = (int) editText2.getTag();
                        String str = s.toString();
                        if (!TextUtils.isEmpty(str)&& Utils.isDigital(str)){
                            int a = Integer.parseInt(str);
                            if (a== list.get(pos).getGpio_num()){
                            }else{
                                handler.removeMessages(INDEX);
                                Message message = Message.obtain();
                                message.what = INDEX;
                                message.arg1 = pos;
                                message.arg2 = a;
                                handler.sendMessageDelayed(message,1500);
                            }
                        }
                    }
                });
                textView1 = convertView.findViewById(R.id.tv_signal_1);
                textView2 = convertView.findViewById(R.id.tv_signal_2);
@@ -247,6 +391,23 @@
        }
    }
    @Override
    public void onResume() {
        super.onResume();
        Log.i(TAG, "onResume: ");
    }
    @Override
    public void onStop() {
        super.onStop();
        Log.i(TAG, "onStop: ");
    }
    @Override
    public void onPause() {
        super.onPause();
        Log.i(TAG, "onPause: ");
    }
}
app/src/main/java/safeluck/drive/evaluation/fragment/TcpFragment.java
@@ -21,6 +21,7 @@
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;
import com.anyun.exam.lib.util.ByteUtil;
import com.anyun.exam.lib.util.Speaker;
import com.google.android.material.textfield.TextInputEditText;
@@ -42,9 +43,11 @@
import safeluck.drive.evaluation.DB.failitems.FailedProj_select;
import safeluck.drive.evaluation.DB.gps.GpsInfoWorker;
import safeluck.drive.evaluation.R;
import safeluck.drive.evaluation.bean.RegisterMessage;
import safeluck.drive.evaluation.im.IMSClientBootstrap;
import safeluck.drive.evaluation.im.MessageProcessor;
import safeluck.drive.evaluation.tcp.ConnectThread;
import safeluck.drive.evaluation.util.Utils;
/**
 * MyApplication2
@@ -124,7 +127,8 @@
                String userId = "100002";
                String token = "token_" + userId;
                String hosts = "[{\"host\":\"192.168.10.234\", \"port\":8855}]";
                String hosts = "[{\"host\":\"47.93.80.84\", \"port\":12125}]";
//                String hosts = "[{\"host\":\"192.168.31.77\", \"port\":12125}]";
                IMSClientBootstrap.getInstance().init(userId,token,hosts,1);
                break;
@@ -142,8 +146,12 @@
                //清除app_status 表
//                OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(AppStatusInitWork.class).build();
//                WorkManager.getInstance(_mActivity).enqueue(oneTimeWorkRequest);
                RegisterMessage registerMessage = new RegisterMessage((short)0x802);
                registerMessage.setCityid((short) 1);
                registerMessage.setProviceId((short)23);
                registerMessage.setImei("460123874561");
                registerMessage.setModel("123");
                registerMessage.setSn("2019101500000001");
                break;
        }
    }
app/src/main/java/safeluck/drive/evaluation/util/SPUtils.java
New file
@@ -0,0 +1,196 @@
package safeluck.drive.evaluation.util;
        import java.lang.reflect.InvocationTargetException;
        import java.lang.reflect.Method;
        import java.util.Map;
        import android.content.Context;
        import android.content.SharedPreferences;
public class SPUtils
{
    /**
     * 保存在手机里面的文件名
     */
    public static final String FILE_NAME = "share_data";
    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     *
     * @param context
     * @param key
     * @param object
     */
    public static void put(Context context, String key, Object object)
    {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        if (object instanceof String)
        {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer)
        {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean)
        {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float)
        {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long)
        {
            editor.putLong(key, (Long) object);
        } else
        {
            editor.putString(key, object.toString());
        }
        SharedPreferencesCompat.apply(editor);
    }
    /**
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
     *
     * @param context
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object get(Context context, String key, Object defaultObject)
    {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        if (defaultObject instanceof String)
        {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer)
        {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean)
        {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float)
        {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long)
        {
            return sp.getLong(key, (Long) defaultObject);
        }
        return null;
    }
    /**
     * 移除某个key值已经对应的值
     * @param context
     * @param key
     */
    public static void remove(Context context, String key)
    {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.remove(key);
        SharedPreferencesCompat.apply(editor);
    }
    /**
     * 清除所有数据
     * @param context
     */
    public static void clear(Context context)
    {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        SharedPreferencesCompat.apply(editor);
    }
    /**
     * 查询某个key是否已经存在
     * @param context
     * @param key
     * @return
     */
    public static boolean contains(Context context, String key)
    {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        return sp.contains(key);
    }
    /**
     * 返回所有的键值对
     *
     * @param context
     * @return
     */
    public static Map<String, ?> getAll(Context context)
    {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME,
                Context.MODE_PRIVATE);
        return sp.getAll();
    }
    /**
     * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
     *
     * @author zhy
     *
     */
    private static class SharedPreferencesCompat
    {
        private static final Method sApplyMethod = findApplyMethod();
        /**
         * 反射查找apply的方法
         *
         * @return
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        private static Method findApplyMethod()
        {
            try
            {
                Class clz = SharedPreferences.Editor.class;
                return clz.getMethod("apply");
            } catch (NoSuchMethodException e)
            {
            }
            return null;
        }
        /**
         * 如果找到则使用apply执行,否则使用commit
         *
         * @param editor
         */
        public static void apply(SharedPreferences.Editor editor)
        {
            try
            {
                if (sApplyMethod != null)
                {
                    sApplyMethod.invoke(editor);
                    return;
                }
            } catch (IllegalArgumentException e)
            {
            } catch (IllegalAccessException e)
            {
            } catch (InvocationTargetException e)
            {
            }
            editor.commit();
        }
    }
}
app/src/main/java/safeluck/drive/evaluation/util/Utils.java
@@ -99,4 +99,9 @@
        }
        return temp;
    }
    public static boolean isDigital(String str) {
        String regx= "^\\d+";
        return str.matches(regx);
    }
}