| | |
| | | private volatile static HDLAuthSocket instance; |
| | | |
| | | private HDLAuthSocket() { |
| | | initSearchGatewayEvent(); |
| | | initListenerGatewayEvent(); |
| | | initSearchGatewayEvent(); |
| | | } |
| | | |
| | | // public interface CallBack extends BaseCallBack { |
| | |
| | | synchronized (HDLLinkConfig.class) { |
| | | if (instance == null) { |
| | | instance = new HDLAuthSocket(); |
| | | //1.启动Socket 开启监听 |
| | | instance.getUdpBoot(); |
| | | } |
| | | } |
| | | } |
| | |
| | | */ |
| | | public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) { |
| | | HDLLinkConfig.getInstance().clearConfig(); |
| | | //1.启动Socket 开启监听 |
| | | getUdpBoot(); |
| | | //2.构建监听Listener |
| | | // authEvent = |
| | | //3.监听网关广播的入网指令 |
| | |
| | | String requestStr = gs.toJson(request); |
| | | LinkRequest message = new LinkRequest(topic, requestStr); |
| | | |
| | | HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() { |
| | | HdlSocketHelper.send(getUdpBoot(), ip,UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { |
| | | @Override |
| | | public void onSucceed(Object msg) { |
| | | if (callBack == null) return; |
| | |
| | | * @param callBack 回调 |
| | | */ |
| | | public void searchGatewayMulticast(SearchGatewayCallBack callBack) { |
| | | searchGateway(HDLLinkConfig.getInstance().getGatewayId(), InetSocketAddress.createUnresolved(UDP_GROUP_IP,UDP_PORT), callBack); |
| | | searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP,UDP_PORT, callBack); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | public void searchGatewayBroadcast(SearchGatewayCallBack callBack) { |
| | | String ip = IpUtils.getBroadcastAddress(); |
| | | searchGateway(HDLLinkConfig.getInstance().getGatewayId(), InetSocketAddress.createUnresolved(ip,UDP_PORT), callBack); |
| | | searchGateway(HDLLinkConfig.getInstance().getGatewayId(), ip,UDP_PORT, callBack); |
| | | } |
| | | |
| | | |
| | |
| | | GsonConvert.getGson().toJson(data)); |
| | | |
| | | String ip = IpUtils.getBroadcastAddress(); |
| | | HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() { |
| | | HdlSocketHelper.send(getUdpBoot(), ip,UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { |
| | | @Override |
| | | public void onSucceed(Object msg) { |
| | | if (callBack == null) return; |
| | |
| | | return; |
| | | } |
| | | LinkRequest message = new LinkRequest(topic, bodyStr); |
| | | String ip = HDLLinkConfig.getInstance().getIpAddress(); IpUtils.getBroadcastAddress(); |
| | | HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() { |
| | | String ip = HDLLinkConfig.getInstance().getIpAddress(); |
| | | HdlSocketHelper.send(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { |
| | | @Override |
| | | public void onSucceed(Object msg) { |
| | | if (callBack == null) return; |
| | |
| | | } |
| | | LinkRequest message = new LinkRequest(topic, bodyStr); |
| | | String ip = HDLLinkConfig.getInstance().getIpAddress();// IpUtils.getBroadcastAddress(); |
| | | getUdpBoot().sendMsg( InetSocketAddress.createUnresolved(ip,UDP_PORT),message.getSendBytes()); |
| | | getUdpBoot().sendMsg( ip,UDP_PORT,message.getSendBytes()); |
| | | } |
| | | |
| | | private GatewaySearchBean getGatewaySearchBean(Object msg) { |
| | |
| | | * 搜索指定网关是否在线,搜索到则返回指定的网关对象 |
| | | * |
| | | * @param gatewayId 网关id |
| | | * @param desInetSocketAddress 目标的地址 |
| | | * @param ipAddress 目标的IP地址 |
| | | * @param port 目标的端口 |
| | | * @param callBack 回调 |
| | | */ |
| | | public void searchGateway(String gatewayId, InetSocketAddress desInetSocketAddress, SearchGatewayCallBack callBack) { |
| | | public void searchGateway(String gatewayId, String ipAddress,int port, SearchGatewayCallBack callBack) { |
| | | this.searchGatewayId = gatewayId; |
| | | this.mSearchGatewayCallBack = callBack; |
| | | //重置参数 |
| | |
| | | //搜索网关 |
| | | searchGatewayCount.set(searchGatewayCount.get() + 1); |
| | | LogUtils.i("搜索网关", "搜索网关第" + searchGatewayCount.get() + "次"); |
| | | getUdpBoot().sendMsg(desInetSocketAddress,message.getSendBytes()); |
| | | getUdpBoot().sendMsg(ipAddress, port, message.getSendBytes()); |
| | | Thread.sleep(1000L); |
| | | } catch (InterruptedException e) { |
| | | e.printStackTrace(); |
| | |
| | | if (!isSearchGatewaySuccess.get()) { |
| | | //搜索10次,指定网关都没回复,回调超时 |
| | | callBackSearchGatewayTimeout(); |
| | | LogUtils.e("搜索网关--", "搜索10次,指定网关都没回复,回调超时"); |
| | | LogUtils.e("搜索网关", "搜索10次,指定网关都没回复,回调超时"); |
| | | } |
| | | } |
| | | }).start(); |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override
|
| | | public void onMessage(Object msg) {
|
| | | if (msg instanceof LinkResponse) {
|
| | | LogUtils.e("sendMsg onSuccess");
|
| | | LogUtils.i("sendMsg onSuccess");
|
| | | threadPool.shutdownNow();
|
| | | LogUtils.i("sendMsg eventListener remove");
|
| | | EventDispatcher.getInstance().remove(eventTag, this);
|
| | | if (callBack != null) {
|
| | | callBack.onSuccess(msg.toString());
|
| | | }
|
| | | threadPool.shutdownNow();
|
| | | }
|
| | | LogUtils.e("sendMsg eventListener remove");
|
| | | EventDispatcher.getInstance().remove(eventTag, this);
|
| | | }
|
| | | };
|
| | |
|
| | |
| | | }
|
| | | }, 1000, 500, TimeUnit.MILLISECONDS);
|
| | | EventDispatcher.getInstance().register(eventTag, eventListener);
|
| | | //先发送一次
|
| | | getTcp().sendMsg(data, new SendListener() {
|
| | | @Override
|
| | | public void onSucceed() {
|
| | |
| | |
|
| | | private SocketBoot boot;
|
| | | private UdpSocketBoot udpSocketBoot;
|
| | | private InetSocketAddress inetSocketAddress;
|
| | | /**
|
| | | * 发送的目标IP
|
| | | */
|
| | | private String ipAddress;
|
| | | /**
|
| | | * 发送的目标地址
|
| | | */
|
| | | private int port;
|
| | | private final LinkRequest linkRequest;
|
| | | private final EventListener eventListener;
|
| | |
|
| | |
| | | }
|
| | |
|
| | | private HdlSocketHelper(Long sendAwaitTime, int maxRetry, UdpSocketBoot udpSocketBoot,
|
| | | InetSocketAddress inetSocketAddress, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
|
| | | String ipAddress,int port , LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
|
| | | this.sendAwaitTime = sendAwaitTime;
|
| | | this.maxRetry = maxRetry;
|
| | | this.udpSocketBoot = udpSocketBoot;
|
| | | this.inetSocketAddress = inetSocketAddress;
|
| | | this.ipAddress = ipAddress;
|
| | | this.port = port;
|
| | | this.linkRequest = linkRequest;
|
| | | this.listener = listener;
|
| | | this.sendNumber = new AtomicInteger(0);
|
| | |
| | | * Udp的发送方法
|
| | | *
|
| | | * @param udpSocketBoot Udp当前对接
|
| | | * @param inetSocketAddress 发送的目标地址
|
| | | * @param ipAddress 发送的目标IP地址
|
| | | * @param port 目的端口
|
| | | * @param linkRequest 发送的数据
|
| | | * @param observeTopic 发送的主题
|
| | | * @param listener 回调
|
| | | */
|
| | | public static void send(UdpSocketBoot udpSocketBoot, InetSocketAddress inetSocketAddress, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
|
| | | public static void send(UdpSocketBoot udpSocketBoot, String ipAddress ,int port, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
|
| | | if (TextUtils.isEmpty(observeTopic)) {
|
| | | observeTopic = linkRequest.getTopic() + "_reply";
|
| | | }
|
| | | HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, inetSocketAddress, linkRequest, observeTopic, listener);
|
| | | HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, ipAddress,port, linkRequest, observeTopic, listener);
|
| | | socketHelper.send();
|
| | | }
|
| | |
|
| | |
| | | * Udp发送的方法
|
| | | *
|
| | | * @param udpSocketBoot 当前Udp对象
|
| | | * @param inetSocketAddress 发送的目标地址
|
| | | * @param ipAddress 发送的目标IP地址
|
| | | * @param
|
| | | * @param linkRequest 发送的对象
|
| | | * @param listener 回调
|
| | | */
|
| | | public static void send(UdpSocketBoot udpSocketBoot, InetSocketAddress inetSocketAddress, LinkRequest linkRequest, HdlSocketListener listener) {
|
| | | public static void send(UdpSocketBoot udpSocketBoot, String ipAddress ,int port, LinkRequest linkRequest, HdlSocketListener listener) {
|
| | | String observeTopic = null;
|
| | | if (TextUtils.isEmpty(observeTopic)) {
|
| | | observeTopic = linkRequest.getTopic() + "_reply";
|
| | | }
|
| | | HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, inetSocketAddress, linkRequest, observeTopic, listener);
|
| | | HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, ipAddress,port, linkRequest, observeTopic, listener);
|
| | | socketHelper.send();
|
| | | }
|
| | |
|
| | |
| | | }
|
| | | //如果是udp
|
| | | if (null != udpSocketBoot) {
|
| | | udpSocketBoot.sendMsg(inetSocketAddress, linkRequest.getSendBytes());
|
| | | udpSocketBoot.sendMsg(ipAddress,port, linkRequest.getSendBytes());
|
| | | }
|
| | | }
|
| | | } catch (Exception e) {
|
| | |
| | | mUdpClientPool.clear();
|
| | | }
|
| | |
|
| | | public synchronized DatagramSocket getUdpSocket1(InetSocketAddress address) throws SocketException {
|
| | | public synchronized DatagramSocket getUdpSocket(InetSocketAddress address) throws SocketException {
|
| | | DatagramSocket socket;
|
| | | final String key = address.toString();
|
| | | if (mUdpClientPool.containsKey(key)) {
|
| | |
| | | import com.hdl.sdk.socket.udp.UdpSocketOptions; |
| | | |
| | | import java.net.InetSocketAddress; |
| | | import java.net.SocketAddress; |
| | | |
| | | /** |
| | | * Created by hxb on 2021/12/12. |
| | |
| | | |
| | | /** |
| | | * 发送数据 |
| | | * @param inetSocketAddress 目标地址 |
| | | * @param ipAddress 目标IP |
| | | * @param port 端口 |
| | | * @param msg 发送数据 |
| | | * @throws Exception |
| | | */ |
| | | void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg) throws Exception; |
| | | void sendMsg(String ipAddress,int port, byte[] msg) throws Exception; |
| | | |
| | | } |
| | |
| | | import java.net.DatagramSocket;
|
| | | import java.net.InetAddress;
|
| | | import java.net.InetSocketAddress;
|
| | | import java.net.SocketAddress;
|
| | | import java.util.concurrent.atomic.AtomicBoolean;
|
| | |
|
| | |
|
| | |
| | | return;
|
| | | }
|
| | | if (TextUtils.isEmpty(ipAddress)) {
|
| | | mSocket = SocketPool.getInstance().getUdpSocket1(new InetSocketAddress(port));
|
| | | mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port));
|
| | | }
|
| | | mSocket.setBroadcast(true);
|
| | | mSocket.setReuseAddress(true);
|
| | |
| | |
|
| | | @Override
|
| | | public UdpSocketOptions getOptions() {
|
| | | return null;
|
| | | return this.socketOptions;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void onHandleResponse() throws Exception {
|
| | | if (mSocket == null) {
|
| | | return;
|
| | | }
|
| | | try {
|
| | | mSocket.receive(receivePacket);
|
| | | mSocket.receive(receivePacket);
|
| | | } catch (IOException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | |
| | | }
|
| | | //排除自己发出去的
|
| | | try {
|
| | | if (IpUtils.isLocalIpAddress( receivePacket.getAddress().getHostAddress()))
|
| | | if (IpUtils.isLocalIpAddress(receivePacket.getAddress().getHostAddress()))
|
| | | return;
|
| | | } catch (Exception ignored) {
|
| | |
|
| | | }
|
| | |
|
| | | try {
|
| | | LogUtils.i( "接收到Udp数据包,网络地址:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
|
| | | LogUtils.i("接收到Udp数据包,网络地址:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
|
| | |
|
| | | IHandleMessage handleMessage = getOptions().getHandleMessage();
|
| | | if (handleMessage != null) {
|
| | |
| | | handleMessage.read(data);
|
| | | }
|
| | |
|
| | | }catch (Exception e){
|
| | | } catch (Exception e) {
|
| | |
|
| | | }
|
| | | }
|
| | |
|
| | |
|
| | | @Override
|
| | | public void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg) throws Exception {
|
| | | public void sendMsg(String ipAddress,int port, byte[] msg) throws Exception {
|
| | | if (msg == null) {
|
| | | return;
|
| | | }
|
| | | final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, inetSocketAddress);
|
| | | final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(ipAddress), port);
|
| | | mSocket.send(sendPacket);
|
| | | }
|
| | | }
|
| | |
| | | import com.hdl.sdk.socket.listener.SendListener;
|
| | |
|
| | | import java.net.ConnectException;
|
| | | import java.net.InetAddress;
|
| | | import java.net.InetSocketAddress;
|
| | | import java.net.SocketAddress;
|
| | | import java.util.concurrent.BlockingQueue;
|
| | | import java.util.concurrent.ExecutorService;
|
| | | import java.util.concurrent.LinkedBlockingDeque;
|
| | |
| | |
|
| | | private final AtomicInteger resendCount = new AtomicInteger(0);
|
| | |
|
| | | private ExecutorService receiveThread;
|
| | |
|
| | | private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
|
| | |
|
| | | public UdpSocketBoot(IUdpClient client) {
|
| | |
| | | * @throws Exception 可能端口冲突
|
| | | */
|
| | | public void bind() throws Exception {
|
| | | if (null != client) {
|
| | | client.bind();
|
| | | }
|
| | | client.bind();
|
| | | initReceiveThread();
|
| | | }
|
| | |
|
| | | /**
|
| | | * 初始化接收线程
|
| | | */
|
| | | private void initReceiveThread() {
|
| | | if(null!=receiveThread){
|
| | | return;
|
| | | }
|
| | | receiveThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
|
| | | receiveThread.execute(new Runnable() {
|
| | | @Override
|
| | | public void run() {
|
| | | while (true) {
|
| | | try {
|
| | | client.onHandleResponse();
|
| | | } catch (Exception e) {
|
| | | LogUtils.i("接收线程异常:"+e.getMessage());
|
| | | }
|
| | | }
|
| | | }
|
| | | });
|
| | | }
|
| | |
|
| | |
|
| | | /**
|
| | | * 发送数据
|
| | | * @param inetSocketAddress 目的的IP地址
|
| | | * @param ipAddress 目的的IP地址
|
| | | * @param port 端口
|
| | | * @param msg 发送数据
|
| | | * @param listener 发送回调
|
| | | */
|
| | | public void sendMsg(InetSocketAddress inetSocketAddress,byte[] msg, SendListener listener) {
|
| | | sendMsg(inetSocketAddress, msg, true, listener);
|
| | | public void sendMsg(String ipAddress,int port,byte[] msg, SendListener listener) {
|
| | | sendMsg(ipAddress,port, msg, true, listener);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 发送数据
|
| | | * @param inetSocketAddress 目的的IP地址
|
| | | * @param ipAddress 目的的IP地址
|
| | | * @param port 端口
|
| | | * @param msg 发送数据
|
| | | */
|
| | | public void sendMsg(InetSocketAddress inetSocketAddress,byte[] msg) {
|
| | | sendMsg(inetSocketAddress, msg, true, null);
|
| | | public void sendMsg(String ipAddress,int port,byte[] msg) {
|
| | | sendMsg(ipAddress,port, msg, true, null);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 发送数据
|
| | | * @param inetSocketAddress 目的IP地址
|
| | | * @param ipAddress 目的IP地址
|
| | | * @param port 端口
|
| | | * @param msg 发送的数据
|
| | | * @param isRefreshRetry 是否要重发
|
| | | * @param listener 发送回调
|
| | | */
|
| | | public void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg, boolean isRefreshRetry, SendListener listener) {
|
| | | public void sendMsg(String ipAddress,int port, byte[] msg, boolean isRefreshRetry, SendListener listener) {
|
| | | if (isRefreshRetry) {
|
| | | //重置连接次数
|
| | | resendCount.set(0);
|
| | |
| | | if (listener != null && !TextUtils.isEmpty(request.getAction())) {
|
| | | sendMap.put(request.getAction(), listener);
|
| | | }
|
| | | client.sendMsg(inetSocketAddress, msg);
|
| | | client.sendMsg(ipAddress,port, msg);
|
| | | } catch (Exception e) {
|
| | | LogUtils.i("发送失败:" + e.getMessage());
|
| | | }
|
| | |
| | | */
|
| | | public synchronized void close() {
|
| | | isOpenRetry.set(false);
|
| | |
|
| | | sendMap.clear();
|
| | | receiveThread.shutdown();
|
| | | receiveThread=null;
|
| | | client.close();
|
| | | }
|
| | | }
|