562935844@qq.com
2023-08-31 fdcf461fbfa3bcd650685743e891ad3357898f0c
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
@@ -1,10 +1,22 @@
package com.hdl.sdk.connect;
import android.content.Context;
import com.hdl.hdlhttp.HxHttpConfig;
import com.hdl.sdk.common.event.DeleteNetworkListener;
import com.hdl.sdk.common.utils.LogUtils;
import com.hdl.sdk.common.utils.ThreadToolUtils;
import com.hdl.sdk.connect.bean.request.DeviceAuthRequest;
import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
import com.hdl.sdk.connect.bean.request.ListUploadRequest;
import com.hdl.sdk.connect.callback.HDLLinkCallBack;
import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
import com.hdl.sdk.connect.cloud.CallBackListener;
import com.hdl.sdk.connect.cloud.CheckAppVersionListener;
import com.hdl.sdk.connect.cloud.HdlCloudApi;
import com.hdl.sdk.connect.cloud.HdlCloudController;
import com.hdl.sdk.connect.cloud.interceptor.EncryptInterceptor;
import com.hdl.sdk.connect.cloud.interceptor.SmartHeaderInterceptor;
import com.hdl.sdk.connect.config.HDLLinkConfig;
import com.hdl.sdk.common.event.EventDispatcher;
import com.hdl.sdk.common.event.EventListener;
@@ -15,6 +27,9 @@
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.disposables.Disposable;
import okhttp3.logging.HttpLoggingInterceptor;
/**
 * Created by jlchen on 11/15/21.
 *
@@ -24,13 +39,17 @@
    /**
     * instance
     */
    private  static final HDLLink instance=new HDLLink();
    private static final HDLLink instance = new HDLLink();
    private String appKey, appSecret;
    public DeleteNetworkListener listener;
    /**
     * getInstance
     *
     * @return HDLLink
     */
    public static  HDLLink getInstance() {
    public static HDLLink getInstance() {
//        if (instance == null) {
//            synchronized (HDLLink.class) {
//                if (instance == null) {
@@ -41,30 +60,63 @@
        return instance;
    }
    public String getAppKey() {
        return appKey;
    }
    public void setAppKey(String appKey) {
        this.appKey = appKey;
    }
    public String getAppSecret() {
        return appSecret;
    }
    public void setAppSecret(String appSecret) {
        this.appSecret = appSecret;
    }
    /**
     * 注册所有主题消息的监听
     *
     * @param listener
     */
    public synchronized void registerAllTopicsListener(EventListener listener){
    public synchronized void registerAllTopicsListener(EventListener listener) {
        EventDispatcher.getInstance().registerAllTopicsListener(listener);
    }
    /**
     * 取消所有主题消息的监听
     *
     * @param listener
     */
    public synchronized void removeAllTopicsListener(EventListener listener) {
        if(listener == null) return;
        if (listener == null) return;
        EventDispatcher.getInstance().removeAllTopicsListener(listener);
    }
    /**
     * 注册退网主题的监听
     *
     * @param listener
     */
    public synchronized void setDeleteNetworkListener(DeleteNetworkListener listener) {
        this.listener = listener;
    }
    /***********************三方设备和网关通信之前的认证流程****************************/
    /**
     * 检测是否已经认证过
     * 认证通过才能进行设备控制
     *
     * @return
     */
    public boolean checkIfCertified(){
    public boolean checkIfCertified() {
        return HDLLinkConfig.getInstance().checkIfCertified();
    }
    public void selectNetwork(String networkName) {
        HDLLinkConfig.getInstance().setNetworkName(networkName);
    }
    /**
@@ -75,7 +127,7 @@
     */
    public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
        LogUtils.i("发送认证请求");
        HDLAuthSocket.getInstance().startAuthenticateRequest(request,callBack);
        HDLAuthSocket.getInstance().startAuthenticateRequest(request, callBack);
    }
    /**
@@ -89,26 +141,90 @@
        HDLAuthSocket.getInstance().sendAuthenticateRequest(ip, request, callBack);
    }
    //    /**
//     * 开始搜索所有网关,有网关回复就回调,上层自己做去重判断
//     *
//     * @param callBack 回调
//     */
//    public void startSearchAllGateway(HDLAuthSocket.SearchGatewayCallBack callBack) {
//
//    }
//
//    /**
//     * 暂停搜索网关
//     */
//    public void endSearchAllGateway() {
//
//    }
    /**
     * 入网认证结果反馈
     *
     * @param mac       mac
     * @param result    结果0/-1
     * @param message   认证信息
     * @param auth_code 云端认证code
     * @param callBack  结果回调
     */
    public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) {
        HDLSocket.getInstance().UploadDeviceAuth(mac, result, message, auth_code, callBack);
    }
    /**
     * 申请设备密钥(根据设备MAC)
     *
     * @param supplier 厂商
     * @param mac      设备mac
     * @param spk      设备spk
     * @param callBack 结果回调
     */
    public void applyDeviceSecret(Context context, String appKey, String appSecret, String supplier, String mac, String spk, CallBackListener callBack) {
        LogUtils.i("申请设备密钥");
        HxHttpConfig.getInstance().init(context, HdlCloudApi.BASE_CHINA_URL)
                .addInterceptor(
                        new EncryptInterceptor(),
                        new SmartHeaderInterceptor());
        this.appKey = appKey;
        this.appSecret = appSecret;
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.level(HttpLoggingInterceptor.Level.BODY);
        HxHttpConfig.getInstance()
                //.addInterceptor(new HttpCacheInterceptor())
                .addInterceptor(httpLoggingInterceptor).ignoreSSL();
        HdlCloudController.applyDeviceSecret(supplier, mac, spk, callBack);
    }
    /**
     * 检测更新
     *
     * @param appKey      appKey
     * @param appSecret   appSecret
     * @param versionCode 当前版本
     * @param appCode     appCode
     * @param listener    结果回调
     */
    public void checkAppVersion(Context context, String appKey, String appSecret, String versionCode, String appCode, CheckAppVersionListener listener) {
        LogUtils.i("检测更新");
        HxHttpConfig.getInstance().init(context, HdlCloudApi.BASE_CHINA_URL)
                .addInterceptor(
                        new EncryptInterceptor(),
                        new SmartHeaderInterceptor());
        this.appKey = appKey;
        this.appSecret = appSecret;
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.level(HttpLoggingInterceptor.Level.BODY);
        HxHttpConfig.getInstance()
                //.addInterceptor(new HttpCacheInterceptor())
                .addInterceptor(httpLoggingInterceptor).ignoreSSL();
        HdlCloudController.checkAppVersion(versionCode, appCode, listener);
    }
    /**
     * 通知删除并退网子设备
     *
     * @param oid      从网关(设备)oid
     * @param isForce  是否强制退网
     * @param callBack 结果回调
     */
    public void deleteNetwork(String oid, boolean isForce, HDLLinkCallBack callBack) {
        HDLSocket.getInstance().deleteNetwork(oid, isForce, callBack);
    }
    /***********************三方设备请先认证成功 再调用下面的接口和网关通信****************************/
    /**
     * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象
     * @param callBack  回调
     *
     * @param callBack 回调
     */
    public void searchGatewayMulticast(HDLAuthSocket.SearchGatewayCallBack callBack) {
        HDLAuthSocket.getInstance().searchGatewayMulticast(callBack);
@@ -116,7 +232,8 @@
    /**
     * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象
     * @param callBack  回调
     *
     * @param callBack 回调
     */
    public void searchGatewayBroadcast(HDLAuthSocket.SearchGatewayCallBack callBack) {
        HDLAuthSocket.getInstance().searchGatewayBroadcast(callBack);
@@ -148,7 +265,8 @@
    /**
     * 设备控制
     * @param request 控制状态参数
     *
     * @param request  控制状态参数
     * @param callBack 结果回调
     */
    public void propertyDown(List<DeviceControlRequest> request, HDLLinkCallBack callBack) {
@@ -157,7 +275,8 @@
    /**
     * 读取状态
     * @param sids 请求参数 指定读取的设备sid列表
     *
     * @param sids     请求参数 指定读取的设备sid列表
     * @param callBack 回调
     */
    public void propertyRead(List<String> sids, HDLLinkCallBack callBack) {
@@ -172,8 +291,19 @@
    }
    /**
     * 场景详情
     *
     * @param sids     场景sid列表
     * @param callBack 回调
     */
    public void getScene(List<String> sids, HDLLinkCallBack callBack) {
        HDLSocket.getInstance().getScene(sids, callBack);
    }
    /**
     * 场景控制
     * @param sids 场景sid列表
     *
     * @param sids     场景sid列表
     * @param callBack 回调
     */
    public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
@@ -181,25 +311,37 @@
    }
    /**
     * 上报oid列表
     *
     * @param request  设备信息
     * @param callBack 回调
     */
    public void UploadOidList(ListUploadRequest request, HDLLinkCallBack callBack) {
        HDLSocket.getInstance().UploadOidList(request, callBack);
    }
    /**
     * 通用UDP发送指令
     * 1秒没响应就让他重新发送,重试3次
     * @param topic 发送数据
     * @param bodyStr body内容
     *
     * @param topic    发送数据
     * @param bodyStr  body内容
     * @param callBack 回调
     */
    public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false, callBack);
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, false, callBack);
    }
    /**
     * 通用广播UDP发送指令
     * 1秒没响应就让他重新发送,重试3次
     * @param topic 发送数据
     * @param bodyStr body内容
     *
     * @param topic    发送数据
     * @param bodyStr  body内容
     * @param callBack 回调
     */
    public void udpBroadcastSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true, callBack);
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true, callBack);
    }
    /**
@@ -218,28 +360,28 @@
    /**
     * 通用发送指令 只发一次,不监听回复,不重发
     *
     * @param topic    发送数据
     * @param bodyStr  回复的主题
     * @param topic   发送数据
     * @param bodyStr 回复的主题
     */
    public void udpSendMsg(String topic, String bodyStr) {
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false);
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, false);
    }
    /**
     * 通用广播发送指令 只发一次,不监听回复,不重发
     *
     * @param topic    发送数据
     * @param bodyStr  回复的主题
     * @param topic   发送数据
     * @param bodyStr 回复的主题
     */
    public void udpBroadcastSendMsg(String topic, String bodyStr) {
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true);
        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true);
    }
    /**
     * 通用TCP发送指令 只发一次,不监听回复,不重发
     *
     * @param topic    发送数据
     * @param bodyStr  回复的主题
     * @param topic   发送数据
     * @param bodyStr 回复的主题
     */
    public void tcpSendMsg(String topic, String bodyStr) {
        HDLAuthSocket.getInstance();//通过这个可以先初始化UDP监听事件