keyCabinet-android/app/build.gradle
@@ -126,6 +126,8 @@ //implementation 'com.github.Shouheng88:compressor:latest-version' //å缩å¾ç implementation "id.zelory:compressor:1.0.3" //ä¸²å£ implementation 'com.licheedev:android-serialport:2.1.3' //äºç»´ç çæ implementation 'com.journeyapps:zxing-android-embedded:3.4.0' keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/CabinetDetailBean.java
@@ -5,7 +5,6 @@ import lombok.Data; @Data public class CabinetDetailBean implements Serializable { //设å¤ç¼å· private String code; @@ -29,101 +28,8 @@ private Integer unBindGridNum; //ææ ¼ä¿¡æ¯ private List<CabinetGridInfoVOListBean> cabinetGridInfoVOList; private List<ManageKeyCabinetBean> cabinetGridInfoVOList; @Data public static class CabinetGridInfoVOListBean implements Serializable { //ç»å®ç¶æ 0æªç»å®ï¼1å·²ç»å® private Integer bindStatus; //æ¿å· private String boardCode; //车çå· private int carCode; //ééå· private String channelCode; //ç¼ç private String code; //ä¸»é® private Integer id; //é¥åç¼ç private Integer keyId; //é¥åç¶æ 0æªç»å® 1å¨ä½ 2ååº 3ç»´ä¿®ä¿å » private Integer keyStatus; //æä½è¿è¡ç¶æ 0æ£å¸¸ 1æ é private Integer workingStatus; public Integer getBindStatus() { return bindStatus; } public void setBindStatus(Integer bindStatus) { this.bindStatus = bindStatus; } public String getBoardCode() { return boardCode; } public void setBoardCode(String boardCode) { this.boardCode = boardCode; } public int getCarCode() { return carCode; } public void setCarCode(int carCode) { this.carCode = carCode; } public String getChannelCode() { return channelCode; } public void setChannelCode(String channelCode) { this.channelCode = channelCode; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getKeyId() { return keyId; } public void setKeyId(Integer keyId) { this.keyId = keyId; } public Integer getKeyStatus() { return keyStatus; } public void setKeyStatus(Integer keyStatus) { this.keyStatus = keyStatus; } public Integer getWorkingStatus() { return workingStatus; } public void setWorkingStatus(Integer workingStatus) { this.workingStatus = workingStatus; } } public String getCode() { return code; @@ -205,11 +111,11 @@ this.unBindGridNum = unBindGridNum; } public List<CabinetGridInfoVOListBean> getCabinetGridInfoVOList() { public List<ManageKeyCabinetBean> getCabinetGridInfoVOList() { return cabinetGridInfoVOList; } public void setCabinetGridInfoVOList(List<CabinetGridInfoVOListBean> cabinetGridInfoVOList) { public void setCabinetGridInfoVOList(List<ManageKeyCabinetBean> cabinetGridInfoVOList) { this.cabinetGridInfoVOList = cabinetGridInfoVOList; } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/LoginBean.java
@@ -10,6 +10,7 @@ //0ï¼åï¼1ï¼è¿ private int flag ; private String token; public Integer getAutoMemberId() { return autoMemberId; @@ -42,4 +43,12 @@ public void setFlag(int flag) { this.flag = flag; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/bean/ManageKeyCabinetBean.java
@@ -1,5 +1,101 @@ package com.doumee.keyCabinet.bean; public class ManageKeyCabinetBean { import androidx.databinding.ObservableField; public class ManageKeyCabinetBean { //ç»å®ç¶æ 0æªç»å®ï¼1å·²ç»å® private Integer bindStatus; //æ¿å· private String boardCode; //车çå· private int carCode; //ééå· private String channelCode; //ç¼ç private String code; //ä¸»é® private Integer id; //é¥åç¼ç private Integer keyId; //é¥åç¶æ 0æªç»å® 1å¨ä½ 2ååº 3ç»´ä¿®ä¿å » private Integer keyStatus; //æä½è¿è¡ç¶æ 0æ£å¸¸ 1æ é private Integer workingStatus; private ObservableField<Boolean> isSelected = new ObservableField<>(false); public ObservableField<Boolean> getIsSelected() { return isSelected; } public Integer getBindStatus() { return bindStatus; } public void setBindStatus(Integer bindStatus) { this.bindStatus = bindStatus; } public String getBoardCode() { return boardCode; } public void setBoardCode(String boardCode) { this.boardCode = boardCode; } public int getCarCode() { return carCode; } public void setCarCode(int carCode) { this.carCode = carCode; } public String getChannelCode() { return channelCode; } public void setChannelCode(String channelCode) { this.channelCode = channelCode; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getKeyId() { return keyId; } public void setKeyId(Integer keyId) { this.keyId = keyId; } public Integer getKeyStatus() { return keyStatus; } public void setKeyStatus(Integer keyStatus) { this.keyStatus = keyStatus; } public Integer getWorkingStatus() { return workingStatus; } public void setWorkingStatus(Integer workingStatus) { this.workingStatus = workingStatus; } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/Apis.java
@@ -83,7 +83,7 @@ * è·åé¥åæè¯¦æ - 管çå */ @GET("/visitsAdmin/cloudService/web/cabinet/getCabinetDetail") Observable<BaseResponse<List<CabinetDetailBean>>> getCabinetDetail(@Header("dm_user_token") String token,@Query("cabinetId")Integer cabinetId); Observable<BaseResponse<CabinetDetailBean>> getCabinetDetail(@Header("dm_user_token") String token,@Query("cabinetId")Integer cabinetId); /** * æ¹éå¼é¨ - 管çå @@ -109,6 +109,11 @@ @POST("/visitsAdmin/cloudService/web/cabinet/markRepair") Observable<BaseResponse> markRepair(@Header("dm_user_token") String token,@Body RequestBody requestBody); /** * æ è®°ç»´ä¿®ä¿å » - 管çå */ @POST("/loginCabinet") Observable<BaseResponse<String>> loginCabinet(@Body RequestBody requestBody); } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/http/param/LoginCabinetParam.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.doumee.keyCabinet.http.param; public class LoginCabinetParam { private String password; private String username; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetActivity.java
@@ -2,19 +2,30 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.Observer; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.doumee.keyCabinet.R; import com.doumee.keyCabinet.base.MyBaseActivity; import com.doumee.keyCabinet.bean.CabinetDetailBean; import com.doumee.keyCabinet.bean.ManageKeyCabinetBean; import com.doumee.keyCabinet.databinding.ManageCabinetActivityBinding; import com.doumee.keyCabinet.ui.keyCabinet.adapter.ManageCabinetRcvAdapter; import com.doumee.lib_coremodel.bean.event.ActionEventData; import java.util.ArrayList; import java.util.List; import dagger.hilt.android.AndroidEntryPoint; @AndroidEntryPoint public class ManageCabinetActivity extends MyBaseActivity<ManageCabinetVM, ManageCabinetActivityBinding> { private ManageCabinetRcvAdapter adapter; //1å¾ å ¨å¼ï¼2å¾ æ¹éå¼ private int status; @Override public int getLayoutId() { @@ -31,6 +42,96 @@ @Override public void initData(@Nullable Bundle savedInstanceState) { getVM().getDatasLD().observe(this, new Observer<List<ManageKeyCabinetBean>>() { @Override public void onChanged(List<ManageKeyCabinetBean> gridInfoBeans) { } }); getVM().getCabinetDetail(); } private List<Integer> bjIds = new ArrayList<>(); private boolean isGz = true; @Override protected void doRegister(int type, ActionEventData data) { switch (type){ case 1: //todo wmf æ ¡éªæåæ¯å¦é½å·²å ³é finish(); break; case 2: //å ¨å¼ status = 1; //todo å ¨å¼ break; case 3: { //æ¹éå¼é¨ï¼æ ¡éªæ¯å¦å¯æå¼ List<Integer> ids = new ArrayList<>(); List<ManageKeyCabinetBean> datas = adapter.getListData(); for (ManageKeyCabinetBean bean : datas) { if (bean.getIsSelected().get()) { ids.add(bean.getId()); } } if (ids.size() == 0) { Toast.makeText(mContext, "è¯·éæ©ææ ¼", Toast.LENGTH_SHORT).show(); return; } getVM().batchOpenGridAdmin(ids); }break; case 8: status = 2; //todo æ¹éå¼ break; case 4: { //æ è®° bjIds.clear(); isGz = true; List<ManageKeyCabinetBean> datas = adapter.getListData(); for (ManageKeyCabinetBean bean : datas) { if (bean.getIsSelected().get()) { bjIds.add(bean.getId()); if(bean.getWorkingStatus()==0){ isGz = false; } } } if (bjIds.size() == 0) { Toast.makeText(mContext, "è¯·éæ©ææ ¼", Toast.LENGTH_SHORT).show(); return; } if(isGz){ //å ¨ä¸ºæ é getDB().tvBjgz.setText("æ 记为æ£å¸¸"); getDB().tvBjgz.setTextColor(0xff279BAA); getDB().tvBjgz.setBackgroundResource(R.drawable.shape_mb_cz_2_bg); }else { //æ è®°æ é getDB().tvBjgz.setText("æ 记为æ é"); getDB().tvBjgz.setTextColor(0xffFF3600); getDB().tvBjgz.setBackgroundResource(R.drawable.shape_mb_cz_1_bg); } getDB().clCz.setVisibility(View.VISIBLE); }break; case 5: getDB().clCz.setVisibility(View.GONE); break; case 6: //ç»´ä¿® getVM().markRepair(bjIds); break; case 7: if(isGz) { //æ£å¸¸ getVM().cancelFault(bjIds); }else { //æ é getVM().markFault(bjIds); } break; default: break; } } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageCabinetVM.java
@@ -3,12 +3,32 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.databinding.ObservableField; import androidx.hilt.lifecycle.ViewModelInject; import androidx.lifecycle.MutableLiveData; import com.doumee.keyCabinet.MApplication; import com.doumee.keyCabinet.bean.CabinetDetailBean; import com.doumee.keyCabinet.bean.ManageKeyCabinetBean; import com.doumee.keyCabinet.http.Apis; import com.doumee.keyCabinet.http.param.BaseResponse; import com.doumee.keyCabinet.http.param.BatchOpenGridAdminParam; import com.doumee.keyCabinet.http.param.CancelFaultParam; import com.doumee.keyCabinet.http.param.MarkFaultParam; import com.doumee.keyCabinet.http.param.MarkRepairParam; import com.doumee.keyCabinet.utils.ParamsUtil; import com.doumee.lib_coremodel.base.BaseModel; import com.doumee.lib_coremodel.base.DataViewModel; import com.doumee.lib_coremodel.http.rxJava.SimpleObserver; import com.doumee.lib_coremodel.http.utils.RxUtils; import java.util.ArrayList; import java.util.List; public class ManageCabinetVM extends DataViewModel { public ObservableField<CabinetDetailBean> dataOb = new ObservableField<>(); private MutableLiveData<List<ManageKeyCabinetBean>> datasLD = new MutableLiveData<>(); @ViewModelInject public ManageCabinetVM(@NonNull Application application, BaseModel model) { super(application, model); @@ -18,4 +38,164 @@ protected void clickByTypeCommand(int type) { doAction(type); } public void getCabinetDetail(){ showLoading(true); getRetrofitService(Apis.class).getCabinetDetail(MApplication.getLoginBean().getToken(), MApplication.getConfigBean().getId()) .compose(RxUtils.schedulersTransformer()) .subscribe(new SimpleObserver<BaseResponse<CabinetDetailBean>>(rxJavaGcManager) { @Override public void onNext(@NonNull BaseResponse<CabinetDetailBean> response) { if(200==response.getCode()){ dataOb.set(response.getData()); if(response.getData()!=null){ if(response.getData().getCabinetGridInfoVOList()!=null){ datasLD.setValue(response.getData().getCabinetGridInfoVOList()); }else { datasLD.setValue(new ArrayList<>()); } }else { datasLD.setValue(new ArrayList<>()); } }else { toast(response.getMessage()); } } @Override public void onError(@NonNull Throwable e) { toast(e.getMessage()); } @Override public void onComplete() { hideLoading(); } }); } public void batchOpenGridAdmin(List<Integer> gridIdList){ showLoading(true); BatchOpenGridAdminParam param = new BatchOpenGridAdminParam(); param.setCabinetId(MApplication.getConfigBean().getId()); param.setGridIdList(gridIdList); getRetrofitService(Apis.class).batchOpenGridAdmin(MApplication.getLoginBean().getToken(), ParamsUtil.encodeRequestBody(param)) .compose(RxUtils.schedulersTransformer()) .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) { @Override public void onNext(@NonNull BaseResponse response) { if(200==response.getCode()){ doAction(8); }else { toast(response.getMessage()); } } @Override public void onError(@NonNull Throwable e) { toast(e.getMessage()); } @Override public void onComplete() { hideLoading(); } }); } public void cancelFault(List<Integer> gridIdList){ showLoading(true); CancelFaultParam param = new CancelFaultParam(); param.setCabinetId(MApplication.getConfigBean().getId()); param.setGridIdList(gridIdList); getRetrofitService(Apis.class).cancelFault(MApplication.getLoginBean().getToken(), ParamsUtil.encodeRequestBody(param)) .compose(RxUtils.schedulersTransformer()) .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) { @Override public void onNext(@NonNull BaseResponse response) { if(200==response.getCode()){ getCabinetDetail(); }else { toast(response.getMessage()); } } @Override public void onError(@NonNull Throwable e) { toast(e.getMessage()); } @Override public void onComplete() { hideLoading(); } }); } public void markFault(List<Integer> gridIdList){ showLoading(true); MarkFaultParam param = new MarkFaultParam(); param.setCabinetId(MApplication.getConfigBean().getId()); param.setGridIdList(gridIdList); getRetrofitService(Apis.class).markFault(MApplication.getLoginBean().getToken(), ParamsUtil.encodeRequestBody(param)) .compose(RxUtils.schedulersTransformer()) .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) { @Override public void onNext(@NonNull BaseResponse response) { if(200==response.getCode()){ getCabinetDetail(); }else { toast(response.getMessage()); } } @Override public void onError(@NonNull Throwable e) { toast(e.getMessage()); } @Override public void onComplete() { hideLoading(); } }); } public void markRepair(List<Integer> gridIdList){ showLoading(true); MarkRepairParam param = new MarkRepairParam(); param.setCabinetId(MApplication.getConfigBean().getId()); param.setGridIdList(gridIdList); getRetrofitService(Apis.class).markRepair(MApplication.getLoginBean().getToken(), ParamsUtil.encodeRequestBody(param)) .compose(RxUtils.schedulersTransformer()) .subscribe(new SimpleObserver<BaseResponse>(rxJavaGcManager) { @Override public void onNext(@NonNull BaseResponse response) { if(200==response.getCode()){ getCabinetDetail(); }else { toast(response.getMessage()); } } @Override public void onError(@NonNull Throwable e) { toast(e.getMessage()); } @Override public void onComplete() { hideLoading(); } }); } public MutableLiveData<List<ManageKeyCabinetBean>> getDatasLD() { return datasLD; } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginActivity.java
@@ -4,10 +4,14 @@ import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Toast; import com.doumee.keyCabinet.R; import com.doumee.keyCabinet.base.MyBaseActivity; import com.doumee.keyCabinet.databinding.ManageLoginActivityBinding; import com.doumee.lib_coremodel.bean.event.ActionEventData; import dagger.hilt.android.AndroidEntryPoint; @@ -31,4 +35,36 @@ public void initData(@Nullable Bundle savedInstanceState) { } @Override protected void doRegister(int type, ActionEventData data) { switch (type){ case 1: //æ¾ç¤ºå¯ç break; case 2: if(TextUtils.isEmpty(getDB().etName.getText().toString())){ Toast.makeText(mContext, "请è¾å ¥ç»å½è´¦å·", Toast.LENGTH_SHORT).show(); return; } if(TextUtils.isEmpty(getDB().etPw.getText().toString())){ Toast.makeText(mContext, "请è¾å ¥è´¦å·å¯ç ", Toast.LENGTH_SHORT).show(); return; } getVM().loginCabinet(getDB().etName.getText().toString(),getDB().etPw.getText().toString()); break; case 3: //æ¾ç¤ºå è½½ getDB().clProgress.setVisibility(View.VISIBLE); getDB().clTip.setVisibility(View.GONE); break; case 4: getDB().clProgress.setVisibility(View.GONE); getDB().clTip.setVisibility(View.VISIBLE); break; default: break; } } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/ManageLoginVM.java
@@ -5,8 +5,17 @@ import androidx.annotation.NonNull; import androidx.hilt.lifecycle.ViewModelInject; import com.doumee.keyCabinet.MApplication; import com.doumee.keyCabinet.bean.KeyCabinetBean; import com.doumee.keyCabinet.http.Apis; import com.doumee.keyCabinet.http.param.BaseResponse; import com.doumee.keyCabinet.http.param.LoginCabinetParam; import com.doumee.keyCabinet.http.param.OpenGridDriverParam; import com.doumee.keyCabinet.utils.ParamsUtil; import com.doumee.lib_coremodel.base.BaseModel; import com.doumee.lib_coremodel.base.DataViewModel; import com.doumee.lib_coremodel.http.rxJava.SimpleObserver; import com.doumee.lib_coremodel.http.utils.RxUtils; public class ManageLoginVM extends DataViewModel { @ViewModelInject @@ -18,4 +27,34 @@ protected void clickByTypeCommand(int type) { doAction(type); } public void loginCabinet(String userName,String pw){ LoginCabinetParam param = new LoginCabinetParam(); param.setUsername(userName); param.setPassword(pw); doAction(3); getRetrofitService(Apis.class).loginCabinet(ParamsUtil.encodeRequestBody(param)) .compose(RxUtils.schedulersTransformer()) .subscribe(new SimpleObserver<BaseResponse<String>>(rxJavaGcManager) { @Override public void onNext(@NonNull BaseResponse<String> response) { if(200==response.getCode()){ MApplication.getLoginBean().setToken(response.getData()); startActivity(ManageCabinetActivity.class); }else { doAction(4); } } @Override public void onError(@NonNull Throwable e) { doAction(4); } @Override public void onComplete() { } }); } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/keyCabinet/adapter/ManageCabinetRcvAdapter.java
@@ -3,6 +3,7 @@ import android.content.Context; import android.view.View; import com.doumee.keyCabinet.R; import com.doumee.keyCabinet.bean.KeyCabinetBean; import com.doumee.keyCabinet.bean.ManageKeyCabinetBean; import com.doumee.keyCabinet.databinding.CabinetRcvItemBinding; @@ -11,25 +12,47 @@ import com.doumee.lib_coremodel.view.recyclerview.adapter.BindingHolder; public class ManageCabinetRcvAdapter extends BindingAdapter<ManageKeyCabinetBean, ManageCabinetRcvItemBinding> { public static interface OnItemClick{ void onItemClick(ManageKeyCabinetBean item); } private OnItemClick onItemClick; public ManageCabinetRcvAdapter(Context context, int layoutId, OnItemClick onItemClick) { public ManageCabinetRcvAdapter(Context context, int layoutId) { super(context, layoutId); this.onItemClick = onItemClick; } @Override public void bindViewDatas(BindingHolder<ManageCabinetRcvItemBinding> holder, ManageKeyCabinetBean item, int position) { holder.getBinding().setData(item); holder.getBinding().clRoot.setOnLongClickListener(new View.OnLongClickListener() { if(item.getWorkingStatus()==1){ //æ é holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c04_6_bg); }else { //0æªç»å® 1å¨ä½ 2ååº 3ç»´ä¿®ä¿å » switch (item.getKeyStatus()){ case 0: holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c05_6_bg); break; case 1: holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c01_6_bg); break; case 2: holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c02_6_bg); break; default: holder.getBinding().clRoot.setBackgroundResource(R.drawable.shape_c03_6_bg); break; } } if(item.getWorkingStatus()==0&&item.getKeyStatus()==3){ //ç»´ä¿® holder.getBinding().tv1.setTextColor(0xff279BAA); holder.getBinding().tv2.setTextColor(0xff279BAA); }else { holder.getBinding().tv1.setTextColor(0xffffffff); holder.getBinding().tv2.setTextColor(0xffffffff); } holder.getBinding().clRoot.setOnClickListener(new View.OnClickListener() { @Override public boolean onLongClick(View v) { if(onItemClick!=null){ onItemClick.onItemClick(item); } return true; public void onClick(View v) { item.getIsSelected().set(!item.getIsSelected().get()); } }); } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -8,6 +8,8 @@ import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.hardware.Camera; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -75,6 +77,9 @@ import com.doumee.keyCabinet.utils.face.ImportFileManager; import com.doumee.keyCabinet.utils.face.RegisterConfigUtils; import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig; import com.doumee.keyCabinet.utils.i485.SerialPortModel; import com.doumee.keyCabinet.utils.i485.SerialPortReadObserver; import com.doumee.keyCabinet.utils.i485.SportUtils; import com.doumee.keyCabinet.utils.update.PermissionUtils; import com.doumee.keyCabinet.utils.update.PermissiondDialog; import com.doumee.keyCabinet.utils.update.UpdateUtil; @@ -101,6 +106,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Random; import java.util.Timer; @@ -182,6 +188,7 @@ startService(intent2); getPermission(); Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId()); initPort(); } private void initM(){ @@ -388,6 +395,8 @@ handler = null; faceHandler.removeCallbacksAndMessages(null); faceHandler = null; portHandler.removeCallbacksAndMessages(null); portHandler = null; } private void restartApp(){ @@ -1042,4 +1051,136 @@ } } private SerialPortModel gridPort; private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() { @Override public void onResult(String result) { } @Override public void onResultBytes(byte[] bytes) { if(gridPort!=null && !gridPort.isOk()){ gridPort.setOk(true); } } }; private SerialPortModel keyPort; private SerialPortReadObserver keyReadObserver = new SerialPortReadObserver() { @Override public void onResult(String result) { } @Override public void onResultBytes(byte[] bytes) { if(keyPort!=null && !keyPort.isOk()){ keyPort.setOk(true); } } }; private SerialPortModel jiuPort; private SerialPortReadObserver jiuReadObserver = new SerialPortReadObserver() { @Override public void onResult(String result) { } @Override public void onResultBytes(byte[] bytes) { if(jiuPort!=null && !jiuPort.isOk()){ jiuPort.setOk(true); } } }; List<String> ports; private int index = 0; private Handler portHandler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { switch (msg.what){ case 0: if(index>=1&&!checkEnd()){ index--; chosePort(ports.get(index)); } break; default: break; } } }; //åå§åä¸²å£ private void initPort(){ ports = SportUtils.getSerialPortPaths(this); if(ports.size()>0){ index = ports.size()-1; chosePort(ports.get(ports.size()-1)); } } private void chosePort(String path){ if(gridPort==null||!gridPort.isOk()){ closePort(gridPort); gridPort = new SerialPortModel(path,9600 ,8 ,1 , 0); boolean isSucc = gridPort.open(); if(isSucc) { String msg = isSucc ? "æå" : "失败"; //getVM().append("ä¸²å£ "+ settingBean.getDevicePath() + " -è¿æ¥"+msg); gridPort.startRead(gridReadObserver); //todo åéææ ¼æ ¡éªä¿¡æ¯ } } if(keyPort==null||!keyPort.isOk()){ closePort(keyPort); keyPort = new SerialPortModel(path,115200 ,8 ,1 , 0); boolean isSucc = keyPort.open(); if(isSucc) { String msg = isSucc ? "æå" : "失败"; //getVM().append("ä¸²å£ "+ settingBean.getDevicePath() + " -è¿æ¥"+msg); keyPort.startRead(keyReadObserver); //todo åéé¥åæ ¡éªä¿¡æ¯ } } if(jiuPort==null||!jiuPort.isOk()){ closePort(jiuPort); jiuPort = new SerialPortModel(path,9600 ,8 ,1 , 0); boolean isSucc = jiuPort.open(); if(isSucc) { String msg = isSucc ? "æå" : "失败"; //getVM().append("ä¸²å£ "+ settingBean.getDevicePath() + " -è¿æ¥"+msg); jiuPort.startRead(jiuReadObserver); //todo åéé ç²¾æ ¡éªä¿¡æ¯ } } portHandler.sendEmptyMessageDelayed(0,2000); } private void closePort(SerialPortModel port){ if(port==null){ return; } port.startRead(null); port.stopRead(); port.close(); port = null; } private boolean checkEnd(){ if(gridPort==null||!gridPort.isOk()){ return false; } if(keyPort==null||!keyPort.isOk()){ return false; } if(jiuPort==null||!jiuPort.isOk()){ return false; } return true; } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortModel.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,122 @@ package com.doumee.keyCabinet.utils.i485; import android.serialport.SerialPort; import android.util.Log; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class SerialPortModel { public static final String TAG = SerialPortModel.class.getSimpleName(); private void logI(String str) { Log.i(TAG, str); } private String serialPortPath; private int baudrate; private int dataBits; private int stopBits; private int parity; private SerialPort serialPort; private ScheduledExecutorService scheduledExecutorService; private ExecutorService singleThreadExecutor; private ScheduledFuture scheduledFuture; private boolean isOk = false; private final Object writeLock = new Object(); public SerialPortModel(String serialPortPath, int baudrate, int dataBits, int stopBits, int parity) { this.serialPortPath = serialPortPath; this.baudrate = baudrate; this.dataBits = dataBits; this.stopBits = stopBits; this.parity = parity; } public boolean open() { try { File device = new File(serialPortPath); serialPort = SerialPort .newBuilder(device, baudrate) .dataBits(dataBits) .stopBits(stopBits) .parity(parity) .build(); scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); singleThreadExecutor = Executors.newSingleThreadExecutor(); } catch (IOException e) { e.printStackTrace(); return false; } return true; } public void close() { try { serialPort.getInputStream().close(); serialPort.getOutputStream().close(); serialPort.close(); serialPort = null; scheduledExecutorService.shutdown(); singleThreadExecutor.shutdown(); } catch (IOException e) { e.printStackTrace(); } } public void startRead(SerialPortReadObserver serialPortReadObserver) { scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> { InputStream inputStream = serialPort.getInputStream(); byte[] bytes = new byte[2048]; int length = 0; try { length = inputStream.read(bytes); } catch (IOException e) { e.printStackTrace(); } // logI("startRead - length: " + length); if (length <= 0) return; //String result = new String(bytes, 0, length); byte[] bytes2 = new byte[length]; for(int i=0;i<length;i++){ bytes2[i] = bytes[i]; } serialPortReadObserver.onResultBytes(bytes2); }, 0, 50, TimeUnit.MILLISECONDS); } public void stopRead() { scheduledFuture.cancel(true); } public void write(byte[] bytes,SerialPortReadObserver serialPortReadObserver) { singleThreadExecutor.execute(() -> { synchronized (writeLock) { try { serialPort.getOutputStream().write(bytes); serialPortReadObserver.onResult(null); } catch (IOException e) { e.printStackTrace(); serialPortReadObserver.onResult(e.getMessage()); } } }); } public boolean isOk() { return isOk; } public void setOk(boolean ok) { isOk = ok; } } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SerialPortReadObserver.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,7 @@ package com.doumee.keyCabinet.utils.i485; public interface SerialPortReadObserver { void onResult(String result); void onResultBytes(byte[] bytes); } keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/utils/i485/SportUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.doumee.keyCabinet.utils.i485; import android.content.Context; import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbInterface; import android.hardware.usb.UsbManager; import java.util.ArrayList; import java.util.List; public class SportUtils { public static List<String> getSerialPortPaths(Context context) { UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); List<UsbDevice> devices = new ArrayList<>(usbManager.getDeviceList().values()); List<String> serialPaths = new ArrayList<>(); for (UsbDevice device : devices) { for (int i = 0; i < device.getInterfaceCount(); i++) { UsbInterface intf = device.getInterface(i); if (intf.getInterfaceClass() == UsbConstants.USB_CLASS_CDC_DATA) { serialPaths.add(device.getDeviceName()); break; } } } return serialPaths; } } keyCabinet-android/app/src/main/res/drawable/shape_c05_6_bg.xml
@@ -2,6 +2,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#279BAA" /> <solid android:color="#26279BAA" /> <corners android:radius="6dp" /> </shape> keyCabinet-android/app/src/main/res/layout/manage_cabinet_activity.xml
@@ -44,7 +44,7 @@ android:id="@+id/tv_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:text='@{model.dataOb.gridNum+""}' android:textColor="#111111" android:textSize="22sp" app:layout_constraintTop_toTopOf="@+id/tv1" @@ -121,7 +121,7 @@ android:id="@+id/tv_zw_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:text='@{model.dataOb.onlineKeyNum+""}' android:textColor="#ff111111" android:textSize="21sp" android:paddingBottom="3dp"/> @@ -156,7 +156,7 @@ android:id="@+id/tv_jc_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:text='@{model.dataOb.outKeyNum+""}' android:textColor="#ff111111" android:textSize="21sp" android:paddingBottom="3dp"/> @@ -191,7 +191,7 @@ android:id="@+id/tv_wx_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:text='@{model.dataOb.serviceKeyNum+""}' android:textColor="#ff111111" android:textSize="21sp" android:paddingBottom="3dp"/> @@ -250,7 +250,7 @@ android:id="@+id/tv_gz_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:text='@{model.dataOb.errGridNum+""}' android:textColor="#ff111111" android:textSize="21sp" android:paddingBottom="3dp"/> @@ -285,7 +285,7 @@ android:id="@+id/tv_wbd_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0" android:text='@{model.dataOb.unBindGridNum+""}' android:textColor="#ff111111" android:textSize="21sp" android:paddingBottom="3dp"/> @@ -382,7 +382,7 @@ android:id="@+id/cl_cz" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"> android:visibility="visible"> <View android:layout_width="match_parent" keyCabinet-android/app/src/main/res/layout/manage_cabinet_rcv_item.xml
@@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <layout xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <import type="android.view.View"/> <variable name="data" type="com.doumee.keyCabinet.bean.ManageKeyCabinetBean" /> @@ -10,31 +11,40 @@ android:id="@+id/cl_root" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="9dp" android:background="@drawable/shape_r6_cabinet_unsel_bg"> android:background="@drawable/shape_c01_6_bg"> <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="A02" android:text="@{data.code}" android:textColor="#ff111111" android:textSize="24sp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> android:layout_marginLeft="15dp" android:layout_marginTop="9dp" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="èA18812" android:text="@{data.carCode}" android:textColor="#ff279baa" android:textSize="24sp" app:layout_constraintTop_toBottomOf="@+id/tv1" app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="15dp" android:layout_marginTop="10dp" android:paddingBottom="9dp"/> <ImageView android:layout_width="45dp" android:layout_height="45dp" android:src="@mipmap/ic_sel" app:layout_constraintEnd_toEndOf="parent" android:layout_marginTop="7dp"/> app:layout_constraintBottom_toBottomOf="parent" android:visibility="@{data.isSelected?View.VISIBLE:View.GONE}"/> </androidx.constraintlayout.widget.ConstraintLayout> </layout> keyCabinet-android/app/src/main/res/layout/manage_login_activity.xml
@@ -72,6 +72,7 @@ android:layout_marginLeft="22dp"/> <EditText android:id="@+id/et_name" android:layout_width="0dp" android:layout_height="75dp" android:background="@null" @@ -121,6 +122,7 @@ android:layout_marginLeft="22dp"/> <EditText android:id="@+id/et_pw" android:layout_width="0dp" android:layout_height="75dp" android:background="@null" keyCabinet-android/app/src/main/res/mipmap-xxhdpi/login_eyeopen.png