doum
昨天 22881a4d6409c7d17867e1d40bf81a13578208df
keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -6,9 +6,11 @@
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.Camera;
import android.opengl.Visibility;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -20,6 +22,7 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -49,6 +52,7 @@
import com.doumee.keyCabinet.databinding.MainActivityBinding;
import com.doumee.keyCabinet.event.CLGridEvent;
import com.doumee.keyCabinet.event.CLKeyEvent;
import com.doumee.keyCabinet.event.CheckGridStatusEvent;
import com.doumee.keyCabinet.event.CloseGridOneResultEvent;
import com.doumee.keyCabinet.event.GetFacesEvent;
import com.doumee.keyCabinet.event.GetKeyStatusEvent;
@@ -59,6 +63,7 @@
import com.doumee.keyCabinet.event.KeyResultEvent;
import com.doumee.keyCabinet.event.ManageOpenGridResultEvent;
import com.doumee.keyCabinet.event.OpenAllGridEvent;
import com.doumee.keyCabinet.event.OpenErrEvent;
import com.doumee.keyCabinet.event.OpenGridEvent;
import com.doumee.keyCabinet.event.OpenGridListEvent;
import com.doumee.keyCabinet.event.OpenGridOneResultEvent;
@@ -76,6 +81,7 @@
import com.doumee.keyCabinet.ui.face.UserManagerActivity;
import com.doumee.keyCabinet.ui.view.BannerViewImageHolder;
import com.doumee.keyCabinet.utils.BraceletLogUtils;
import com.doumee.keyCabinet.utils.CircularQueue;
import com.doumee.keyCabinet.utils.CrashHandler;
import com.doumee.keyCabinet.utils.LMobileInfo;
import com.doumee.keyCabinet.utils.TimeUtils;
@@ -99,12 +105,15 @@
import com.doumee.lib_coremodel.http.utils.GsonTools;
import com.doumee.lib_coremodel.util.SpUtil;
import com.doumee.lib_coremodel.util.StringUtil;
import com.doumee.lib_coremodel.view.ToastView;
import com.example.datalibrary.api.FaceApi;
import com.example.datalibrary.listener.DBLoadListener;
import com.example.datalibrary.listener.SdkInitListener;
import com.example.datalibrary.model.ImportFeatureResult;
import com.example.datalibrary.model.User;
import com.example.datalibrary.utils.ToastUtils;
import com.example.datalibrary.view.PreviewTexture;
import com.innohi.YNHAPI;
import com.yanzhenjie.permission.runtime.Permission;
import org.greenrobot.eventbus.EventBus;
@@ -167,8 +176,21 @@
                        getVM().getFaceLD();
                    }
                    getVM().upBraceletLog();*/
                    case 1:
                        if(isShowing) {
                            EventBus.getDefault().post(new OpenGridEvent((String) msg.obj));
                            handler.sendEmptyMessageDelayed(1, 1000);
                        }
                        break;
                    case 2:
                        if(isShowing){
                            //重新发送钥匙查询
                            //发送查询钥匙号
                            EventBus.getDefault().post(new GetKeyStatusEvent());
                            handler.sendEmptyMessageDelayed(2,1200);
                        }
                        break;
                    default:
                        break;
                }
            }
@@ -189,12 +211,12 @@
        getDB().setModel(getVM());
        initRGBCheck();
        handler.sendEmptyMessageDelayed(0, 1000);
        //启动心跳
        /*//启动心跳
        Intent intent = new Intent(MainActivity.this, HeartbeatService.class);
        startService(intent);
        //启动更新人脸
        Intent intent2 = new Intent(MainActivity.this, FaceUpdateService.class);
        startService(intent2);
        startService(intent2);*/
        getPermission();
        Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
    }
