| | |
| | | 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.AuthenticateRequest; |
| | | 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. |
| | |
| | | /** |
| | | * instance |
| | | */ |
| | | private volatile static HDLLink instance; |
| | | private static final HDLLink instance = new HDLLink(); |
| | | |
| | | private String appKey, appSecret; |
| | | public DeleteNetworkListener listener; |
| | | |
| | | /** |
| | | * getInstance |
| | | * |
| | | * @return HDLLink |
| | | */ |
| | | public static synchronized HDLLink getInstance() { |
| | | if (instance == null) { |
| | | synchronized (HDLLink.class) { |
| | | if (instance == null) { |
| | | instance = new 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){ |
| | | 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(){ |
| | | 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 request 认证请求信息 |
| | | * @param callBack 结果回调 |
| | | */ |
| | | public void sendAuthenticateRequest(String ip, AuthenticateRequest request, HDLAuthSocket.CallBack callBack) { |
| | | HDLAuthSocket.getInstance().sendAuthenticateRequest(ip,request,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); |
| | | } |
| | | } |