| | |
| | | package com.hdl.sdk.connect.socket;
|
| | |
|
| | | import static com.hdl.sdk.connect.config.HDLLinkConfig.AUTHENTICATE_IS_DEVICEINFO_KEY;
|
| | |
|
| | | import android.os.Build;
|
| | | import android.text.TextUtils;
|
| | | import android.util.Log;
|
| | |
|
| | | import androidx.annotation.RequiresApi;
|
| | |
|
| | | import com.google.gson.JsonObject;
|
| | | import com.google.gson.reflect.TypeToken;
|
| | | import com.hdl.sdk.common.HDLSdk;
|
| | | import com.hdl.sdk.common.config.TopicConstant;
|
| | | import com.hdl.sdk.common.event.EventDispatcher;
|
| | | import com.hdl.sdk.common.event.EventListener;
|
| | |
| | | import com.hdl.sdk.common.utils.gson.GsonConvert;
|
| | | import com.hdl.sdk.connect.HDLLink;
|
| | | import com.hdl.sdk.connect.bean.LoginRequest;
|
| | | import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
|
| | | import com.hdl.sdk.connect.bean.request.BroadcastRequest;
|
| | | import com.hdl.sdk.connect.bean.request.DeviceAuthRequest;
|
| | | import com.hdl.sdk.connect.bean.request.GatewayInfoRequest;
|
| | | import com.hdl.sdk.connect.bean.request.ListOidRequest;
|
| | | import com.hdl.sdk.connect.bean.request.ListOidRequest2;
|
| | | import com.hdl.sdk.connect.bean.request.ListSidRequest;
|
| | | import com.hdl.sdk.connect.bean.request.ListUploadRequest;
|
| | | import com.hdl.sdk.connect.bean.response.AuthenticateResponse;
|
| | | import com.hdl.sdk.connect.bean.response.BaseLocalCodeResponse;
|
| | | import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
|
| | | import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
|
| | | import com.hdl.sdk.connect.bean.request.FunctionAttributeRequest;
|
| | |
| | | import com.hdl.sdk.connect.config.HDLLinkConfig;
|
| | | import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
|
| | | import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
|
| | | import com.hdl.sdk.connect.utils.AesUtil;
|
| | | import com.hdl.sdk.socket.SocketBoot;
|
| | | import com.hdl.sdk.socket.SocketOptions;
|
| | | import com.hdl.sdk.socket.client.IHeartbeat;
|
| | |
| | | import com.hdl.sdk.socket.listener.SendListener;
|
| | |
|
| | | import java.util.ArrayList;
|
| | | import java.util.Base64;
|
| | | import java.util.List;
|
| | | import java.util.concurrent.ScheduledExecutorService;
|
| | | import java.util.concurrent.TimeUnit;
|
| | |
| | |
|
| | | public boolean isBroadcast = false;
|
| | |
|
| | |
|
| | | /**
|
| | | * 广播自身信息给主网关
|
| | | */
|
| | |
| | | Thread.sleep(1000);
|
| | | // LogUtils.i("checkIfCertified=" + HDLLink.getInstance().checkIfCertified() + " getTcp().connected=" + getTcp().connected);
|
| | | try {
|
| | | if (!HDLLink.getInstance().checkIfCertified() || getTcp().connected) {
|
| | | if (!HDLLink.getInstance().checkIfCertified() || (!TextUtils.isEmpty(getTcpIp()) && getTcp().connected)) {
|
| | | continue;
|
| | | }
|
| | | } catch (Exception e) {
|
| | |
| | | }
|
| | | BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
|
| | | HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true, new HDLLinkResponseCallBack() {
|
| | | @RequiresApi(api = Build.VERSION_CODES.O)
|
| | | @Override
|
| | | public void onSuccess(LinkResponse msg) {
|
| | | getTcp();
|
| | | String data = msg.getData();
|
| | | if (!TextUtils.isEmpty(data)) {
|
| | | DeviceInfoResponse response = GsonConvert.getGson().fromJson(data, new TypeToken<DeviceInfoResponse>() {
|
| | | }.getType());
|
| | |
|
| | | if ((response == null) || (response.getObjects() == null) || (response.getObjects().getIPAddress() == null))
|
| | | return;
|
| | |
|
| | | HDLLinkConfig.getInstance().setIpAddress(response.getObjects().getIPAddress());
|
| | | LogUtils.i("---getIpAddress=" + HDLLinkConfig.getInstance().getIpAddress());
|
| | |
|
| | | HDLLinkConfig.getInstance().reSaveConfig();
|
| | | }
|
| | |
|
| | | isBroadcast = true;
|
| | | getTcp();
|
| | | LogUtils.i("广播信息给主网关成功!");
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError(HDLLinkException e) {
|
| | | isBroadcast = false;
|
| | | LogUtils.i("广播信息给主网关失败!");
|
| | | LogUtils.i("广播信息给主网关失败!---onError=" + e.toString());
|
| | | }
|
| | | });
|
| | | // HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
|
| | |
| | | jsonObject.addProperty("id", IdUtils.getUUId());
|
| | | jsonObject.addProperty("time_stamp", time);
|
| | |
|
| | | if (HDLLinkConfig.getInstance().getRequestBean() != null) {
|
| | | jsonObject.addProperty("mac", HDLLinkConfig.getInstance().getRequestBean().getMAC());
|
| | | }
|
| | |
|
| | | String topic = String.format(TopicConstant.HEARTBEAT, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID());
|
| | |
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | |
| | |
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | | jsonObject.toString());
|
| | | String replyTopic = topic + "_reply";
|
| | | try {
|
| | | sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | } catch (Exception e) {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
|
| | | }
|
| | | }
|
| | | } else {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 获取场景列表
|
| | | */
|
| | | public void getScene(List<String> sids, HDLLinkCallBack callBack) {
|
| | | if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
|
| | | 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_GET, getGatewayId());
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | | GsonConvert.getGson().toJson(data));
|
| | |
|
| | | String replyTopic = topic + "_reply";
|
| | | try {
|
| | | sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
|
| | |
| | | }
|
| | |
|
| | | /**
|
| | | * 上报oid列表
|
| | | *
|
| | | * @param request 设备信息
|
| | | * @param callBack 回调
|
| | | */
|
| | | public void UploadOidList(ListUploadRequest request, HDLLinkCallBack callBack) {
|
| | | if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | final BaseLocalResponse<List<ListUploadRequest>> data = new BaseLocalResponse<>();
|
| | | data.setId(IdUtils.getUUId());
|
| | | data.setTime_stamp(time);
|
| | |
|
| | | List<ListUploadRequest> list = new ArrayList<>();
|
| | | list.add(request);
|
| | |
|
| | | data.setObjects(list);
|
| | |
|
| | | String topic = String.format(TopicConstant.LIST_UPLOAD, getGatewayId());
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | | GsonConvert.getGson().toJson(data));
|
| | |
|
| | | String replyTopic = topic + "_reply";
|
| | | try {
|
| | | sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | } catch (Exception e) {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | } else {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 上报Sid列表
|
| | | *
|
| | | * @param requestList sid列表
|
| | | * @param callBack 回调
|
| | | */
|
| | | public void UploadSidList(List<ListSidRequest> requestList, HDLLinkCallBack callBack) {
|
| | | if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | final BaseLocalResponse<List<ListSidRequest>> data = new BaseLocalResponse<>();
|
| | | data.setId(IdUtils.getUUId());
|
| | | data.setTime_stamp(time);
|
| | |
|
| | | data.setObjects(requestList);
|
| | |
|
| | | String topic = String.format(TopicConstant.LIST_SID_UPLOAD, getGatewayId());
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | | GsonConvert.getGson().toJson(data));
|
| | |
|
| | | String replyTopic = topic + "_reply";
|
| | | try {
|
| | | sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | } catch (Exception e) {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | } else {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 上报入网认证结果
|
| | | *
|
| | | * @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) {
|
| | | if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | final BaseLocalResponse<List<DeviceAuthRequest>> data = new BaseLocalResponse<>();
|
| | | data.setId(IdUtils.getUUId());
|
| | | data.setTime_stamp(time);
|
| | |
|
| | | DeviceAuthRequest deviceAuthRequest = new DeviceAuthRequest();
|
| | | deviceAuthRequest.setMac(mac);
|
| | | deviceAuthRequest.setResult(result);
|
| | | deviceAuthRequest.setMessage(message);
|
| | | deviceAuthRequest.setAuth_code(auth_code);
|
| | |
|
| | | List<DeviceAuthRequest> list = new ArrayList<>();
|
| | | list.add(deviceAuthRequest);
|
| | |
|
| | | data.setObjects(list);
|
| | |
|
| | | String topic = String.format(TopicConstant.DEIVCE_AUTH_RESULT_NOTIFY, getGatewayId());
|
| | | LinkRequest linkRequest = new LinkRequest(topic,
|
| | | GsonConvert.getGson().toJson(data));
|
| | |
|
| | | String replyTopic = topic + "_reply";
|
| | | try {
|
| | | sendMsg(linkRequest.getSendBytes(), replyTopic, callBack, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | } catch (Exception e) {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | } else {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | | /**
|
| | | * tcp登录方便获取状态
|
| | | *
|
| | | * @param clientType 客户端类型
|
| | |
| | | @Override
|
| | | public void onSucceed() {
|
| | | LogUtils.i("tcpLogin onSucceed");
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | } catch (Exception e) {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | | /**
|
| | | * 通知删除并退网子设备
|
| | | *
|
| | | * @param oid 从网关(设备)oid
|
| | | * @param isForce 是否强制退网
|
| | | * @param callBack 结果回调
|
| | | */
|
| | | public void deleteNetwork(String oid, boolean isForce, HDLLinkCallBack callBack) {
|
| | | if (TextUtils.isEmpty(oid)) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
|
| | | }
|
| | |
|
| | | final String msgId = IdUtils.getUUId();
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | final BaseLocalResponse<List<ListOidRequest2>> data = new BaseLocalResponse<>();
|
| | | data.setId(msgId);
|
| | | data.setTime_stamp(time);
|
| | |
|
| | | final ListOidRequest2 request = new ListOidRequest2();
|
| | | request.setOid(oid);
|
| | | List<ListOidRequest2> list = new ArrayList<>();
|
| | | list.add(request);
|
| | |
|
| | | data.setObjects(list);
|
| | |
|
| | | String topic = String.format(TopicConstant.DELETE_REQUEST, HDLLinkConfig.getInstance().getGatewayId());
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | | GsonConvert.getGson().toJson(data));
|
| | |
|
| | | String replyTopic = topic + "_reply";
|
| | |
|
| | | if (isForce) {//强制退网,不等网关回复直接清除数据
|
| | | HDLLinkConfig.getInstance().clearConfig();
|
| | | }
|
| | |
|
| | | try {
|
| | | sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | | if (callBack == null) return;
|
| | | try {
|
| | | callBack.onSuccess("退网成功");
|
| | | HDLLinkConfig.getInstance().clearConfig();
|
| | |
|
| | | } catch (Exception e) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
|
| | | }
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | } catch (Exception e) {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 通知删除并退网子设备拓扑关系
|
| | | *
|
| | | * @param oid 从网关(设备)oid
|
| | | * @param callBack 结果回调
|
| | | */
|
| | | public void deleteNetwork(String oid, HDLLinkCallBack callBack) {
|
| | | if (TextUtils.isEmpty(oid)) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
|
| | | }
|
| | |
|
| | | final String msgId = IdUtils.getUUId();
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | final BaseLocalCodeResponse<List<ListOidRequest>> data = new BaseLocalCodeResponse<>();
|
| | | data.setId(msgId);
|
| | | data.setTime_stamp(time);
|
| | | data.setCode("0");
|
| | |
|
| | | final ListOidRequest request = new ListOidRequest();
|
| | | request.setOid(oid);
|
| | | List<ListOidRequest> list = new ArrayList<>();
|
| | | list.add(request);
|
| | |
|
| | | data.setObjects(list);
|
| | |
|
| | | String topic = String.format(TopicConstant.DELETE_NOTIFY_REPLY, HDLLinkConfig.getInstance().getGatewayId());
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | | GsonConvert.getGson().toJson(data));
|
| | |
|
| | | // String replyTopic = topic + "_reply";
|
| | |
|
| | | try {
|
| | | sendMsg(message.getSendBytes(), topic, callBack, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | | if (callBack == null) return;
|
| | | try {
|
| | | callBack.onSuccess("退网成功");
|
| | | HDLLinkConfig.getInstance().clearConfig();
|
| | |
|
| | | } catch (Exception e) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
|
| | | }
|
| | | }
|
| | |
|
| | | @Override
|
| | |
| | | public void tcpSendMsg(String topic, String bodyStr) {
|
| | | try {
|
| | | if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
|
| | | LogUtils.e("udpSendMsg", "参数不能为空");
|
| | | LogUtils.e("tcpSendMsg", "参数不能为空");
|
| | | return;
|
| | | }
|
| | | LinkRequest message = new LinkRequest(topic, bodyStr);
|
| | |
| | |
|
| | | }
|
| | |
|
| | | /**
|
| | | * 回复网关配置命令
|
| | | * @param mac_Oid_GatewayId
|
| | | * @param msgId 消息Id
|
| | | * @param callBack
|
| | | */
|
| | | public void gatewayRemoteEditReply(String mac_Oid_GatewayId, String msgId, HDLLinkCallBack callBack) {
|
| | | if (TextUtils.isEmpty(mac_Oid_GatewayId)) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
|
| | | }
|
| | |
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | final BaseLocalCodeResponse<List<String>> data = new BaseLocalCodeResponse<>();
|
| | | data.setId(msgId);
|
| | | data.setTime_stamp(time);
|
| | | data.setCode("0");
|
| | |
|
| | |
|
| | | String topic = String.format(TopicConstant.GATEWAY_EDIT_REMOTE_REPLY, mac_Oid_GatewayId);
|
| | | LinkRequest message = new LinkRequest(topic,
|
| | | GsonConvert.getGson().toJson(data));
|
| | |
|
| | |
|
| | |
|
| | | try {
|
| | | sendMsg(message.getSendBytes(), topic, callBack, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | | if (callBack == null) return;
|
| | | try {
|
| | | callBack.onSuccess("退网成功");
|
| | | HDLLinkConfig.getInstance().clearConfig();
|
| | |
|
| | | } catch (Exception e) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
|
| | | }
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onError() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | } catch (Exception e) {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | }
|