@@ -208,10 +230,10 @@
        long availableMemory = memoryInfo.availMem/(1024*1024);
        long usedMemory = totalMemory - availableMemory;
        //getDB().tvM.setText("总内存:"+totalMemory+",使用内存:"+usedMemory+",可用内存:"+availableMemory);
        if((availableMemory<400&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
        if((availableMemory<100&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
                ("02:00:00".equals(StringUtil.getHM()))){
            //可用内存小于400M,或者每天凌晨2点,重启app
            //restartApp();
            restartApp();
        }
    }
@@ -266,7 +288,7 @@
                lastDownTime1 = System.currentTimeMillis();
                downCount1++;
                System.out.println();
                Timber.tag("==>").d(""+downCount1);
                //Timber.tag("==>").d(""+downCount1);
                if(downCount1>4) {
                    downCount1=0;
                    lastDownTime1=null;
@@ -277,7 +299,6 @@
        getDB().tvId.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(ManageLoginActivity.class);
                //更改url
                if(lastDownTime2!=null){
                    if(System.currentTimeMillis()-lastDownTime2>1000){
@@ -293,24 +314,18 @@
                }
            }
        });
        getDB().tvVersion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo 临时代码
                //setJiuConfig();
                SpUtil.saveString("rbgCameraId","0");
            }
        });
        getDB().imgLeft.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            public void onClick(View v1) {
                //todo 临时代码
                if (getDB().nsv.getVisibility()== View.VISIBLE) {
                    getDB().nsv.setVisibility(View.GONE);
                }else {
                    getDB().nsv.setVisibility(View.VISIBLE);
                }
                YNHAPI mAPI = YNHAPI.getInstance();
                mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.VISIBLE);
            }
        });
        upErrInfo();
@@ -455,6 +470,9 @@
    protected void onResume() {
        super.onResume();
        isShowing = true;
        YNHAPI mAPI = YNHAPI.getInstance();
        mAPI.setNavigationBarVisibility(YNHAPI.NavigationBarVisibility.ALWAYS_INVISIBLE);
        mAPI.setBootLaunchApk("com.doumee.keyCabinet", true);
        showTime = System.currentTimeMillis();
        if(!isFaceOk) {
            initLicense();
@@ -469,7 +487,9 @@
        }else {
            getDB().banner.stopTurning();
        }
        unCloseGrid();
        //检查所有柜格门、钥匙状态
        checkKeyStatus(0);
        checkGridStatus(900);
    }
    private void unCloseGrid(){
@@ -768,7 +788,63 @@
            waitBeans.clear();
            selectBeans.addAll(userBeans);
            finishCount=0;
            faceHandler.sendEmptyMessage(0);
            /*//删除全部
            FaceApi.getInstance().userClean();
            faceHandler.sendEmptyMessage(0);*/
            HashMap<String,String> uMap = new HashMap<>();
            for(FaceUserBean d:selectBeans){
                String key = d.getMemberId().toString()+"_"+d.getGroupId();
                uMap.put(key,"");
            }
            //删除不存在用户
            List<User> users = FaceApi.getInstance().getAllUserList();
            List<User> dels = new ArrayList<>();
            for(User u:users){
                String key = u.getUserId()+"_"+u.getGroupId();
                if(!uMap.containsKey(key)){
                    dels.add(u);
                }
            }
            if(dels.size()>0){
                UserInfoManager.getInstance().deleteUserListInfo(dels,
                        "", new UserInfoManager.UserInfoListener() {
                            @Override
                            public void userListDeleteSuccess() {
                                // 用户列表删除成功
                                faceHandler.sendEmptyMessage(0);
                            }
                            @Override
                            public void userListDeleteFailure(String message) {
                                // 用户列表删除失败
                                faceHandler.sendEmptyMessage(0);
                            }
                        },
                        new DBLoadListener() {
                            @Override
                            public void onStart(int successCount) {
                            }
                            @Override
                            public void onLoad(int finishCount, int successCount, float progress) {
                            }
                            @Override
                            public void onComplete(List<User> features, int successCount) {
                            }
                            @Override
                            public void onFail(int finishCount, int successCount, List<User> features) {
                            }
                        });
            }else {
                faceHandler.sendEmptyMessage(0);
            }
        }
    }
