mac
2024-06-05 31de722a45e886eae89cfea2f1740c1f4d3b0216
app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -3,7 +3,6 @@
import android.os.SystemClock;
import android.text.TextUtils;
import com.facebook.imagepipeline.image.OriginalEncodedImageInfo;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
@@ -20,25 +19,15 @@
import com.hdl.photovoltaic.listener.LinkCallBack;
import com.hdl.photovoltaic.ui.bean.CloudInverterChildDeviceBean;
import com.hdl.photovoltaic.ui.bean.CloudInverterDeviceBean;
import com.hdl.photovoltaic.ui.bean.DeviceBean;
import com.hdl.photovoltaic.ui.bean.DeviceRemoteInfo;
import com.hdl.photovoltaic.ui.bean.DeviceTimeBean;
import com.hdl.photovoltaic.ui.bean.HouseInfoBean;
import com.hdl.photovoltaic.ui.bean.MessageBean;
import com.hdl.photovoltaic.ui.bean.OidBean;
import com.hdl.photovoltaic.ui.bean.StatusOverviewBean;
import com.hdl.sdk.link.HDLLinkLocalSdk;
import com.hdl.sdk.link.common.config.TopicConstant;
import com.hdl.sdk.link.common.exception.HDLLinkCode;
import com.hdl.sdk.link.common.exception.HDLLinkException;
import com.hdl.sdk.link.common.utils.IdUtils;
import com.hdl.sdk.link.core.bean.LinkRequest;
import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
import com.hdl.sdk.link.core.callback.GatewayCallBack;
import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
import com.hdl.sdk.link.core.config.HDLLinkConfig;
import com.hdl.sdk.link.core.connect.HDLConnectHelper;
import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
import com.hdl.sdk.link.gateway.type.GatewayMasterType;
@@ -72,11 +61,9 @@
        return sHdlDeviceLogic;
    }
    public static final String kWp = "kWp";
    public static final String kWh = "kW.h";
    public static final String kW = "kW";
    private List<DeviceBean> mListDevice = new ArrayList<>();
    private List<CloudInverterDeviceBean> mListDevice = new ArrayList<>();
    public void clearDeviceList() {
        if (mListDevice == null) {
@@ -87,7 +74,7 @@
        }
    }
    public List<DeviceBean> getDeviceList() {
    public List<CloudInverterDeviceBean> getDeviceList() {
        if (mListDevice == null) {
            return new ArrayList<>();
        }
@@ -178,7 +165,7 @@
     * @param pageNo    页码
     * @param pageSize  页数
     */
    public void getPowerStationDeviceList(String searchTxt, long pageNo, long pageSize, CloudCallBeak<PageNumberObject<DeviceBean>> cloudCallBeak) {
    public void getPowerStationDeviceList(String searchTxt, long pageNo, long pageSize, CloudCallBeak<PageNumberObject<CloudInverterDeviceBean>> cloudCallBeak) {
        String requestUrl = HttpApi.POST_deviceList;
        JsonObject json = new JsonObject();
        if (!TextUtils.isEmpty(searchTxt)) {
@@ -196,9 +183,9 @@
                    }
                }
                Gson gson = new Gson();
                Type type = new TypeToken<PageNumberObject<DeviceBean>>() {
                Type type = new TypeToken<PageNumberObject<CloudInverterDeviceBean>>() {
                }.getType();
                PageNumberObject<DeviceBean> pageNumberObject = gson.fromJson(jsonStr, type);
                PageNumberObject<CloudInverterDeviceBean> pageNumberObject = gson.fromJson(jsonStr, type);
                if (cloudCallBeak != null) {
                    cloudCallBeak.onSuccess(pageNumberObject);
                }
@@ -213,43 +200,13 @@
        });
    }
    /**
     * 电站状态概览(安装商)
     */
    public void getStatusOverview(CloudCallBeak<StatusOverviewBean> cloudCallBeak) {
        String requestUrl = HttpApi.POST_statusOverview;
        JsonObject json = new JsonObject();
//        json.addProperty("zoneType", zoneType);//区域
        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
            @Override
            public void onSuccess(String jsonStr) {
                if (TextUtils.isEmpty(jsonStr)) {
                    if (cloudCallBeak != null) {
                        cloudCallBeak.onSuccess(new StatusOverviewBean());
                    }
                }
                Gson gson = new Gson();
                StatusOverviewBean statusOverviewBean = gson.fromJson(jsonStr, StatusOverviewBean.class);
                if (cloudCallBeak != null) {
                    cloudCallBeak.onSuccess(statusOverviewBean);
                }
            }
            @Override
            public void onFailure(HDLException e) {
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(e);
                }
            }
        });
    }
    /**
     * 添加【设备列表】到本地缓存
     *
     * @param list -设备列表
     */
    public void setListDevice(List<DeviceBean> list) {
    public void setListDevice(List<CloudInverterDeviceBean> list) {
        try {
            if (list == null || list.size() == 0) {
                return;
@@ -270,7 +227,7 @@
     *
     * @param deviceBean -设备对象
     */
    public void setSingleDevice(DeviceBean deviceBean) {
    public void setSingleDevice(CloudInverterDeviceBean deviceBean) {
        try {
            if (deviceBean == null) {
                return;
@@ -446,12 +403,26 @@
                    cloudCallBeak.onSuccess(true);
                    //临时的逻辑,上传oid列表到云端
                    List<GatewayBean> list = HdlDeviceLogic.getInstance().getCurrentHomeGatewayList(homeId);
                    uploadOidDataToCloud(UserConfigManage.getInstance().getHomeId(), list, true, null);
                    uploadOidDataToCloud(homeId, list, true, null);
                }
            }
            @Override
            public void onFailure(HDLException e) {
                //添加逆变器失败后初始化逆变器
                HdlLogLogic.print("添加逆变器失败后开始初始化逆变器-->", true);
                HdlDeviceLogic.getInstance().initializeInverter(mac, new LinkCallBack<Boolean>() {
                    @Override
                    public void onSuccess(Boolean obj) {
                        HdlLogLogic.print("初始化逆变器成功-->mac:" + mac, true);
                    }
                    @Override
                    public void onError(HDLLinkException e) {
                        HdlLogLogic.print("初始化逆变器失败-->mac:" + mac, true);
                    }
                });
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(e);
                }
@@ -496,9 +467,27 @@
            @Override
            public void onFailure(HDLException e) {
                //添加逆变器失败后初始化逆变器
                HdlLogLogic.print("添加逆变器失败后开始初始化逆变器-->", true);
                for (int i = 0; i < list.size(); i++) {
                    GatewayBean gatewayBean = list.get(i);
                    HdlDeviceLogic.getInstance().initializeInverter(gatewayBean.getDevice_mac(), new LinkCallBack<Boolean>() {
                        @Override
                        public void onSuccess(Boolean obj) {
                            HdlLogLogic.print("初始化逆变器成功-->mac:" + gatewayBean.getDevice_mac(), true);
                        }
                        @Override
                        public void onError(HDLLinkException e) {
                            HdlLogLogic.print("初始化逆变器失败-->mac:" + gatewayBean.getDevice_mac(), true);
                        }
                    });
                }
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(e);
                }
            }
        });
    }
@@ -1010,7 +999,7 @@
     * @param cloudCallBeak 返回逆变器列表
     */
    public void getCurrentHomeLocalAndCloudGatewayList(String homeId, CloudCallBeak<List<GatewayBean>> cloudCallBeak) {
        HdlDeviceLogic.getInstance().searchCurrentHomeGateway(new GatewayCallBack() {
        HdlDeviceLogic.getInstance().searchCurrentHomeGateway(homeId,new GatewayCallBack() {
            @Override
            public void onSuccess(List<GatewayBean> gatewayBeanList) {
                //局域网有2种情况(1:有局域网,有外网;2:有局域网,没有外网);
@@ -1018,73 +1007,7 @@
                    @Override
                    public void onSuccess(List<CloudInverterDeviceBean> list) {
                        ///情况1:有局域网,有外网;
                        if (list == null || list.size() == 0) {
                            //云端没有绑定逆变器,默认返回本地逆变器列表;
                            if (cloudCallBeak != null) {
                                cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                            }
                            return;
                        }
                        //记录条数
                        AtomicInteger atomicInteger = new AtomicInteger(0);
                        for (int i = 0; i < list.size(); i++) {
                            CloudInverterDeviceBean cloudInverterDeviceBean = list.get(i);
                            //获取远程设备通讯信息(拿到网关ID,mqtt通讯秘钥)
                            getDeviceRemoteInfo(homeId, cloudInverterDeviceBean.getSpk(), cloudInverterDeviceBean.getOsn(), new CloudCallBeak<DeviceRemoteInfo>() {
                                @Override
                                public void onSuccess(DeviceRemoteInfo deviceRemoteInfo) {
                                    atomicInteger.set(atomicInteger.get() + 1);
                                    //更新逆变器本地缓存信息
                                    refreshGatewayCacheData(true, cloudInverterDeviceBean, deviceRemoteInfo, homeId);
                                    //最后一条才做删除逆变器逻辑处理
                                    if (atomicInteger.get() == list.size()) {
                                        //收集删除逆变器sid
                                        List<String> removeSidList = new ArrayList<>();
                                        for (int j = 0; j < HDLLinkLocalGateway.getInstance().getGatewayList().size(); j++) {
                                            GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayList().get(j);
                                            if (!querySidInverter(list, gatewayBean.getSid())) {
                                                //本地有,云端没有,删除本地;
                                                removeSidList.add(gatewayBean.getSid());
                                            }
                                        }
                                        for (int i = 0; i < removeSidList.size(); i++) {
                                            //删除本地的逆变器
                                            removeLocalInverter(removeSidList.get(i));
                                        }
                                        if (cloudCallBeak != null) {
                                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                                        }
                                    }
                                }
                                @Override
                                public void onFailure(HDLException e) {
                                    atomicInteger.set(atomicInteger.get() + 1);
                                    //当最后一条请求失败了,才在这里做删除逆变器逻辑处理
                                    if (atomicInteger.get() == list.size()) {
                                        //收集删除逆变器sid
                                        List<String> removeSidList = new ArrayList<>();
                                        for (int j = 0; j < HDLLinkLocalGateway.getInstance().getGatewayList().size(); j++) {
                                            GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayList().get(j);
                                            if (!querySidInverter(list, gatewayBean.getSid())) {
                                                //本地有,云端没有,删除本地;
                                                removeSidList.add(gatewayBean.getSid());
                                            }
                                        }
                                        for (int i = 0; i < removeSidList.size(); i++) {
                                            //删除本地的逆变器
                                            removeLocalInverter(removeSidList.get(i));
                                        }
                                        if (cloudCallBeak != null) {
                                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                                        }
                                    }
                                    HdlLogLogic.print("获取设备远程通讯信息失败->msg->" + e.getMsg() + "(" + e.getCode() + ")");
                                }
                            });
                        }
                        setDeviceRemoteInfo(list, homeId, cloudCallBeak);
                    }
                    @Override
@@ -1106,50 +1029,7 @@
                    public void onSuccess(List<CloudInverterDeviceBean> list) {
                        //外网进来先【默认】清空本地逆变器列表
                        HDLLinkLocalGateway.getInstance().getGatewayList().clear();
                        if (list == null || list.size() == 0) {
                            if (cloudCallBeak != null) {
                                //云端也没有逆变器列表,返回空列表回去
                                cloudCallBeak.onSuccess(new ArrayList<>());
                            }
                            HdlLogLogic.print("在只有【外网】情况下获取云端逆变器列表返回空列表", true);
                            return;
                        }
                        //记录条数
                        AtomicInteger atomicInteger = new AtomicInteger(0);
                        for (int i = 0; i < list.size(); i++) {
                            CloudInverterDeviceBean cloudInverterDeviceBean = list.get(i);
                            //获取远程设备通讯信息(拿到网关ID,mqtt通讯秘钥)
                            getDeviceRemoteInfo(homeId, cloudInverterDeviceBean.getSpk(), cloudInverterDeviceBean.getOsn(), new CloudCallBeak<DeviceRemoteInfo>() {
                                @Override
                                public void onSuccess(DeviceRemoteInfo deviceRemoteInfo) {
                                    atomicInteger.set(atomicInteger.get() + 1);
                                    //更新逆变器本地缓存信息
                                    refreshGatewayCacheData(false, cloudInverterDeviceBean, deviceRemoteInfo, homeId);
                                    //到最后一条,才有回调
                                    if (atomicInteger.get() == list.size()) {
                                        if (cloudCallBeak != null) {
                                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                                        }
                                    }
                                }
                                @Override
                                public void onFailure(HDLException e) {
                                    atomicInteger.set(atomicInteger.get() + 1);
                                    //当最后一条请求失败了,才有回调
                                    if (atomicInteger.get() == list.size()) {
                                        if (cloudCallBeak != null) {
                                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                                        }
                                    }
                                    HdlLogLogic.print("获取设备远程通讯信息失败---msg---" + e.getMsg() + "(" + e.getCode() + ")");
                                }
                            });
                        }
                        setDeviceRemoteInfo(list, homeId, cloudCallBeak);
                    }
                    @Override
@@ -1161,6 +1041,56 @@
                });
            }
        });
    }
    /**
     * 设置设备的远程信息(拿到网关ID,mqtt通讯秘钥等信息)
     *
     * @param list          云端上的逆变器列表
     * @param homeId        住宅id
     * @param cloudCallBeak 回调
     */
    public void setDeviceRemoteInfo(List<CloudInverterDeviceBean> list, String homeId, CloudCallBeak<List<GatewayBean>> cloudCallBeak) {
        if (list == null || list.size() == 0) {
            //云端没有绑定逆变器,默认返回本地逆变器列表;
            if (cloudCallBeak != null) {
                cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
            }
            return;
        }
        AtomicInteger atomicInteger = new AtomicInteger(0);
        for (int i = 0; i < list.size(); i++) {
            CloudInverterDeviceBean cloudInverterDeviceBean = list.get(i);
            //获取远程设备通讯信息(拿到网关ID,mqtt通讯秘钥)
            getDeviceRemoteInfo(homeId, cloudInverterDeviceBean.getSpk(), cloudInverterDeviceBean.getOsn(), new CloudCallBeak<DeviceRemoteInfo>() {
                @Override
                public void onSuccess(DeviceRemoteInfo deviceRemoteInfo) {
                    atomicInteger.set(atomicInteger.get() + 1);
                    //更新逆变器本地缓存信息
                    refreshGatewayCacheData(false, cloudInverterDeviceBean, deviceRemoteInfo, homeId);
                    //到最后一条,才有回调
                    if (atomicInteger.get() == list.size()) {
                        if (cloudCallBeak != null) {
                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                        }
                    }
                }
                @Override
                public void onFailure(HDLException e) {
                    atomicInteger.set(atomicInteger.get() + 1);
                    //当最后一条请求失败了,才有回调
                    if (atomicInteger.get() == list.size()) {
                        if (cloudCallBeak != null) {
                            cloudCallBeak.onSuccess(getCurrentHomeGatewayList(homeId));
                        }
                    }
                    HdlLogLogic.print("获取设备远程通讯信息失败---msg---" + e.getMsg() + "(" + e.getCode() + ")");
                }
            });
        }
    }
    /**
@@ -1271,10 +1201,10 @@
     *
     * @param gatewayCallBack -
     */
    public void searchCurrentHomeGateway(GatewayCallBack gatewayCallBack) {
    public void searchCurrentHomeGateway(String homeId,GatewayCallBack gatewayCallBack) {
        List<String> spks = this.getGatewaySpk();
        //网关搜索
        HDLLinkLocalGateway.getInstance().refreshGatewayByHomeIdAndSpk(UserConfigManage.getInstance().getHomeId(), spks, true, gatewayCallBack);
        HDLLinkLocalGateway.getInstance().refreshGatewayByHomeIdAndSpk(homeId, spks, true, gatewayCallBack);
    }
    /**
@@ -1295,8 +1225,8 @@
     * @param deviceMac 设备mac,
     * @param callBeak  返回 true=本地连接;false=远程;
     */
    public void isLocalConnect(String deviceMac, CloudCallBeak<Boolean> callBeak) {
        searchCurrentHomeGateway(new GatewayCallBack() {
    public void isLocalConnect(String homeId,String deviceMac, CloudCallBeak<Boolean> callBeak) {
        searchCurrentHomeGateway(homeId,new GatewayCallBack() {
            @Override
            public void onSuccess(List<GatewayBean> gatewayBeanList) {
                if (gatewayBeanList == null || gatewayBeanList.size() == 0) {
@@ -1382,12 +1312,9 @@
    }
    /**
     * 刷新逆变器缓存信息(包括设置mqtt秘钥)
     * 注:
     * 注: //目的是为了获取拿到网关ID,mqtt通讯秘钥等信息,缓存本地逆变器列表里面,发送数据数据时自动去缓存列表里面去查找;
     * 1:本地存在,更新信息即可;
     * 2:本地不存在,则虚拟一个逆变器对象添加在本地;
     *
@@ -1424,6 +1351,7 @@
        gatewayBean.setSystemStatusDesc(cloudInverterDeviceBean.getSystemStatusDesc());//设备状态
        gatewayBean.setHwVersion(cloudInverterDeviceBean.getHwVersion());//软件版本号
        gatewayBean.setCategorySecondName(cloudInverterDeviceBean.getCategorySecondName());//设备类型(产品二级分类名称
        gatewayBean.setDeviceType(cloudInverterDeviceBean.getDeviceType());//设备类型(INV:逆变器;BMS:BMS控制盒;BATTERY:电池单元)
        gatewayBean.setAddresses(cloudInverterDeviceBean.getAddresses());//子网号/设备号,逆变器地址
        gatewayBean.setPowerPvNow(cloudInverterDeviceBean.getPowerPvNow());//发电功率
        gatewayBean.setTotalElectricityPvToday(cloudInverterDeviceBean.getTotalElectricityPvToday());//今日发电量