bug:搜出來的燈會出現一個圖示能控多個燈
阿新 • • 發佈:2018-12-06
描述
預置條件:30顆未新增的燈
操作步驟:分6次新增,每次新增5個
預期結果:新增成功,並且顯示序號正常
實際結果:1、上一輪加的燈有閃爍,但是APP未顯示
2、重新搜尋出現的燈4正常排序後,能控制之前閃爍無顯示的燈
原因分析:在給燈分配meshid的時候,在最後時刻成功了,但是已經搜尋結果頁面已經顯示失敗了,所以下次搜尋的時候還是用上次的meshid,導致一個meshid分配到兩個燈上,一個顯示成功,一個新增成功但未顯示。所以開關那個顯示成功的燈的時候,傳送的給同一個meshid,導致能出現控制兩個燈。
解決方案,新增一個黑名單機制,在分配meshid的時候把meshid放進黑名單,等到裝置新增完成了,再從黑名單中踢出新增成功的meshid,如果出現意外,在裝置上報的時候對比裝置列表中有沒有上報的資料,如果沒有的話 踢出不存在裝置列表的資料,並將黑名單對應的meshid資料刪除。
第一步在deviceMange中新增
addBlackDevice
deleteBlackDevice
queryBlackDevice
queryBlackDeviceBoolean 四個方法
//新增黑名單裝置 public void addBlackDevice(int nextMeshId) { if (blackList.contains((Integer) nextMeshId)) { return; } blackList.add(nextMeshId); Log.e("blackList", "addBlackDevice nextMeshId:"+ nextMeshId); } //移除黑名單裝置 public void deleteBlackDevice(int nextMeshId) { for(int i = 0 ;i<blackList.size();i++){ if( nextMeshId==blackList.get(i)){ blackList.remove(i); } } Log.e("blackList", "deleteBlackDevice nextMeshId:"+ nextMeshId); } //從黑名單判斷id是否存在 存在返回id+1 public int queryBlackDevice(int nextMeshId) { Log.e("blackList", "queryBlackDevice nextMeshId:"+ nextMeshId); Log.e("blackList", "queryBlackDevice blackList:"+ blackList+" blackList.size:"+ blackList.size()); while(queryBlackDeviceBoolean(nextMeshId)){ nextMeshId = getNextMeshId(nextMeshId + 1); } return nextMeshId; } //從黑名單判斷id是否存在 存在返回true public Boolean queryBlackDeviceBoolean(int nextMeshId) { Log.e("blackList", "queryBlackDeviceBoolean nextMeshId:"+ nextMeshId); if (blackList.isEmpty()) return false; for(int i = 0 ;i<blackList.size();i++){ if( nextMeshId==blackList.get(i)){ return true; }else{ return false; } } return false; }
第二步 在addDeviceFragment中分配meshid 判斷是否分配失敗重試,如果沒有的話就查詢meshid是否在黑名單中,如果沒有就新增到黑名單中,並將新的meshid儲存到鍵值對中
if(failTime <= 0 || TextUtils.isEmpty(macAddress)){ Log.e("blackList", " failTime:"+ failTime+"macAddress"+macAddress); nextMeshId = DeviceMange.getInstance().getNextMeshId(nextMeshId); Log.e("blackList", "1 nextMeshId:"+ nextMeshId); // 獲取meshId是否存在於黑名單中 nextMeshId = DeviceMange.getInstance().queryBlackDevice(nextMeshId); Log.e("blackList", "2 nextMeshId:"+ nextMeshId); // 新增meshId到黑名單中 DeviceMange.getInstance().addBlackDevice(nextMeshId); SharedPreferencesUtil.keepShared(Constant.DEVICE_ID_RECORD, nextMeshId);//將非黑名單的meshId儲存到DEVICE_ID_RECORD } if(failTime>=2){ DeviceMange.getInstance().deleteBlackDevice(nextMeshId); SharedPreferencesUtil.keepShared(Constant.DEVICE_ID_RECORD, nextMeshId-1);//將 非黑名單的meshId儲存到DEVICE_ID_RECORD }
第三步 在addDeviceFragment中新增裝置成功將meshid從黑名單移除
int nextMeshId = SharedPreferencesUtil.queryIntValue(Constant.DEVICE_ID_RECORD) ;
SharedPreferencesUtil.keepShared(Constant.DEVICE_ID_RECORD, meshAddress);//儲存meshID最後的記錄
//TODO:2
Log.e("blackList", "3 meshAddress:" +meshAddress);
Log.e("blackList", "4 nextMeshId:"+ nextMeshId);
DeviceMange.getInstance().deleteBlackDevice(nextMeshId);
第四步 在TelinkLightService中收到裝置上報指令0xDC對比裝置列表中有沒有該裝置,沒有的話就踢出裝置並將黑名單中裝置移除
if (opcode == 0xDC) {
int device1 = data[10] & 0xFF;
int device2 = data[14] & 0xFF;
Log.e("weichongbin3","device1 = " +device1+"device2="+device2);
if(device1 > 0){
Device device = DeviceMange.getInstance().getDeviceByMesh(device1);
if(device == null){// 不存在該裝置,需從mesh中刪除
CtrlDeviceHandler.kickOut(device1);
}
}
if(device2 > 0){
Device device = DeviceMange.getInstance().getDeviceByMesh(device2);
if(device == null){// 不存在該裝置,需從mesh中刪除
CtrlDeviceHandler.kickOut(device2);
}
}
//收到推送時候清除黑名單
ArrayList blackList = DeviceMange.getInstance().getBlackList();
blackList.clear();
}