@@ -951,10 +1027,7 @@
    }
    private void initRGBCheck(){
        String index = SpUtil.getString("rbgCameraId");
        if(!"1".equals(index)){
            index = "0";
        }
        String index = SpUtil.getString("rbgCameraId","0");
        setRgbCameraId(Integer.parseInt(index));
        /*if (isSetCameraId()){
            setRgbCameraId(SingleBaseConfig.getBaseConfig().getRBGCameraId());
@@ -1039,14 +1112,21 @@
        }
    }
    private UpdateUtil updateUtil;
    private void checkUpdate(){
        //版本更新
        new UpdateUtil(this).setShowToast(false).getServerVerCode(new UpdateUtil.VersionCallBack() {
            @Override
            public void isNeedUpdate(boolean isUpdate) {
                isUpdateVersion = isUpdate;
            }
        });
        if(updateUtil==null){
            updateUtil = new UpdateUtil(this);
            updateUtil.setShowToast(false);
        }
        if(!updateUtil.isShowing()){
            updateUtil.getServerVerCode(new UpdateUtil.VersionCallBack() {
                @Override
                public void isNeedUpdate(boolean isUpdate) {
                    isUpdateVersion = isUpdate;
                }
            });
        }
    }
    private PermissiondDialog permissiondDialog;
@@ -1078,16 +1158,29 @@
    }
    private int tipDownCount = 10;
    private int loopDownCount = 60;
    private boolean isShowTip;
    @Subscribe
    public void TimeClockEvent(TimeClockEvent e){
        if(isShowTip){
            if(tipDownCount==0){
                isShowTip = false;
                getDB().clTip.setVisibility(View.GONE);
        if(!isFinishing()) {
            if(isShowTip){
                if(tipDownCount==0){
                    isShowTip = false;
                    getDB().clTip.setVisibility(View.GONE);
                }else {
                    tipDownCount--;
                    getDB().tvDjs.setText(tipDownCount+"s");
                }
            }
            if(loopDownCount==0){
                loopDownCount = SpUtil.getInt("loop_time",60);
                //定时拉取基本信息
                getVM().devLogin();
                getPermission();
                getVM().devHeart();
                EventBus.getDefault().post(new GetFacesEvent());
            }else {
                tipDownCount--;
                getDB().tvDjs.setText(tipDownCount+"s");
                loopDownCount--;
            }
        }
    }
@@ -1100,8 +1193,12 @@
    public void OpenGridEvent(OpenGridEvent e){
        if(!isFinishing()){
            //开启柜门
            String code = "8A"+SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
                    +SportUtils.intToHex(Integer.parseInt(e.getChannelCode()))+"11";
            String key = e.getKey();
            if(TextUtils.isEmpty(key)) {
                key = SportUtils.intToHex(Integer.parseInt(e.getBoardCode()))
                        + SportUtils.intToHex(Integer.parseInt(e.getChannelCode()));
            }
            String code = "8A" + key + "11";
            code += SportUtils.getBCC(code);
            send485(0,code);
        }
@@ -1164,38 +1261,6 @@
        }
    }
    @Subscribe
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //在首页,校验关门的钥匙是否匹配
            if (e.getIsOpen() == 0) {
                //关门成功
                //查询钥匙号
                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(e.getKey());
                if (gridDo != null) {
                    getVM().addInfo("比较钥匙:当前:"+gridDo.getCurKeyCode()+", 关联钥匙:"+gridDo.getKeyCode());
                    if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&
                            !TextUtils.isEmpty(gridDo.getKeyCode())&&
                            !gridDo.getCurKeyCode().equals(gridDo.getKeyCode())){
                        //钥匙不一样,开门
                        Toast.makeText(mContext, "钥匙存放位置错误", Toast.LENGTH_SHORT).show();
                        EventBus.getDefault().post(new OpenGridEvent(Integer.parseInt(e.getKey().substring(2,4), 16)+"",
                                Integer.parseInt(e.getKey().substring(0,2), 16)+""));
                    }else {
                        if(isShowTip){
                            doRegister(5,null);
                        }
                        if(isShowing){
                            //在首页关门成功,需调用关门方法
                            getVM().closeGrid(gridDo);
                        }
                    }
                }
            }
        }
    }
    private SerialPortModel gridPort;
    private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() {
        @Override
@@ -1252,23 +1317,21 @@
                    });*/
                    String key = bh+tdh;
                    CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
                    if(gridDo==null){
                        //新增
                        gridDo = new CabinetGridDo();
                        gridDo.setIsOpen("00".equals(open)?1:0);
                        gridDo.setGridKey(key);
                        gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                        DaoManager.getCabinetGridDao().insert(gridDo);
                    }else {
                    if(gridDo!=null){
                        gridDo.setIsOpen("00".equals(open)?1:0);
                        gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                        DaoManager.getCabinetGridDao().update(gridDo);
                    }
                    //开门返回
                    EventBus.getDefault().post(new OpenGridOneResultEvent(key,gridDo.getIsOpen()));
                    if(!portHandler.hasMessages(1)){
                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
                        if(gridDo.getIsOpen()==0) {
                            //开门失败
                            EventBus.getDefault().post(new OpenErrEvent(key));
                        }else {
                            //开门返回
                            EventBus.getDefault().post(new OpenGridOneResultEvent(key,"00".equals(open)?1:0));
                        }
                    }
                }else if(data.length()==16){
                    //批量
                    //8A 02 00 00 00 00 11 99
@@ -1281,12 +1344,7 @@
                    for(CabinetGridDo d:gridDos){
                        oldMap.put(d.getGridKey(),d);
                    }
                    List<CabinetGridDo> addList = new ArrayList<>();
                    List<CabinetGridDo> updateList = new ArrayList<>();
                    String finalDm = dm;
                    /*runOnUiThread(() -> {
                        getVM().addInfo("批量查询返回:" +bh+","+ finalDm+",总数据:"+oldMap.size());
                    });*/
                    try {
                        for(int i=1;i<=dm.length();i++){
                            String key = bh+SportUtils.intToHex(i);
@@ -1295,22 +1353,11 @@
                                gridDo.setIsOpen("1".equals(dm.substring(i-1,i))?0:1);
                                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                                updateList.add(gridDo);
                            }/*else {
                                getVM().addInfo("新增key:" +key);
                                CabinetGridDo gridDo = new CabinetGridDo();
                                gridDo.setGridKey(key);
                                gridDo.setIsOpen("1".equals(dm.substring(i-1,i))?0:1);
                                gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                                addList.add(gridDo);
                            }*/
                            }
                        }
                        runOnUiThread(() -> {
                            getVM().addInfo("批量开门更新库数据:版号:" +bh+","+ addList.size()+","+updateList.size());
                        });
                        getVM().updateGrids(updateList);
                        if(!portHandler.hasMessages(1)){
                            EventBus.getDefault().post(new ManageOpenGridResultEvent());
                        }
                        EventBus.getDefault().post(new ManageOpenGridResultEvent());
                    }catch (Exception exception){
                        runOnUiThread(() -> {
                            getVM().addInfo("批量开门报错:" +exception.getMessage());
@@ -1324,23 +1371,16 @@
                String open = data.substring(6,8);
                String key = bh+tdh;
                CabinetGridDo gridDo = DaoManager.getCabinetGridDao().getGridByKey(key);
                if(gridDo==null){
                    //新增
                    gridDo = new CabinetGridDo();
                    gridDo.setIsOpen("00".equals(open)?1:0);
                    gridDo.setGridKey(key);
                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                    DaoManager.getCabinetGridDao().insert(gridDo);
                }else {
                if(gridDo!=null){
                    gridDo.setIsOpen("00".equals(open)?1:0);
                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                    DaoManager.getCabinetGridDao().update(gridDo);
                }
                //关门返回
                EventBus.getDefault().post(new CloseGridOneResultEvent(key,gridDo.getIsOpen()));
                EventBus.getDefault().post(new CloseGridOneResultEvent(key,"00".equals(open)?1:0));
                if(isShowing&&isShowTip){
                    //修改显示提醒
                    doRegister(5,null);
                    getVM().doAction(5);
                }
            }else if(data.startsWith("80")){
                //查询所有门状态
@@ -1383,7 +1423,11 @@
                        runOnUiThread(() -> {
                            getVM().addInfo("更新库数据:版号:" +bh+","+ addList.size()+","+updateList.size());
                        });
                        getVM().updateGrids(updateList);
                        if(isShowing){
                            unCloseGrid();
                        }
                    }catch (Exception exception){
                        runOnUiThread(() -> {
                            getVM().addInfo("报错:" +exception.getMessage());
@@ -1440,7 +1484,15 @@
                    String data2 = keyPreviousData+data;
                    runOnUiThread(() -> {
                        getVM().addInfo("获取到钥匙数据:" + data2);
                        jxKey(data2);
                        if(data2.contains("CC01")&&data2.contains("CC02")){
                            String[] sp = data2.split("CC02");
                            if(sp.length==2){
                                jxKey(sp[0]);
                                jxKey("CC02"+sp[1]);
                            }
                        }else {
                            jxKey(data2);
                        }
                    });
                    keyPreviousData = null;
                }
@@ -1483,11 +1535,16 @@
                    }else {
                        gridDo.setCurKeyCode("");
                    }
                    if("0101".equals(key)) {
                        getVM().addInfo(key+" , "+isHaveKey+"  "+keyCode);
                        getVM().addInfo(key + "设置钥匙:" + gridDo.getCurKeyCode());
                    }
                    gridDo.setUpdateTime(StringUtil.DateToStr(new Date()));
                    updateList.add(gridDo);
                }
            }
        }
        getVM().updateGrids(updateList);
        EventBus.getDefault().post(new KeyResultEvent());
    }
