package com.hdl.sdk.link.core.connect; import com.google.gson.JsonObject; import com.hdl.sdk.link.common.config.TopicConstant; import com.hdl.sdk.link.common.exception.HDLLinkException; import com.hdl.sdk.link.common.utils.IdUtils; import com.hdl.sdk.link.common.utils.LogUtils; import com.hdl.sdk.link.common.utils.gson.GsonConvert; import com.hdl.sdk.link.core.bean.LinkRequest; import com.hdl.sdk.link.core.bean.LinkResponse; import com.hdl.sdk.link.core.bean.gateway.GatewayBean; import com.hdl.sdk.link.core.bean.request.BroadcastRequest; import com.hdl.sdk.link.core.callback.HDLLinkResponseCallBack; import com.hdl.sdk.link.core.config.HDLLinkConfig; import com.hdl.sdk.link.core.protocol.LinkMessageDecoder; import com.hdl.sdk.link.core.protocol.LinkMessageEncoder; import com.hdl.sdk.link.gateway.HDLLinkLocalGateway; import com.hdl.sdk.link.socket.TcpSocketBoot; import com.hdl.sdk.link.socket.SocketOptions; import com.hdl.sdk.link.socket.client.IHeartbeat; import com.hdl.sdk.link.socket.client.TcpClient; import com.hdl.sdk.link.socket.codec.MessagePipeLine; import com.hdl.sdk.link.socket.listener.ConnectStatusListener; /** * Created by Tong on 2021/9/26. * 1、通过Udp 组播或者广播搜索网关 * 2、通过Udp 获取Tcp ip 端口统一8586 */ public class HDLTcpConnect { /** * tcp默认端口 */ private static final int TCP_PORT = 8586; private ConnectStatusListener statusListener; private HDLTcpConnect() { statusListener = new ConnectStatusListener() { @Override public void onConnecting() { broadcastRequest(); } @Override public void onConnected() { } @Override public void onConnectFailed() { } }; } /** * 广播自身信息给主网关 */ private void broadcastRequest() { String time = String.valueOf(System.currentTimeMillis()); if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) { LogUtils.i("DeviceInfoBean为空,请设置当前对象"); return; } BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200"); HDLUdpConnect.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true); HDLUdpConnect.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true, new HDLLinkResponseCallBack() { @Override public void onSuccess(LinkResponse msg) { LogUtils.i("广播信息给主网关成功!"); } @Override public void onError(HDLLinkException e) { } }); HDLUdpConnect.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true); } private static class SingletonInstance { private static final HDLTcpConnect INSTANCE = new HDLTcpConnect(); } public static HDLTcpConnect getInstance() { return SingletonInstance.INSTANCE; } /** * 通过IP及端口找出连接客户端,如果当前没有连接。主要是针对调试软件使用,支持连接主网关、从网关 * * @param ip 连接的网关IP * @return */ public static synchronized TcpSocketBoot getTcpSocketBoot(String ip) { return initTcp(ip); } static int dddd; /** * 初始化tcp连接 * * @param ip 连接的网关IP * @return */ public static synchronized TcpSocketBoot initTcp(String ip) { int port = TCP_PORT; TcpSocketBoot tcpSocketBoot = TcpSocketBoot.getByEndPoint(ip, port); if (null == tcpSocketBoot) { final SocketOptions options = new SocketOptions(); final MessagePipeLine pipeLine = new MessagePipeLine(); pipeLine.add(new LinkMessageDecoder()); pipeLine.add(new LinkMessageEncoder()); options.setHandleMessage(pipeLine); tcpSocketBoot = TcpClient.init(ip, port, options); tcpSocketBoot.SetHeartbeat(new IHeartbeat() { @Override public void heartbeat() { String time = String.valueOf(System.currentTimeMillis()); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", IdUtils.getUUId()); jsonObject.addProperty("time_stamp", time); GatewayBean gatewayBean= HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(ip); if(gatewayBean==null){ return; } String topic = String.format(TopicConstant.HEARTBEAT, gatewayBean.getOid()); LinkRequest request = new LinkRequest(topic, jsonObject.toString(), false); new HDLConnectHelper(ip, request, null, true).send(); } }); } return tcpSocketBoot; } }