wjc
2023-06-28 14de918a79943e4961b09fa01ed320c6cad41f2e
HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLTcpConnect.java
New file
@@ -0,0 +1,143 @@
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;
    }
}