@@ -1516,9 +1573,6 @@
                    getVM().addInfo("获取到酒精检测数据:"+StringUtil.DateToStrSS(new Date())+" " + new String(bytes));
                });
                String data = new String(bytes);
                runOnUiThread(() -> {
                    getVM().addInfo("获取到酒精检测是否检测失败:" + (data.contains("blow fail")));
                });
                if(data.contains("blow fail")){
                    //检测失败
                    EventBus.getDefault().post(new JiujinResultEvent(false,null));
@@ -1633,6 +1687,13 @@
        }
    };
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void CheckGridStatusEvent(CheckGridStatusEvent e){
        if(!isFinishing()){
            checkGridStatus(0);
        }
    }
    //检查所有门状态
    private void checkGridStatus(long time){
        sendPortHandlerMsg(1,"80010033B2",time+100);
@@ -1645,18 +1706,35 @@
        sendPortHandlerMsg(2,"A002010000000003",time+400);
    }
    private String jiu_blow;
    private String jiu_mic_ad;
    private String jiu_alarm;
    private String jiu_unit;
    private void setJiuConfig(long time){
        CabinetConfigDataBean config = MApplication.getConfigBean().getCabinetConfigDataVO();
        //设置吹气时间
        sendPortHandlerMsg(3,"blow:"+config.getBlowTime(),time+100);
        //压力值
        sendPortHandlerMsg(3,"mic_ad:"+config.getPressure(),time+300);
        //浓度阈值
        sendPortHandlerMsg(3,"alarm:"+config.getConcentration(),time+600);
        //浓度阈值单位 (1=mg/100ml;2=mg/L;3=%BAC)
        sendPortHandlerMsg(3,"unit:"+config.getThreshold(),time+900);
        sendPortHandlerMsg(3,"read"+config.getThreshold(),time+1200);
        if(!config.getBlowTime().equals(jiu_blow)) {
            //设置吹气时间
            jiu_blow = config.getBlowTime();
            sendPortHandlerMsg(3, "blow:" + config.getBlowTime(), time += 100);
        }
        if(!config.getPressure().equals(jiu_mic_ad)) {
            //压力值
            jiu_mic_ad = config.getPressure();
            sendPortHandlerMsg(3, "mic_ad:" + config.getPressure(), time += 300);
        }
        if(!config.getConcentration().equals(jiu_alarm)) {
            //浓度阈值
            jiu_alarm = config.getConcentration();
            sendPortHandlerMsg(3, "alarm:" + config.getConcentration(), time += 300);
        }
        if("3".equals(config.getThreshold())){
            config.setThreshold("0");
        }
        if(!config.getThreshold().equals(jiu_unit)) {
            //浓度阈值单位 (1=mg/100ml;2=mg/L;3=%BAC)
            jiu_unit = config.getThreshold();
            sendPortHandlerMsg(3, "unit:" + config.getThreshold(), time += 300);
        }
    }
    private void sendPortHandlerMsg(int what,String obj,long time){
@@ -1666,11 +1744,12 @@
        portHandler.sendMessageDelayed(mc,time);
    }
    private boolean isInitPort;
    //初始化串口
    private void initPort(){
        SpUtil.setString("port_grid","/dev/ttyS7");
        SpUtil.setString("port_key","/dev/ttyS1");
        SpUtil.setString("port_jiu","/dev/ttyS2");
        //SpUtil.setString("port_grid","/dev/ttyS7");
        //SpUtil.setString("port_key","/dev/ttyS1");
        //SpUtil.setString("port_jiu","/dev/ttyS2");
        gridPath = SpUtil.getString("port_grid");
        getVM().addInfo("门串口链接:"+gridPath);
        keyPath = SpUtil.getString("port_key");
@@ -1680,6 +1759,9 @@
        if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))&&
                !TextUtils.isEmpty(SpUtil.getString("port_key"))&&
                !TextUtils.isEmpty(SpUtil.getString("port_jiu"))){
            if(isInitPort){
                return;
            }
            xhCount=0;
            closePort(chosePort);
            if(!TextUtils.isEmpty(SpUtil.getString("port_grid"))){
@@ -1690,6 +1772,7 @@
                        ,1 , 0,gridReadObserver);
                boolean isSucc = gridPort.open();
                if(isSucc) {
                    isInitPort = true;
                    getVM().addInfo("门串口链接成功:"+path);
                    String msg = isSucc ? "成功" : "失败";
                    //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
@@ -1707,6 +1790,7 @@
                        ,1 , 0,keyReadObserver);
                boolean isSucc = keyPort.open();
                if(isSucc) {
                    isInitPort = true;
                    getVM().addInfo("钥匙串口链接成功:"+path);
                    String msg = isSucc ? "成功" : "失败";
                    //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
@@ -1723,6 +1807,7 @@
                        ,1 , 0,jiuReadObserver);
                boolean isSucc = jiuPort.open();
                if(isSucc) {
                    isInitPort = true;
                    getVM().addInfo("酒精串口链接成功:"+path);
                    String msg = isSucc ? "成功" : "失败";
                    //getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
@@ -1809,6 +1894,7 @@
        portHandler.sendEmptyMessageDelayed(0,0);
    }
    private CircularQueue openGridQueue = new CircularQueue();
    private void send485(int type,String code){
        runOnUiThread(new Runnable() {
            @Override
@@ -1818,6 +1904,9 @@
        });
        if(type==0){
            if(gridPort!=null){
                if(code.startsWith("8A")){
                    openGridQueue.enqueue(code);
                }
                byte[] sendByte = SportUtils.hexToByteArray(code);
                gridPort.write(sendByte);
            }
@@ -1876,4 +1965,124 @@
        getVM().addInfo("串口全部链接成功:");
        return true;
    }
    //开门
    @Subscribe
    public void OpenGridOneResultEvent(OpenGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //开门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
        }
    }
    private Long keyTime;
    private HashMap<String,String> closeMap = new HashMap<>();
    /**
     * 关门
     * @param e
     */
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void CloseGridOneResultEvent(CloseGridOneResultEvent e){
        if(!isFinishing()&&isShowing){
            //关门成功,移除开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
            closeMap.put(e.getKey(),"");
            //发送查询钥匙号
            EventBus.getDefault().post(new GetKeyStatusEvent());
            keyTime = new Date().getTime()+500;
            if(handler.hasMessages(2)){
                handler.removeMessages(2);
            }
            handler.sendEmptyMessageDelayed(2,1200);
        }
    }
    @Subscribe(threadMode= ThreadMode.MAIN)
    public void OpenErrEvent(OpenErrEvent e){
        //开门失败
        if(!isFinishing()&&isShowing){
            //开门
            if(handler.hasMessages(1)){
                handler.removeMessages(1);
                getVM().addInfo("==移除开门任务");
            }
            EventBus.getDefault().post(new OpenGridEvent(e.getKey()));
            Message msg = Message.obtain();
            msg.what=1;
            msg.obj = e.getKey();
            handler.sendMessageDelayed(msg,1000);
        }
    }
    @Subscribe
    public void KeyResultEvent(KeyResultEvent e){
        if(!isFinishing()&&isShowing){
            //校验时间
            if(keyTime==null){
                return;
            }
            if(keyTime!=null&&keyTime>System.currentTimeMillis()){
                //校验返回时间<命令时间
                return;
            }
            if(handler.hasMessages(2)){
                handler.removeMessages(2);
            }
            HashMap<String,String> copyMap = new HashMap<>();
            copyMap.putAll(closeMap);
            closeMap.clear();
            //校验卡号不对的,直接弹出
            List<CabinetGridDo> gridDos = DaoManager.getCabinetGridDao().loadAll();
            List<String> keys = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for(CabinetGridDo gridDo:gridDos){
                //要在范围内
                if(copyMap.containsKey(gridDo.getGridKey())){
                    boolean isFail = false;
                    if(TextUtils.isEmpty(gridDo.getGridKey())){
                        if(!TextUtils.isEmpty(gridDo.getCurKeyCode())&&gridDo.getIsOpen()==0){
                            //未绑定的存放了钥匙
                            keys.add(gridDo.getGridKey());
                            if(sb.length()>0){
                                sb.append("、");
                            }
                            sb.append(gridDo.getCabinetName());
                            isFail = true;
                        }
                    }else {
                        if(!TextUtils.isEmpty(gridDo.getCurKeyCode())){
                            if(!gridDo.getCurKeyCode().equals(gridDo.getKeyCode())&&gridDo.getIsOpen()==0){
                                //钥匙不匹配
                                keys.add(gridDo.getGridKey());
                                if(sb.length()>0){
                                    sb.append("、");
                                }
                                sb.append(gridDo.getCabinetName());
                                isFail = true;
                            }
                        }
                    }
                    if(!isFail){
                        //关门成功
                        EventBus.getDefault().post(new HttpEvent(StringUtil.DateToStrSS(new Date())+"门关闭成功***************************>目标:"+gridDo.getKeyCode()+",当前:"+gridDo.getCurKeyCode()));
                        getVM().closeGrid(gridDo);
                    }
                }
            }
            if(sb.length()>0){
                ToastView.show(MApplication.mContext, sb.toString() + "钥匙存放位置错误");
            }
            if(keys.size()>0){
                //开门
                EventBus.getDefault().post(new OpenGridListEvent(keys));
            }
        }
    }
}