描述
预置条件: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();
}