| | |
| | | package com.hdl.sdk.connect.socket;
|
| | |
|
| | | import android.os.Build;
|
| | | import android.text.TextUtils;
|
| | |
|
| | | import androidx.annotation.RequiresApi;
|
| | |
|
| | | import com.google.gson.JsonObject;
|
| | | import com.google.gson.reflect.TypeToken;
|
| | |
| | | import com.hdl.sdk.common.exception.HDLLinkCode;
|
| | | import com.hdl.sdk.common.exception.HDLLinkException;
|
| | | import com.hdl.sdk.common.utils.IdUtils;
|
| | | import com.hdl.sdk.common.utils.IpUtils;
|
| | | import com.hdl.sdk.common.utils.LogUtils;
|
| | | import com.hdl.sdk.common.utils.SPUtils;
|
| | | import com.hdl.sdk.common.utils.ThreadToolUtils;
|
| | | import com.hdl.sdk.common.utils.gson.GsonConvert;
|
| | | 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.bean.response.GatewaySearchBean;
|
| | | import com.hdl.sdk.connect.HDLLink;
|
| | | import com.hdl.sdk.connect.bean.LinkRequest;
|
| | | import com.hdl.sdk.connect.bean.LinkResponse;
|
| | | import com.hdl.sdk.connect.bean.LoginRequest;
|
| | | import com.hdl.sdk.connect.bean.request.BroadcastRequest;
|
| | | import com.hdl.sdk.connect.bean.request.DeviceAuthRequest;
|
| | | import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
|
| | | import com.hdl.sdk.connect.bean.request.FunctionAttributeRequest;
|
| | | 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.request.PropertyReadRequest;
|
| | | import com.hdl.sdk.connect.bean.request.PropertyUpRequest;
|
| | | import com.hdl.sdk.connect.callback.BaseCallBack;
|
| | | import com.hdl.sdk.connect.bean.response.BaseLocalCodeResponse;
|
| | | import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
|
| | | import com.hdl.sdk.connect.bean.response.DeviceInfoResponse;
|
| | | import com.hdl.sdk.connect.callback.HDLLinkCallBack;
|
| | | import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
|
| | | 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.socket.SocketBoot;
|
| | | import com.hdl.sdk.socket.SocketOptions;
|
| | | import com.hdl.sdk.socket.client.IHeartbeat;
|
| | | import com.hdl.sdk.socket.client.TcpClient;
|
| | | import com.hdl.sdk.socket.client.UdpClient;
|
| | | import com.hdl.sdk.socket.codec.MessagePipeLine;
|
| | | import com.hdl.sdk.socket.listener.ConnectStatusListener;
|
| | | import com.hdl.sdk.socket.listener.SendListener;
|
| | |
|
| | | import java.io.UnsupportedEncodingException;
|
| | | import java.util.ArrayList;
|
| | | import java.util.List;
|
| | | import java.util.concurrent.ScheduledExecutorService;
|
| | |
| | | */
|
| | | public class HDLSocket {
|
| | |
|
| | | // public interface CallBack extends BaseCallBack {
|
| | | // void onResponse(String data);
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * udp默认组播ip
|
| | | // */
|
| | | // private static final String UDP_GROUP_IP = "239.0.168.188";
|
| | |
|
| | | /**
|
| | | * udp默认端口
|
| | | */
|
| | | private static final int UDP_PORT = 8585;
|
| | |
|
| | | /**
|
| | | * tcp默认端口
|
| | | */
|
| | | private static final int TCP_PORT = 8586;
|
| | |
|
| | | // private String tcpIp;
|
| | | // private int tcpPort;
|
| | |
|
| | | // private int udpPort;
|
| | | // private String udpIp;
|
| | |
|
| | | // private static SocketBoot updBoot;
|
| | | private SocketBoot tcpBoot;
|
| | |
|
| | | private ConnectStatusListener statusListener;
|
| | |
|
| | | // private EventListener searchEvent;
|
| | | // private CallBack searchCallBack;
|
| | | // private ScheduledExecutorService searchGatewayThread;
|
| | | // private final AtomicInteger searchCount = new AtomicInteger(0);
|
| | |
|
| | | private HDLSocket() {
|
| | | statusListener = new ConnectStatusListener() {
|
| | | @Override
|
| | | public void onConnecting() {
|
| | |
|
| | | //broadcastRequest();
|
| | | }
|
| | |
|
| | | @Override
|
| | |
| | |
|
| | | }
|
| | | };
|
| | | // searchEvent = new EventListener() {
|
| | | // @Override
|
| | | // public void onMessage(Object msg) {
|
| | | // try {
|
| | | // if (msg instanceof LinkResponse) {
|
| | | // LinkResponse linkResponse = (LinkResponse) msg;
|
| | | // String data = linkResponse.getData();
|
| | | // if (!TextUtils.isEmpty(data)) {
|
| | | // final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
|
| | | // }.getType());
|
| | | // GatewaySearchBean searchBean = response.getObjects();
|
| | | // if (searchBean != null) {
|
| | | //// gatewayId = searchBean.getGatewayId();
|
| | | //// if (!TextUtils.isEmpty(gatewayId)) {
|
| | | //// SPUtils.put(GATEWAY_KEY, gatewayId);
|
| | | //// }
|
| | | //// tcpIp = searchBean.getIp_address();
|
| | | //// if (!TextUtils.isEmpty(tcpIp)) {
|
| | | //// SPUtils.put(TCP_IP_KEY, tcpIp);
|
| | | //// }
|
| | | // }
|
| | | //
|
| | | // if (searchCallBack != null) {
|
| | | // searchCallBack.onResponse(linkResponse.toString());
|
| | | // }
|
| | | // }
|
| | | //
|
| | | // }
|
| | | // } catch (Exception e) {
|
| | | // if (searchCallBack != null) {
|
| | | // searchCallBack.onError("解析失败");
|
| | | // }
|
| | | // }
|
| | | //
|
| | | //
|
| | | // }
|
| | | // };
|
| | | }
|
| | |
|
| | | private static class SingletonInstance {
|
| | | private static final HDLSocket INSTANCE = new HDLSocket();
|
| | | public boolean isBroadcast = false;
|
| | |
|
| | |
|
| | | /**
|
| | | * 广播自身信息给主网关
|
| | | */
|
| | | public void broadcastRequest() {
|
| | |
|
| | | new Thread(new Runnable() {
|
| | | @Override
|
| | | public void run() {
|
| | | while (true) {
|
| | | try {
|
| | | Thread.sleep(5000);
|
| | | try {
|
| | | if (!HDLLink.getInstance().checkIfCertified()) {
|
| | | continue;
|
| | | }
|
| | |
|
| | | if (!TextUtils.isEmpty(getTcpIp()) && getTcp().connected) {
|
| | | continue;
|
| | | }
|
| | | } catch (Exception e) {
|
| | |
|
| | | }
|
| | | LogUtils.i("广播设备本身信息");
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) {
|
| | | LogUtils.i("DeviceInfoBean为空,请设置当前对象");
|
| | | continue;
|
| | | }
|
| | | 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) {
|
| | | 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("广播信息给主网关失败!---onError=" + e.toString());
|
| | | }
|
| | | });
|
| | | // HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
|
| | | //HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
|
| | | } catch (Exception e) {
|
| | | LogUtils.e("广播设备本身信息失败,失败信息:" + e.getMessage());
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | | }).start();
|
| | | }
|
| | |
|
| | | // private static class SingletonInstance {
|
| | | // }
|
| | | private static final HDLSocket instance = new HDLSocket();
|
| | |
|
| | | public static HDLSocket getInstance() {
|
| | | return SingletonInstance.INSTANCE;
|
| | | return instance;
|
| | | }
|
| | |
|
| | |
|
| | | // private SocketOptions getUdpOptions() {
|
| | | // final SocketOptions options = new SocketOptions();
|
| | | // final MessagePipeLine pipeLine = new MessagePipeLine();
|
| | | // pipeLine.add(new LinkMessageDecoder());
|
| | | // pipeLine.add(new LinkMessageEncoder());
|
| | | // options.setHandleMessage(pipeLine);
|
| | | // options.setEnabledHeartbeat(false);
|
| | | // return options;
|
| | | // }
|
| | | SocketOptions options;
|
| | |
|
| | | private SocketOptions getTcpOptions() {
|
| | | final SocketOptions options = new SocketOptions();
|
| | | if (null != options) {
|
| | | return options;
|
| | | }
|
| | | options = new SocketOptions();
|
| | | final MessagePipeLine pipeLine = new MessagePipeLine();
|
| | | pipeLine.add(new LinkMessageDecoder());
|
| | | pipeLine.add(new LinkMessageEncoder());
|
| | | options.setHandleMessage(pipeLine);
|
| | | options.setEnabledHeartbeat(false);
|
| | | options.addConnectStatusListener(statusListener);
|
| | | return options;
|
| | | }
|
| | |
|
| | | private int getUdpPort() {
|
| | | return UDP_PORT;
|
| | | }
|
| | |
|
| | | public int getTcpPort() {
|
| | | return TCP_PORT;
|
| | |
| | | public String getGatewayId() {
|
| | | return HDLLinkConfig.getInstance().getGatewayId();
|
| | | }
|
| | |
|
| | |
|
| | | // private String getUdpIp() {
|
| | | // if (TextUtils.isEmpty(udpIp)) {
|
| | | // udpIp = UDP_GROUP_IP;
|
| | | // }
|
| | | // return udpIp;
|
| | | // }
|
| | |
|
| | | // public void searchGateway() {
|
| | | // searchGateway(null);
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 组播搜索
|
| | | // */
|
| | | // public void searchGateway(CallBack callBack) {
|
| | | //// gatewayId = "";//重置网关ID
|
| | | //// this.searchCallBack = callBack;
|
| | | ////
|
| | | //// if (searchGatewayThread != null) {
|
| | | //// searchGatewayThread.shutdownNow();
|
| | | //// }
|
| | | ////
|
| | | ////
|
| | | //// new Thread(new Runnable() {
|
| | | //// @Override
|
| | | //// public void run() {
|
| | | //// while (TextUtils.isEmpty(gatewayId)) {
|
| | | //// //搜索网关
|
| | | //// searchGateway(IdUtils.getUUId(), searchEvent);
|
| | | //// try {
|
| | | //// Thread.sleep(1000L);
|
| | | //// } catch (InterruptedException e) {
|
| | | //// e.printStackTrace();
|
| | | //// }
|
| | | //// }
|
| | | //// }
|
| | | //// }).start();
|
| | | // }
|
| | | //
|
| | | //
|
| | | // /**
|
| | | // * 通过组播搜索网关
|
| | | // */
|
| | | // public void searchGateway(String msgId, EventListener eventListener) {
|
| | | // searchGateway(getUdpIp(), getUdpPort(), msgId, eventListener);
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 通过广播搜索网关
|
| | | // */
|
| | | // public void searchGatewayByBroadcast(String msgId, EventListener eventListener) {
|
| | | // searchGateway(IpUtils.getBroadcastAddress(), getUdpPort(), msgId, eventListener);
|
| | | // }
|
| | | //
|
| | | // /**
|
| | | // * 默认是组播搜索网关
|
| | | // */
|
| | | // public void searchGateway(String ip, int port, String msgId, EventListener eventListener) {
|
| | | //
|
| | | // if (updBoot == null) {
|
| | | // updBoot = UdpClient.init(ip, port, getUdpOptions());
|
| | | // updBoot.connect();
|
| | | // }
|
| | | //
|
| | | //
|
| | | // String time = String.valueOf(System.currentTimeMillis());
|
| | | // JsonObject jsonObject = new JsonObject();
|
| | | // jsonObject.addProperty("id", msgId);
|
| | | // jsonObject.addProperty("time_stamp", time);
|
| | | //
|
| | | // EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, eventListener);
|
| | | // LinkRequest message = new LinkRequest(TopicConstant.GATEWAY_SEARCH,
|
| | | // jsonObject.toString());
|
| | | //
|
| | | // try {
|
| | | // updBoot.sendMsg(message.getSendBytes());
|
| | | // } catch (UnsupportedEncodingException e) {
|
| | | // e.printStackTrace();
|
| | | // }
|
| | | //
|
| | | // }
|
| | |
|
| | |
|
| | | /**
|
| | | * 获取设备列表
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | public SocketBoot getTcp() throws RuntimeException {
|
| | | if (TextUtils.isEmpty(getTcpIp())) {
|
| | | public synchronized SocketBoot getTcp() throws RuntimeException {
|
| | | String gatewayIpAddress = getTcpIp();
|
| | | if (TextUtils.isEmpty(gatewayIpAddress)) {
|
| | | LogUtils.e("请搜索网关");
|
| | | throw new RuntimeException("请搜索网关");
|
| | | }
|
| | | if (tcpBoot == null) {
|
| | | tcpBoot = TcpClient.init(getTcpIp(), getTcpPort(), getTcpOptions());
|
| | | //如果没有初始化,或者网关IP更改了,就重新初始化
|
| | | if (tcpBoot == null || !getTcpOptions().getIp().equals(gatewayIpAddress)) {
|
| | | tcpBoot = TcpClient.init(gatewayIpAddress, getTcpPort(), getTcpOptions());
|
| | | tcpBoot.SetHeartbeat(new IHeartbeat() {
|
| | | @Override
|
| | | public void heartbeat() {
|
| | |
|
| | | if (HDLLinkConfig.getInstance().getDeviceInfoBean() == null || HDLLinkConfig.getInstance().getDeviceInfoBean().getOID() == null) {
|
| | | LogUtils.i("DeviceInfoBean为空,需要设置才能正常心跳");
|
| | | return;
|
| | | }
|
| | |
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | JsonObject jsonObject = new JsonObject();
|
| | | 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,
|
| | | jsonObject.toString());
|
| | | sendMsg(message.getSendBytes(), null, null, null);
|
| | | }
|
| | | });
|
| | | }
|
| | |
|
| | | return tcpBoot;
|
| | | }
|
| | |
|
| | |
| | | }
|
| | |
|
| | | /**
|
| | | * 场景控制
|
| | | * @param sids 场景sid列表
|
| | | * 获取场景列表
|
| | | */
|
| | | 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() {
|
| | | @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));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 场景控制
|
| | | *
|
| | | * @param sids 场景sid列表
|
| | | * @param callBack 回调
|
| | | */
|
| | | public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 上报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);
|
| | |
|
| | | //2023.10.18修改,上报oid列表增加parentOid
|
| | | if (request != null && !TextUtils.isEmpty(HDLLinkConfig.getInstance().getParentOid())) {
|
| | | request.setParentOid(HDLLinkConfig.getInstance().getParentOid());
|
| | | }
|
| | |
|
| | | 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 客户端类型
|
| | | * 应用:app;
|
| | | * 调试软件:program;
|
| | | * 第三方:third_party;
|
| | | * 网关:gateway;
|
| | | * 其它:other
|
| | | * @param version 协议版本
|
| | | */
|
| | | public void tcpLogin(String clientType, String version, HDLLinkCallBack callBack) {
|
| | | final String msgId = IdUtils.getUUId();
|
| | | String time = String.valueOf(System.currentTimeMillis());
|
| | | final BaseLocalResponse<LoginRequest> data = new BaseLocalResponse<>();
|
| | | data.setId(msgId);
|
| | | data.setTime_stamp(time);
|
| | |
|
| | | final LoginRequest request = new LoginRequest();
|
| | | request.setVersion(version);
|
| | | request.setClientType(clientType);
|
| | |
|
| | | data.setObjects(request);
|
| | |
|
| | | String topic = String.format(TopicConstant.GATEWAY_LOGIN, HDLLinkConfig.getInstance().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() {
|
| | | 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, null, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | | HDLLinkConfig.getInstance().clearConfig();
|
| | | if (callBack == null) return;
|
| | | try {
|
| | | callBack.onSuccess("退网成功");
|
| | | } 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));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | // /**
|
| | | // * 清空缓存
|
| | | // */
|
| | |
| | | public void tcpSendMsg(String topic, String bodyStr, HDLLinkCallBack callBack) {
|
| | | try {
|
| | | LinkRequest message = new LinkRequest(topic, bodyStr);
|
| | | if (topic != null && topic.endsWith("_reply")) {
|
| | | callBack = null;
|
| | | }
|
| | | String replyTopic = topic + "_reply";
|
| | | HDLLinkCallBack finalCallBack = callBack;
|
| | | 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));
|
| | | if (finalCallBack != null) {
|
| | | finalCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | |
| | | /**
|
| | | * 通用TCP发送指令 只发一次,不监听回复,不重发
|
| | | *
|
| | | * @param topic 发送数据
|
| | | * @param bodyStr 回复的主题
|
| | | * @param topic 发送数据
|
| | | * @param bodyStr 回复的主题
|
| | | */
|
| | | 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);
|
| | | getTcp().sendMsg(message.getSendBytes());
|
| | | } catch (Exception e) {
|
| | | LogUtils.e("tcpSendMsg", "发送失败 :"+e.getMessage());
|
| | | LogUtils.e("tcpSendMsg", "发送失败 :" + e.getMessage());
|
| | | }
|
| | | }
|
| | |
|
| | |
| | | public void sendMsg(byte[] data, String eventTag, HDLLinkCallBack callBack, SendListener sendListener) {
|
| | |
|
| | | try {
|
| | | final AtomicInteger sendCount = new AtomicInteger(0);
|
| | | if (eventTag != null) {
|
| | | final AtomicInteger sendCount = new AtomicInteger(0);
|
| | |
|
| | | final ScheduledExecutorService threadPool = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
|
| | | final EventListener eventListener = new EventListener() {
|
| | | @Override
|
| | | public void onMessage(Object msg) {
|
| | | if (msg instanceof LinkResponse) {
|
| | | LogUtils.e("sendMsg onSuccess");
|
| | | if (callBack != null) {
|
| | | callBack.onSuccess(msg.toString());
|
| | | }
|
| | | threadPool.shutdownNow();
|
| | | }
|
| | | LogUtils.e("sendMsg eventListener remove");
|
| | | EventDispatcher.getInstance().remove(eventTag, this);
|
| | | }
|
| | | };
|
| | |
|
| | | threadPool.scheduleWithFixedDelay(new Runnable() {
|
| | | @Override
|
| | | public void run() {
|
| | | if (sendCount.get() < 3) {
|
| | | sendCount.set(sendCount.get() + 1);
|
| | | getTcp().sendMsg(data);
|
| | | } else {
|
| | | threadPool.shutdownNow();
|
| | | LogUtils.e("sendMsg eventListener remove");
|
| | | EventDispatcher.getInstance().remove(eventTag, eventListener);
|
| | | ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
|
| | | @Override
|
| | | public void run() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | final ScheduledExecutorService threadPool = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
|
| | | final EventListener eventListener = new EventListener() {
|
| | | @Override
|
| | | public void onMessage(Object msg) {
|
| | | if (msg instanceof LinkResponse) {
|
| | | LogUtils.i("sendMsg onSuccess");
|
| | | threadPool.shutdownNow();
|
| | | LogUtils.i("sendMsg eventListener remove");
|
| | | EventDispatcher.getInstance().remove(eventTag, this);
|
| | | if (callBack != null) {
|
| | | callBack.onSuccess(msg.toString());
|
| | | }
|
| | | });
|
| | | }
|
| | | }
|
| | | }
|
| | | }, 1000, 500, TimeUnit.MILLISECONDS);
|
| | | EventDispatcher.getInstance().register(eventTag, eventListener);
|
| | | };
|
| | |
|
| | | threadPool.scheduleWithFixedDelay(new Runnable() {
|
| | | @Override
|
| | | public void run() {
|
| | | if (sendCount.get() < 0) {
|
| | | sendCount.set(sendCount.get() + 1);
|
| | | getTcp().sendMsg(data);
|
| | | } else {
|
| | | threadPool.shutdownNow();
|
| | | LogUtils.e("sendMsg eventListener remove");
|
| | | EventDispatcher.getInstance().remove(eventTag, eventListener);
|
| | | ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
|
| | | @Override
|
| | | public void run() {
|
| | | if (callBack != null) {
|
| | | callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
|
| | | }
|
| | | }
|
| | | });
|
| | | }
|
| | | }
|
| | | }, 1000, 500, TimeUnit.MILLISECONDS);
|
| | | EventDispatcher.getInstance().register(eventTag, eventListener);
|
| | | }
|
| | | //先发送一次
|
| | | getTcp().sendMsg(data, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | |
| | |
|
| | | }
|
| | |
|
| | | /**
|
| | | * 回复网关配置命令
|
| | | *
|
| | | * @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));
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | }
|