wjc
2023-06-28 14de918a79943e4961b09fa01ed320c6cad41f2e
HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java
New file
@@ -0,0 +1,2407 @@
package com.hdl.sdk.link;
import android.content.Context;
import android.text.TextUtils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.hdl.sdk.link.bean.GatewayLocationBean;
import com.hdl.sdk.link.bean.LinkIrDeviceBean;
import com.hdl.sdk.link.bean.LinkOtaBean;
import com.hdl.sdk.link.bean.LinkSidNameBean;
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.ErrorUtils;
import com.hdl.sdk.link.common.utils.IdUtils;
import com.hdl.sdk.link.common.utils.LogUtils;
import com.hdl.sdk.link.common.utils.gson.GsonConvert;
import com.hdl.sdk.link.bean.LinkCreateLogicBean;
import com.hdl.sdk.link.bean.LinkCreateSceneBean;
import com.hdl.sdk.link.bean.LinkEnableLogicBean;
import com.hdl.sdk.link.bean.LinkEnableSecurityBean;
import com.hdl.sdk.link.bean.LinkFunctionBean;
import com.hdl.sdk.link.bean.LinkLogicBean;
import com.hdl.sdk.link.bean.LinkOidBean;
import com.hdl.sdk.link.bean.LinkReNameGWBean;
import com.hdl.sdk.link.bean.LinkRoomBean;
import com.hdl.sdk.link.bean.LinkRoomBindBean;
import com.hdl.sdk.link.bean.LinkSceneBean;
import com.hdl.sdk.link.bean.LinkSidStrBean;
import com.hdl.sdk.link.bean.LinkSidUidBean;
import com.hdl.sdk.link.core.bean.FileRequest;
import com.hdl.sdk.link.core.bean.LinkRequest;
import com.hdl.sdk.link.core.bean.LinkResponse;
import com.hdl.sdk.link.core.bean.request.AuthenticateRequest;
import com.hdl.sdk.link.core.bean.request.DeviceControlRequest;
import com.hdl.sdk.link.core.bean.request.FunctionAttributeRequest;
import com.hdl.sdk.link.core.bean.request.PropertyReadRequest;
import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
import com.hdl.sdk.link.core.bean.scenebatch.SceneCanDeleteInfo;
import com.hdl.sdk.link.core.bean.scenebatch.SceneGroupInfo;
import com.hdl.sdk.link.core.callback.GatewayCallBack;
import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
import com.hdl.sdk.link.core.callback.HDLLinkResponseCallBack;
import com.hdl.sdk.link.common.event.EventDispatcher;
import com.hdl.sdk.link.common.event.EventListener;
import com.hdl.sdk.link.core.callback.HDLLinkTCallBack;
import com.hdl.sdk.link.core.config.HDLLinkConfig;
import com.hdl.sdk.link.core.connect.HDLUdpConnect;
import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
import com.hdl.sdk.link.core.connect.HDLConnectHelper;
import com.hdl.sdk.link.core.utils.LinkResponseUtils;
import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
 * Created by jlchen on 11/15/21.
 *
 * @Description : HDLLink
 */
