bug:搜出来的灯会出现一个图标能控多个灯

21 篇文章 0 订阅
6 篇文章 0 订阅

描述

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值