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.config.TopicConstant; import com.hdl.sdk.common.event.EventDispatcher; import com.hdl.sdk.common.event.EventListener; 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.LogUtils; import com.hdl.sdk.common.utils.ThreadToolUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; 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.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.codec.MessagePipeLine; import com.hdl.sdk.socket.listener.ConnectStatusListener; import com.hdl.sdk.socket.listener.SendListener; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * Created by Tong on 2021/9/26. * 1、通过Udp 组播或者广播搜索网关 * 2、通过Udp 获取Tcp ip 端口统一8586 */ public class HDLSocket { /** * tcp默认端口 */ private static final int TCP_PORT = 8586; private SocketBoot tcpBoot; private ConnectStatusListener statusListener; private HDLSocket() { statusListener = new ConnectStatusListener() { @Override public void onConnecting() { //broadcastRequest(); } @Override public void onConnected() { } @Override public void onConnectFailed() { } }; } 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() { }.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 instance; } SocketOptions options; private SocketOptions getTcpOptions() { 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.addConnectStatusListener(statusListener); return options; } public int getTcpPort() { return TCP_PORT; } public String getTcpIp() { return HDLLinkConfig.getInstance().getIpAddress(); } public String getGatewayId() { return HDLLinkConfig.getInstance().getGatewayId(); } /** * 获取设备列表 */ public void getDeviceList(HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", IdUtils.getUUId()); jsonObject.addProperty("time_stamp", time); String topic = String.format(TopicConstant.GET_DEVICE_LIST, getGatewayId()); LinkRequest message = new LinkRequest(topic, jsonObject.toString()); String replyTopic = String.format(TopicConstant.GET_DEVICE_LIST_REPLY, getGatewayId()); 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_DEVICE_LIST_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_DEVICE_LIST_ERROR)); } } } else { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); } } } /** * 获取功能列表 */ public void getFunctionList(HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", IdUtils.getUUId()); jsonObject.addProperty("time_stamp", time); String topic = String.format(TopicConstant.GET_FUNCTION_LIST, getGatewayId()); LinkRequest message = new LinkRequest(topic, jsonObject.toString()); String replyTopic = String.format(TopicConstant.GET_FUNCTION_LIST_REPLY, getGatewayId()); 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 * @param callBack */ public void getFunctionAttribute(List sids, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); List list = new ArrayList<>(); for (String s : sids) { list.add(new FunctionAttributeRequest(s)); } data.setObjects(list); String topic = String.format(TopicConstant.GET_FUNCTION_ATTRIBUTE, getGatewayId()); LinkRequest message = new LinkRequest(topic, GsonConvert.getGson().toJson(data)); String replyTopic = String.format(TopicConstant.GET_FUNCTION_ATTRIBUTE_REPLY, getGatewayId()); 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_PROPERTIES_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_PROPERTIES_ERROR)); } } } else { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); } } } /** * 设备控制 */ public void propertyDown(List request, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); data.setObjects(request); String topic = String.format(TopicConstant.PROPERTY_DOWN, getGatewayId()); LinkRequest message = new LinkRequest(topic, GsonConvert.getGson().toJson(data)); String replyTopic = String.format(TopicConstant.PROPERTY_DOWN_REPLY, getGatewayId()); 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)); } } } // /** // * 状态上报 // */ // public void propertyUp(List request, CallBack callBack) { // if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { // String time = String.valueOf(System.currentTimeMillis()); // // final BaseLocalResponse> data = new BaseLocalResponse<>(); // data.setId(IdUtils.getUUId()); // data.setTime_stamp(time); // data.setObjects(request); // // // String topic = String.format(TopicConstant.PROPERTY_UP, getGatewayId()); // LinkRequest message = new LinkRequest(topic, // GsonConvert.getGson().toJson(request)); // // String replyTopic = String.format(TopicConstant.PROPERTY_UP_REPLY, getGatewayId()); // 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)); // } // } // } /** * 读取状态 */ public void propertyRead(List sids, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); List list = new ArrayList<>(); for (String s : sids) { list.add(new PropertyReadRequest(s)); } data.setObjects(list); String topic = String.format(TopicConstant.PROPERTY_READ, getGatewayId()); LinkRequest message = new LinkRequest(topic, GsonConvert.getGson().toJson(data)); String replyTopic = String.format(TopicConstant.PROPERTY_READ_REPLY, getGatewayId()); 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)); } } } public synchronized SocketBoot getTcp() throws RuntimeException { String gatewayIpAddress = getTcpIp(); if (TextUtils.isEmpty(gatewayIpAddress)) { LogUtils.e("请搜索网关"); throw new RuntimeException("请搜索网关"); } //如果没有初始化,或者网关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; } /** * 获取场景列表 */ public void getSceneList(HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", IdUtils.getUUId()); jsonObject.addProperty("time_stamp", time); String topic = String.format(TopicConstant.SCENE_LIST_GET, getGatewayId()); 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 sids, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); List 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 sids, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); List list = new ArrayList<>(); for (String s : sids) { list.add(new PropertyReadRequest(s)); } data.setObjects(list); String topic = String.format(TopicConstant.SCENE_CONTROL, 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)); } } } /** * 上报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> 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 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 requestList, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse> 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> 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 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 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> data = new BaseLocalResponse<>(); data.setId(msgId); data.setTime_stamp(time); final ListOidRequest2 request = new ListOidRequest2(); request.setOid(oid); List 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> data = new BaseLocalCodeResponse<>(); data.setId(msgId); data.setTime_stamp(time); data.setCode("0"); final ListOidRequest request = new ListOidRequest(); request.setOid(oid); List 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 clearCache() { // SPUtils.remove(TCP_IP_KEY); // SPUtils.remove(GATEWAY_KEY); // } /** * 通用TCP发送指令 * 1秒没响应就让他重新发送,重试3次 * * @param topic 发送数据 * @param bodyStr 回复的主题 * @param callBack 回调 */ 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 (finalCallBack != null) { finalCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR)); } } } /** * 通用TCP发送指令 只发一次,不监听回复,不重发 * * @param topic 发送数据 * @param bodyStr 回复的主题 */ public void tcpSendMsg(String topic, String bodyStr) { try { if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { LogUtils.e("tcpSendMsg", "参数不能为空"); return; } LinkRequest message = new LinkRequest(topic, bodyStr); getTcp().sendMsg(message.getSendBytes()); } catch (Exception e) { LogUtils.e("tcpSendMsg", "发送失败 :" + e.getMessage()); } } /** * 发送指令 * 1秒没响应就让他重新发送,重试3次 */ public void sendMsg(byte[] data, String eventTag, HDLLinkCallBack callBack, SendListener sendListener) { try { 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.i("sendMsg onSuccess"); threadPool.shutdownNow(); LogUtils.i("sendMsg eventListener remove"); EventDispatcher.getInstance().remove(eventTag, this); if (callBack != null) { callBack.onSuccess(msg.toString()); } } } }; 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() { if (sendListener != null) { sendListener.onSucceed(); } } @Override public void onError() { if (sendListener != null) { sendListener.onError(); } } }); } catch (Exception e) { e.printStackTrace(); ThreadToolUtils.getInstance().runOnUiThread(new Runnable() { @Override public void run() { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR)); } } }); } } /** * 回复网关配置命令 * * @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> 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)); } } } }