public class HDLLinkLocalSdk {
    /**
     * instance
     */
    private volatile static HDLLinkLocalSdk instance;
    /**
     * getInstance
     *
     * @return HDLLink
     */
    public static synchronized HDLLinkLocalSdk getInstance() {
        if (instance == null) {
            synchronized (HDLLinkLocalSdk.class) {
                if (instance == null) {
                    instance = new HDLLinkLocalSdk();
                }
            }
        }
        return instance;
    }
    private Context context;
    public void init(Context context) {
        this.context = context.getApplicationContext();
        String[] gatewayErrors = context.getResources().getStringArray(R.array.gateway);
        Map<String, String> codeAndMsgMap = new HashMap<>();
        for (String gatewayError : gatewayErrors) {
            String codeMsg[] = gatewayError.split("=");
            codeAndMsgMap.put(codeMsg[0], codeMsg[1]);
        }
        //初始化状态码多语言信息
        ErrorUtils.errorsMap.putAll(codeAndMsgMap);
    }
    public Context getContext() {
        return context;
    }
    public boolean isZh() {
        Locale locale = getContext().getResources().getConfiguration().locale;
        String language = locale.getLanguage();
        if (language.endsWith("zh"))
            return true;
        else
            return false;
    }
    /**
     * 设置打印是否开启
     *
     * @param enable
     */
    public void setLogEnabled(boolean enable) {
        LogUtils.setEnabled(enable);
    }
    /**
     * 注册所有主题消息的监听
     *
     * @param listener
     */
    public synchronized void registerAllTopicsListener(EventListener listener) {
        EventDispatcher.getInstance().registerAllTopicsListener(listener);
    }
    /**
     * 取消所有主题消息的监听
     *
     * @param listener
     */
    public synchronized void removeAllTopicsListener(EventListener listener) {
        if (listener == null) return;
        EventDispatcher.getInstance().removeAllTopicsListener(listener);
    }
    /***********************三方设备和网关通信之前的认证流程****************************/
    /**
     * 检测是否已经认证过
     * 认证通过才能进行设备控制
     *
     * @return
     */
    public boolean checkIfCertified() {
        return HDLLinkConfig.getInstance().checkIfCertified();
    }
    /**
     * 开始监听和发起入网及认证请求
     *
     * @param request  认证请求信息
     * @param callBack 结果回调
     */
    public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
        HDLUdpConnect.getInstance().startAuthenticateRequest(request, callBack);
    }
    /**
     * 发送入网及认证请求
     *
     * @param ip       网关IP
     * @param request  认证请求信息
     * @param callBack 结果回调
     */
    public void sendAuthenticateRequest(String ip, AuthenticateRequest request, HDLLinkCallBack callBack) {
        HDLUdpConnect.getInstance().sendAuthenticateRequest(ip, request, callBack);
    }
    /***********************三方设备请先认证成功 再调用下面的接口和网关通信****************************/
    /**
     * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象
     *
     * @param callBack 回调
     */
    public void searchGatewayMulticast(HDLUdpConnect.SearchGatewayCallBack callBack) {
        HDLUdpConnect.getInstance().searchGatewayMulticast(callBack);
    }
    /**
     * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象
     *
     * @param callBack 回调
     */
    public void searchGatewayBroadcast(HDLUdpConnect.SearchGatewayCallBack callBack) {
        HDLUdpConnect.getInstance().searchGatewayBroadcast(callBack);
    }
    /**
     * 获取设备列表
     */
    public void getDeviceList(HDLLinkTCallBack<List<LinkOidBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            String topic = String.format(TopicConstant.GET_DEVICE_LIST, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getDeviceList onSuccess");
                        Type type = new TypeToken<BaseLocalResponse<List<LinkOidBean>>>() {
                        }.getType();
                        List<LinkOidBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                        if (list == null) {
                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                        } else {
                            callBack.onSuccess(list);
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 红外宝/遥控器定位
     */
    public void locationIr(String sid, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            List<JSONObject> stringList = new ArrayList<>();
            JSONObject jsonObject1 = new JSONObject();
            jsonObject1.put("sid", sid);
            jsonObject1.put("duration_time", "5");
            stringList.add(jsonObject1);
            jsonObject.put("objects", stringList);
            String topic = String.format(TopicConstant.IR_FIND_REMOTE, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("locationIr onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 红外宝删除(采用link协议通知删除并退网子设备拓扑关系)
     */
    public void deleteLinkDevice(String oid, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            List<JSONObject> stringList = new ArrayList<>();
            JSONObject jsonObject1 = new JSONObject();
            jsonObject1.put("oid", oid);
            stringList.add(jsonObject1);
            jsonObject.put("objects", stringList);
            String topic = String.format(TopicConstant.DELETING_GATEWAY_SLAVE, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("deleteLinkDevice onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 遥控器删除(采用link协议通知删除并退网子设备拓扑关系)
     */
    public void deleteIrControlDevice(String sid, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            List<JSONObject> stringList = new ArrayList<>();
            JSONObject jsonObject1 = new JSONObject();
            jsonObject1.put("sid", sid);
            stringList.add(jsonObject1);
            jsonObject.put("objects", stringList);
            String topic = String.format(TopicConstant.DELETING_GATEWAY_SLAVE, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("deleteIrControlDevice onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 设备控制
     */
    public void controlDevice(Object object, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            List<Object> stringList = new ArrayList<>();
            stringList.add(object);
            jsonObject.put("objects", stringList);
            String topic = String.format(TopicConstant.PROPERTY_DOWN, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("controlDevice onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 更改主网关备注名
     */
    public void changeGWName(String gateWayName, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<LinkReNameGWBean> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            LinkReNameGWBean linkReNameGWBean = new LinkReNameGWBean();
            linkReNameGWBean.setDevice_name(gateWayName);
            data.setObjects(linkReNameGWBean);
            String topic = String.format(TopicConstant.GATEWAY_RENAME, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("changeGWName onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 更改从网关备注名
     */
    public void changeCongGWName(String gateWayName, String gatewayId, String ipAddress, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<LinkReNameGWBean> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            LinkReNameGWBean linkReNameGWBean = new LinkReNameGWBean();
            linkReNameGWBean.setDevice_name(gateWayName);
            data.setObjects(linkReNameGWBean);
            String topic = String.format(TopicConstant.GATEWAY_RENAME, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            request.setCloudTopic(String.format(TopicConstant.NATIVE_LINK_DOWN_SLAVE, HDLLinkConfig.getInstance().getGatewayId(), gatewayId));
            new HDLConnectHelper(ipAddress, request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("changeCongGWName onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * sid更改名字
     */
    public void sidNameChange(List<LinkSidNameBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidNameBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.EDIT_FUNCTION, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("sidNameChange onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * sid绑定房间
     */
    public void sidBindUid(List<LinkSidUidBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidUidBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SID_BIND_ROOM, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("sidBindUid onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * sid删除绑定房间关系
     */
    public void sidDeleteUid(List<LinkSidUidBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidUidBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SID_DELETE_ROOM, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("sidDeleteUid onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 创建场景
     */
    public void createScene(List<LinkCreateSceneBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkCreateSceneBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.CREATE_SCENE, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("createScene onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 编辑场景 批量处理组
     */
    public void editSceneBatchGroup(List<SceneGroupInfo> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<SceneGroupInfo>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SCENE_EDIT, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("editSceneBatchGroup onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 编辑场景 批量处理删除
     */
    public void editSceneBatchDelete(List<SceneCanDeleteInfo> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<SceneCanDeleteInfo>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SCENE_EDIT, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("editSceneBatchDelete onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 编辑场景
     */
    public void editScene(List<LinkCreateSceneBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkCreateSceneBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SCENE_EDIT, gatewayId);
            for (int i = 0; i < data.getObjects().size(); i++) {
                if (data.getObjects().get(i).getFunctions().size() == 0) {
                    data.getObjects().get(i).setFunctions(null);
                }
//                if (data.getObjects().get(i).getUids().size() == 0) {
//                    data.getObjects().get(i).setUids(null);
//                }
            }
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("editScene onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 删除场景
     */
    public void deleteScene(List<LinkSidStrBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SCENE_DELETE, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("deleteScene onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取自动化列表
     */
    public void getLogicList(HDLLinkTCallBack<List<LinkLogicBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            String topic = String.format(TopicConstant.LOGIC_LIST_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getLogicList onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkLogicBean>>>() {
                            }.getType();
                            List<LinkLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取自动化详情
     */
    public void getLogicDetail(List<LinkSidStrBean> list, HDLLinkTCallBack<List<LinkCreateLogicBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(list);
            String topic = String.format(TopicConstant.LOGIC_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getLogicDetail onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkCreateLogicBean>>>() {
                            }.getType();
                            List<LinkCreateLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 新建自动化
     */
    public void createLogic(List<LinkCreateLogicBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkCreateLogicBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.LOGIC_EDIT, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("createLogic onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 开启关闭自动化
     */
    public void enableLogic(List<LinkEnableLogicBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkEnableLogicBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.LOGIC_ENABLE_EDIT, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("enableLogic onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 删除自动化
     */
    public void deleteLogic(List<LinkSidStrBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.LOGIC_DELETE, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("deleteLogic onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 红外宝试码
     */
    public void irCodeTest(JSONObject content, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            JSONArray jsonArray = new JSONArray();
            jsonArray.add(content);
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            jsonObject.put("objects", jsonArray);
            String topic = String.format(TopicConstant.IR_CODE_TEST, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("irCodeTest onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 红外宝添加遥控器
     */
    public void irDeviceAdd(JSONObject content, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            JSONArray jsonArray = new JSONArray();
            jsonArray.add(content);
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            jsonObject.put("objects", jsonArray);
            String topic = String.format(TopicConstant.IR_DEVICE_ADD, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getSceneList onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 红外宝自学码
     */
    public void irCodeStudy(JSONObject content, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            JSONArray jsonArray = new JSONArray();
            jsonArray.add(content);
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            jsonObject.put("objects", jsonArray);
            String topic = String.format(TopicConstant.IR_CODE_STUDY, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("irCodeStudy onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 红外宝自学码删除
     */
    public void irCodeRemove(JSONObject content, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            JSONArray jsonArray = new JSONArray();
            jsonArray.add(content);
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            jsonObject.put("objects", jsonArray);
            String topic = String.format(TopicConstant.IR_CODE_REMOVE, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("irCodeRemove onSuccess");
                        callBack.onSuccess("");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 红外宝遥控器列表获取
     */
    public void irDeviceList(JSONObject content, HDLLinkTCallBack<List<LinkIrDeviceBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JSONObject jsonObject = new JSONObject();
            JSONArray jsonArray = new JSONArray();
            jsonArray.add(content);
            jsonObject.put("id", IdUtils.getUUId());
            jsonObject.put("time_stamp", time);
            jsonObject.put("objects", jsonArray);
            String topic = String.format(TopicConstant.IR_DEVICE_LIST, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("irDeviceList onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkIrDeviceBean>>>() {
                            }.getType();
                            List<LinkIrDeviceBean> response = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (response == null) {
                                callBack.onSuccess(new ArrayList<>());
                            } else {
                                callBack.onSuccess(response);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取安防列表
     */
    public void getSecurityList(HDLLinkTCallBack<List<LinkLogicBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            String topic = String.format(TopicConstant.SECURITY_LIST_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getSecurityList onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkLogicBean>>>() {
                            }.getType();
                            List<LinkLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取自动化详情
     */
    public void getSecurityDetail(List<LinkSidStrBean> list, HDLLinkTCallBack<List<LinkCreateLogicBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(list);
            String topic = String.format(TopicConstant.SECURITY_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getSecurityDetail onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkCreateLogicBean>>>() {
                            }.getType();
                            List<LinkCreateLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 新建安防
     */
    public void createSecurity(List<LinkCreateLogicBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkCreateLogicBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SECURITY_EDIT, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("createSecurity onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 删除安防
     */
    public void deleteSecurity(List<LinkSidStrBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SECURITY_DELETE, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("deleteSecurity onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 开启关闭自动化
     */
    public void enableSecurity(List<LinkEnableSecurityBean> bean, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkEnableSecurityBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.SECURITY_STATUS_SET, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("enableSecurity onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取功能列表
     */
    public void getFunctionList(HDLLinkTCallBack<List<LinkFunctionBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            String topic = String.format(TopicConstant.GET_FUNCTION_LIST, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getFunctionList onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkFunctionBean>>>() {
                            }.getType();
                            List<LinkFunctionBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 模拟云端ota
     */
    public void otaDeviceUpgradeDown(String oid, String module, HDLLinkTCallBack callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkOtaBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            List<LinkOtaBean> bean = new ArrayList<>();
            LinkOtaBean linkOtaBean = new LinkOtaBean();
            linkOtaBean.setOid(oid);
            linkOtaBean.setModule(module);
            linkOtaBean.setSize(291710);
            linkOtaBean.setSign_method("md5");
            linkOtaBean.setSign("05afc42e715b724e01b4ecd0ee2bde5d");
            linkOtaBean.setUrl("https://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2023/05/37886160-375a-4bf0-8a32-4093dac38679.ota");
            linkOtaBean.setVersion("V02.04.16");
            bean.add(linkOtaBean);
            data.setObjects(bean);
            String topic = String.format(TopicConstant.OTA_UPGRADE_DOWN, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getFunctionList onSuccess");
                        if (callBack != null) {
                            callBack.onSuccess("Success");
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 更改Sid备注名
     */
    public void editSidName(BaseLocalResponse<List<JsonObject>> data, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
//            LinkReNameGWBean linkReNameGWBean = new LinkReNameGWBean();
//            linkReNameGWBean.setDevice_name(sidName);
//            data.setObjects(linkReNameGWBean);
            String topic = String.format(TopicConstant.EDIT_FUNCTION_ATTRIBUTE, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("editSidName onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取功能属性
     * 支持批量
     *
     * @param sids
     * @param callBack
     */
    public void getFunctionAttribute(List<String> sids, HDLLinkTCallBack<List<LinkFunctionBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<FunctionAttributeRequest>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            List<FunctionAttributeRequest> list = new ArrayList<>();
            for (String s : sids) {
                list.add(new FunctionAttributeRequest(s));
            }
            data.setObjects(list);
            String topic = String.format(TopicConstant.GET_FUNCTION_ATTRIBUTE, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getFunctionAttribute onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkFunctionBean>>>() {
                            }.getType();
                            List<LinkFunctionBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 设备控制
     *
     * @param requestList 控制状态参数
     * @param callBack    结果回调
     */
    public void propertyDown(List<DeviceControlRequest> requestList, HDLLinkCallBack callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<DeviceControlRequest>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(requestList);
            String topic = String.format(TopicConstant.PROPERTY_DOWN, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("propertyDown onSuccess");
                        callBack.onSuccess(msg.toString());
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 读取状态
     *
     * @param sids     请求参数 指定读取的设备sid列表
     * @param callBack 回调
     */
    public void propertyRead(List<String> sids, HDLLinkCallBack callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<PropertyReadRequest>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            List<PropertyReadRequest> list = new ArrayList<>();
            for (String s : sids) {
                list.add(new PropertyReadRequest(s));
            }
            data.setObjects(list);
            String topic = String.format(TopicConstant.PROPERTY_READ, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("propertyRead onSuccess");
                        callBack.onSuccess(msg.toString());
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取场景列表
     */
    public void getSceneList(HDLLinkTCallBack<List<LinkSceneBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            String topic = String.format(TopicConstant.SCENE_LIST_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getSceneList onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkSceneBean>>>() {
                            }.getType();
                            List<LinkSceneBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取场景详情
     */
    public void getSceneDetail(List<LinkSidStrBean> list, HDLLinkTCallBack<List<LinkCreateSceneBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            data.setObjects(list);
            String topic = String.format(TopicConstant.SCENE_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getSceneDetail onSuccess");
                        if (callBack != null) {
                            Type type = new TypeToken<BaseLocalResponse<List<LinkCreateSceneBean>>>() {
                            }.getType();
                            List<LinkCreateSceneBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                            if (list == null) {
                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                            } else {
                                callBack.onSuccess(list);
                            }
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 场景控制
     *
     * @param sids     场景sid列表
     * @param callBack 回调
     */
    public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<PropertyReadRequest>> data = new BaseLocalResponse<>();
            data.setId(IdUtils.getUUId());
            data.setTime_stamp(time);
            List<PropertyReadRequest> list = new ArrayList<>();
            for (String s : sids) {
                list.add(new PropertyReadRequest(s));
            }
            data.setObjects(list);
            String topic = String.format(TopicConstant.SCENE_CONTROL, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("controlScene onSuccess");
                        callBack.onSuccess(msg.toString());
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 通用UDP发送指令
     * 1秒没响应就让他重新发送,重试3次
     *
     * @param topic    发送数据
     * @param bodyStr  body内容
     * @param callBack 回调
     */
    public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
        HDLUdpConnect.getInstance().udpSendMsg(topic, bodyStr, false, callBack);
    }
    /**
     * 通用广播UDP发送指令
     * 1秒没响应就让他重新发送,重试3次
     *
     * @param topic    发送数据
     * @param bodyStr  body内容
     * @param callBack 回调
     */
    public void udpBroadcastSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
        HDLUdpConnect.getInstance().udpSendMsg(topic, bodyStr, true, callBack);
    }
    /**
     * 通用TCP发送指令
     * 1秒没响应就让他重新发送,重试3次
     *
     * @param topic    发送数据
     * @param body     body内容
     * @param callBack 回调
     */
    public void tcpSendMsg(String topic, String body, HDLLinkCallBack callBack) {
        LinkRequest request = new LinkRequest(topic, body, HDLLinkConfig.getInstance().isLocalEncrypt());
        new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
            @Override
            public void onSucceed(Object msg) {
                if (msg instanceof LinkResponse) {
                    LogUtils.i("sendMsg onSuccess");
                    if (callBack != null) {
                        callBack.onSuccess(msg.toString());
                    }
                }
            }
            @Override
            public void onFailure(HDLLinkCode hdlLinkCode) {
                if (callBack != null) {
                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                }
            }
        }, true).send();
    }
    /**
     * 通用TCP发送指令 只发一次,不监听回复,不重发
     *
     * @param topic 发送数据
     * @param body  回复的主题
     */
    public void tcpSendMsg(String topic, String body) {
        LinkRequest request = new LinkRequest(topic, body, HDLLinkConfig.getInstance().isLocalEncrypt());
        new HDLConnectHelper(1, HDLLinkConfig.getInstance().getIpAddress(), request, true);
    }
    /**
     * 创新网关列表,重新读取
     *
     * @param homeId   住宅Id
     * @param callBack 回调所有读取到的网关列表
     */
    public void refreshGatewayByHome(String homeId, GatewayCallBack callBack) {
        HDLLinkLocalGateway.getInstance().refreshGatewayByHome(homeId, callBack);
    }
    /**
     * 创新网关列表,重新读取
     *
     * @param callBack 回调所有读取到的网关列表
     */
    public void refreshGateway(GatewayCallBack callBack) {
        HDLLinkLocalGateway.getInstance().refreshGateway(callBack);
    }
    /**
     * 获取当前住宅缓存的所有网关,一般是调试软件使用,三方不用调试此方法
     * 如果之前还没有读取过网关,先调用方法refreshGatewayByHome读取一次
     *
     * @return
     */
    public List<GatewayBean> getGatewayByHome() {
        return HDLLinkLocalGateway.getInstance().getGatewayList();
    }
    /**
     * 获取房间列表
     *
     * @param callBack
     */
    public void getRoomList(HDLLinkTCallBack<List<LinkRoomBean>> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            String topic = String.format(TopicConstant.ROOM_LIST_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getRoomList onSuccess");
                        Type type = new TypeToken<BaseLocalResponse<List<LinkRoomBean>>>() {
                        }.getType();
                        List<LinkRoomBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                        if (list == null) {
                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                        } else {
                            callBack.onSuccess(list);
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 全量更新房间列表
     *
     * @param list
     * @param callBack
     */
    public void coverAddRoomList(List<LinkRoomBean> list, HDLLinkCallBack callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            final BaseLocalResponse<List<LinkRoomBean>> senData = new BaseLocalResponse<>();
            senData.setId(IdUtils.getUUId());
            senData.setTime_stamp(time);
            senData.setObjects(list);
            String topic = String.format(TopicConstant.ROOM_COVER_ADD, gatewayId);
            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(senData), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("coverAddRoomList onSuccess");
                        callBack.onSuccess(msg.toString());
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 获取房间绑定关系
     */
    public void getRoomBindList(HDLLinkTCallBack<List<LinkRoomBindBean>> callBack, List<String> uidRoomList) {
        if (null == callBack) {
            return;
        }
        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            JsonArray array = new JsonArray();
            for (String uid : uidRoomList) {
                array.add(uid);
            }
            jsonObject.add("objects", array);
            String topic = String.format(TopicConstant.ROOM_BIND_LIST_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getRoomBindList onSuccess");
                        Type type = new TypeToken<BaseLocalResponse<List<LinkRoomBindBean>>>() {
                        }.getType();
                        List<LinkRoomBindBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
                        if (list == null) {
                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                        } else {
                            callBack.onSuccess(list);
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 读取网关经纬度
     */
    public void getGatewayLocation(String gatewayId, HDLLinkTCallBack<GatewayLocationBean> callBack) {
        if (null == callBack) {
            return;
        }
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            String topic = String.format(TopicConstant.GATEWAY_LOCATION_GET, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getGatewayLocation onSuccess");
                        Type type = new TypeToken<BaseLocalResponse<GatewayLocationBean>>() {
                        }.getType();
                        GatewayLocationBean list = LinkResponseUtils.convertLinkResponse(msg, type);
                        if (list == null) {
                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
                        } else {
                            callBack.onSuccess(list);
                        }
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 设置网关经纬度
     */
    public void gatewayLocation(GatewayBean bean, String longitude, String lat, HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = bean.getGatewayId();
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            JsonObject jsonObject1 = new JsonObject();
            jsonObject1.addProperty("longitude", longitude);
            jsonObject1.addProperty("latitude", lat);
            jsonObject.add("objects", jsonObject1);
            String topic = String.format(TopicConstant.GATEWAY_LOCATION_EDIT, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("getRoomBindList onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /**
     * 刚刚绑定网关的时候设置网关经纬度  不需要加密
     */
    public void gatewayLocation(String mGatewayId, String longitude, String lat, boolean isEncrypt,HDLLinkTCallBack<String> callBack) {
        if (null == callBack) {
            return;
        }
        String gatewayId = mGatewayId;
        if (!TextUtils.isEmpty(gatewayId)) {
            String time = String.valueOf(System.currentTimeMillis());
            JsonObject jsonObject = new JsonObject();
            jsonObject.addProperty("id", IdUtils.getUUId());
            jsonObject.addProperty("time_stamp", time);
            JsonObject jsonObject1 = new JsonObject();
            jsonObject1.addProperty("longitude", longitude);
            jsonObject1.addProperty("latitude", lat);
            jsonObject.add("objects", jsonObject1);
            String topic = String.format(TopicConstant.GATEWAY_LOCATION_EDIT, gatewayId);
            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), isEncrypt);
            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
                @Override
                public void onSucceed(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.i("gatewayLocation onSuccess");
                        callBack.onSuccess("Success");
                    }
                }
                @Override
                public void onFailure(HDLLinkCode hdlLinkCode) {
                    if (callBack != null) {
                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                    }
                }
            }, true).send();
        } else {
            if (callBack != null) {
                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
            }
        }
    }
    /*********************** 文件传输 ****************************/
    /**
     * 文件用途通知
     *
     * @param fileId   文件Id
     * @param fileName 文件名称
     * @param purpose  用途 用途枚举
     *                 zigbee设备配置恢复: ConfigRecoveryForZigbeeDevices
     *                 数据备份:DataBackup
     *                 数据恢复:DataRecovery
     * @param callBack
     */
    public void sendFileUserNotification(String fileId, String fileName, String purpose, HDLLinkCallBack callBack) {
        //帧格式:head+命令字+数据长度+二进制数据
        String time = String.valueOf(System.currentTimeMillis());
        String data = "hex" + "0001" + fileId + "\r\n" + fileName + "\r\n" + purpose;
        byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
        FileRequest linkRequest = new FileRequest(fileId, 0x0011, dataBytes, HDLLinkConfig.getInstance().isLocalEncrypt());
        linkRequest.setReplyTopic(linkRequest.getAckTopic());
        new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), linkRequest, new HDLConnectHelper.HdlSocketListener() {
            @Override
            public void onSucceed(Object msg) {
            }
            @Override
            public void onFailure(HDLLinkCode hdlLinkCode) {
            }
        }, true).send();
    }
    /**
     * 发送文件相关命令
     */
    public void sendFileCommand(byte[] dataBytes, Integer command, HDLLinkCallBack callBack) {
        //帧格式:head+命令字+数据长度+二进制数据
        String time = String.valueOf(System.currentTimeMillis());
//        byte []dataBytes=data.getBytes(StandardCharsets.UTF_8);
        FileRequest linkRequest = new FileRequest("65531", command, dataBytes, HDLLinkConfig.getInstance().isLocalEncrypt());
        linkRequest.setReplyTopic(linkRequest.getAckTopic());
        linkRequest.setCloudTopic(String.format(TopicConstant.NATIVE_LINK_DOWN, HDLLinkConfig.getInstance().getGatewayId()));
        new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), linkRequest, new HDLConnectHelper.HdlSocketListener() {
            @Override
            public void onSucceed(Object msg) {
            }
            @Override
            public void onFailure(HDLLinkCode hdlLinkCode) {
            }
        }, true).send();
    }
    /********************************驱动升级***********************************/
    /**
     * 发送文件相关命令
     */
    public void sendFileCommand(String ipAddress, byte[] dataBytes, String fileId, Integer command, HDLLinkCallBack callBack) {
        //帧格式:head+命令字+数据长度+二进制数据
        FileRequest linkRequest = new FileRequest(fileId, command, dataBytes, HDLLinkConfig.getInstance().isLocalEncrypt());
        linkRequest.setReplyTopic(linkRequest.getAckTopic());
        new HDLConnectHelper(ipAddress, linkRequest, new HDLConnectHelper.HdlSocketListener() {
            @Override
            public void onSucceed(Object msg) {
            }
            @Override
            public void onFailure(HDLLinkCode hdlLinkCode) {
            }
        }, true).send();
    }
}