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.ListSidRequest;
|
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;
|
import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
|
import com.hdl.sdk.connect.socket.HDLAuthSocket;
|
import com.hdl.sdk.connect.socket.HDLSocket;
|
|
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.
|
*
|
* @Description : HDLLink
|
*/
|
public class HDLLink {
|
/**
|
* instance
|
*/
|
private static final HDLLink instance = new HDLLink();
|
|
private String appKey, appSecret;
|
public DeleteNetworkListener listener;
|
|
/**
|
* getInstance
|
*
|
* @return HDLLink
|
*/
|
public static HDLLink getInstance() {
|
// if (instance == null) {
|
// synchronized (HDLLink.class) {
|
// if (instance == null) {
|
// instance = new HDLLink();
|
// }
|
// }
|
// }
|
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) {
|
EventDispatcher.getInstance().registerAllTopicsListener(listener);
|
}
|
|
/**
|
* 取消所有主题消息的监听
|
*
|
* @param listener
|
*/
|
public synchronized void removeAllTopicsListener(EventListener listener) {
|
if (listener == null) return;
|
EventDispatcher.getInstance().removeAllTopicsListener(listener);
|
}
|
|
/**
|
* 注册退网主题的监听
|
*
|
* @param listener
|
*/
|
public synchronized void setDeleteNetworkListener(DeleteNetworkListener listener) {
|
this.listener = listener;
|
}
|
|
/***********************三方设备和网关通信之前的认证流程****************************/
|
/**
|
* 检测是否已经认证过
|
* 认证通过才能进行设备控制
|
*
|
* @return
|
*/
|
public boolean checkIfCertified() {
|
return HDLLinkConfig.getInstance().checkIfCertified();
|
}
|
|
public void selectNetwork(String networkName) {
|
HDLLinkConfig.getInstance().setNetworkName(networkName);
|
}
|
|
public String getParentOid() {
|
return HDLLinkConfig.getInstance().getParentOid();
|
}
|
|
/**
|
* 开始监听和发起入网及认证请求
|
*
|
* @param request 认证请求信息
|
* @param callBack 结果回调
|
*/
|
public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
|
LogUtils.i("发送认证请求");
|
HDLAuthSocket.getInstance().startAuthenticateRequest(request, callBack);
|
}
|
|
/**
|
* 发送入网及认证请求
|
*
|
* @param ip 网关IP
|
* @param request 认证请求信息
|
* @param callBack 结果回调
|
*/
|
public void sendAuthenticateRequest(String ip, AuthenticateRequest request, HDLLinkCallBack callBack) {
|
HDLAuthSocket.getInstance().sendAuthenticateRequest(ip, request, callBack);
|
}
|
|
/**
|
* 入网认证结果反馈
|
*
|
* @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 回调
|
*/
|
public void searchGatewayMulticast(HDLAuthSocket.SearchGatewayCallBack callBack) {
|
HDLAuthSocket.getInstance().searchGatewayMulticast(callBack);
|
}
|
|
/**
|
* 组播搜索指定网关是否在线,搜索到则返回指定的网关对象
|
*
|
* @param callBack 回调
|
*/
|
public void searchGatewayBroadcast(HDLAuthSocket.SearchGatewayCallBack callBack) {
|
HDLAuthSocket.getInstance().searchGatewayBroadcast(callBack);
|
}
|
|
/**
|
* 获取设备列表
|
*/
|
public void getDeviceList(HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().getDeviceList(callBack);
|
}
|
|
/**
|
* 获取功能列表
|
*/
|
public void getFunctionList(HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().getFunctionList(callBack);
|
}
|
|
/**
|
* 获取功能属性
|
*
|
* @param sids
|
* @param callBack
|
*/
|
public void getFunctionAttribute(List<String> sids, HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().getFunctionAttribute(sids, callBack);
|
}
|
|
/**
|
* 设备控制
|
*
|
* @param request 控制状态参数
|
* @param callBack 结果回调
|
*/
|
public void propertyDown(List<DeviceControlRequest> request, HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().propertyDown(request, callBack);
|
}
|
|
/**
|
* 读取状态
|
*
|
* @param sids 请求参数 指定读取的设备sid列表
|
* @param callBack 回调
|
*/
|
public void propertyRead(List<String> sids, HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().propertyRead(sids, callBack);
|
}
|
|
/**
|
* 获取场景列表
|
*/
|
public void getSceneList(HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().getSceneList(callBack);
|
}
|
|
/**
|
* 场景详情
|
*
|
* @param sids 场景sid列表
|
* @param callBack 回调
|
*/
|
public void getScene(List<String> sids, HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().getScene(sids, callBack);
|
}
|
|
/**
|
* 场景控制
|
*
|
* @param sids 场景sid列表
|
* @param callBack 回调
|
*/
|
public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().controlScene(sids, callBack);
|
}
|
|
/**
|
* 上报oid列表
|
*
|
* @param request 设备信息
|
* @param callBack 回调
|
*/
|
public void UploadOidList(ListUploadRequest request, HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().UploadOidList(request, callBack);
|
}
|
|
/**
|
* 上报sid列表
|
*
|
* @param requestList sid列表
|
* @param callBack 回调
|
*/
|
public void UploadSidList(List<ListSidRequest> requestList, HDLLinkCallBack callBack) {
|
HDLSocket.getInstance().UploadSidList(requestList, callBack);
|
}
|
|
/**
|
* 通用UDP发送指令
|
* 1秒没响应就让他重新发送,重试3次
|
*
|
* @param topic 发送数据
|
* @param bodyStr body内容
|
* @param callBack 回调
|
*/
|
public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
|
HDLAuthSocket.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) {
|
HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true, callBack);
|
}
|
|
/**
|
* 通用TCP发送指令
|
* 1秒没响应就让他重新发送,重试3次
|
*
|
* @param topic 发送数据
|
* @param bodyStr body内容
|
* @param callBack 回调
|
*/
|
public void tcpSendMsg(String topic, String bodyStr, HDLLinkCallBack callBack) {
|
HDLAuthSocket.getInstance();//通过这个可以先初始化UDP监听事件
|
HDLSocket.getInstance().tcpSendMsg(topic, bodyStr, callBack);
|
}
|
|
/**
|
* 通用发送指令 只发一次,不监听回复,不重发
|
*
|
* @param topic 发送数据
|
* @param bodyStr 回复的主题
|
*/
|
public void udpSendMsg(String topic, String bodyStr) {
|
HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, false);
|
}
|
|
/**
|
* 通用广播发送指令 只发一次,不监听回复,不重发
|
*
|
* @param topic 发送数据
|
* @param bodyStr 回复的主题
|
*/
|
public void udpBroadcastSendMsg(String topic, String bodyStr) {
|
HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true);
|
}
|
|
/**
|
* 通用TCP发送指令 只发一次,不监听回复,不重发
|
*
|
* @param topic 发送数据
|
* @param bodyStr 回复的主题
|
*/
|
public void tcpSendMsg(String topic, String bodyStr) {
|
HDLAuthSocket.getInstance();//通过这个可以先初始化UDP监听事件
|
HDLSocket.getInstance().tcpSendMsg(topic, bodyStr);
|
}
|
}
|