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.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); } /** * 开始监听和发起入网及认证请求 * * @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 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 sids, HDLLinkCallBack callBack) { HDLSocket.getInstance().getFunctionAttribute(sids, callBack); } /** * 设备控制 * * @param request 控制状态参数 * @param callBack 结果回调 */ public void propertyDown(List request, HDLLinkCallBack callBack) { HDLSocket.getInstance().propertyDown(request, callBack); } /** * 读取状态 * * @param sids 请求参数 指定读取的设备sid列表 * @param callBack 回调 */ public void propertyRead(List 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 sids, HDLLinkCallBack callBack) { HDLSocket.getInstance().getScene(sids, callBack); } /** * 场景控制 * * @param sids 场景sid列表 * @param callBack 回调 */ public void controlScene(List 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); } /** * 通用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); } }