如何通过Java.io API查找本地网络中的lantronix设备

问题描述 投票:0回答:2

我正在尝试使用 Java.io 通过 Java 查找 LAN 上的 lantronix 设备。 * API

我需要使用UDP协议来通过端口30718广播网络中的所有电脑。当我广播它们时,我会得到网络上设备的响应。

我需要某种方法来进行 UDP 广播并检索网络上电脑的响应。

提前致谢。

java java-io
2个回答
0
投票

解决方案:

package testbroadcastudp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;

/**
* @since 03-05-2017
* @author jsanchez
*/
public class UDPBroadcastToLantronixDevices {
    public static void main(String[] args){
        //Port 30718 for sent at Lantronix devices
        try (DatagramSocket serverSocket = new DatagramSocket(30718)) 
        {//30718 50000
            byte[] queryMsg = new byte[4];
            queryMsg[0] = (byte)0x00;
            queryMsg[1] = (byte)0x00;
            queryMsg[2] = (byte)0x00;
            queryMsg[3] = (byte)0xF6;//Dec 246
            String testByte = new String(queryMsg,StandardCharsets.ISO_8859_1);

            serverSocket.setBroadcast(true);
            DatagramPacket datagramPacket = new DatagramPacket(
                queryMsg,
                queryMsg.length,
                InetAddress.getByName("192.168.1.255"),//192.168.1.201
                30718
            );
            //Send broadcast
            serverSocket.send(datagramPacket);
            //Close Broadcast socket to close the 30718 port.
            serverSocket.close();
            //Start the listening from the server
            receive();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static void receive(){
        //Port 30718 for listen Lantronix devices
        try (DatagramSocket clientSocket = new DatagramSocket(30718)) {
            byte[] buffer = new byte[4];

            // Set a timeout of 3000 ms to listen in the server side
            clientSocket.setSoTimeout(3000);
            while (true) {
                DatagramPacket datagramPacket = new DatagramPacket(buffer, 0,             buffer.length);

                /**
                * The receive method will wait for 3000 ms for data.
                * After that, the server will throw a timeout exception.
                */
                clientSocket.receive(datagramPacket);
                System.out.println("Listen on " + datagramPacket.getAddress() + " from " + datagramPacket.getData().toString() + " port " + datagramPacket.getPort());
                String receivedMessage = new String(datagramPacket.getData());
                //Decode to get the 0xF7 or '÷' in the byte[4] for a Lantronix Devices in the LAN
                receivedMessage = new String(datagramPacket.getData(), StandardCharsets.ISO_8859_1);
                System.out.println(receivedMessage);
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Timeout. Client is closing.");
        }
    }
}

0
投票

我知道...8年后... 我的网络有 70 台 Lantronix 串口服务器,各种型号 UDS10、UDS1100、UDS2100、XportAr、EDS4100。
我知道有一个 Dsearch.exe 命令行工具,但我想使用 PowerShell 来发现网络上的 Lantronix。
根据 Lantronix 的 Michael Lyon 通过发送十六进制 00 00 00 F8 到 UDP 30718 来发现旧 Cobo。
当查询以十六进制 00 00 00 F8 开头时,“每个设备的响应正好是 120 字节,并且始终以十六进制 00 00 00 F9 开头”。 F9 之后的四个十六进制值是响应单元的十六进制 IP 地址。”

请问,是否可以将您的 Java 脚本“转换”为 PowerShell?
我不知道如何适应这个想法: 在 PowerShell 中发送和接收 TCP 数据包 也许 UDPsender 就像 将 UDP 数据报发送到端口 :

# Define port and target IP address  Random here!  
    $Port       = 20000 
    $IP         = "10.10.1.100"  
    $Address    = [system.net.IPAddress]::Parse( $IP ) 

# Create IP Endpoint  
    $End        = New-Object System.Net.IPEndPoint $address , $port  

# Create Socket  
    $Saddrf     = [System.Net.Sockets.AddressFamily]::InterNetwork 
    $Stype      = [System.Net.Sockets.SocketType]::Dgram 
    $Ptype      = [System.Net.Sockets.ProtocolType]::UDP 
    $Sock       = New-Object System.Net.Sockets.Socket $saddrf , $stype , $ptype  
    $Sock.TTL   = 26 

# Connect to socket  
    $sock.Connect( $end )

# Create encoded buffer  
    $Enc        = [System.Text.Encoding]::ASCII 
#   $Message    = "Jerry Garcia Rocks`n" *10 ; # This was Original Message 
    $Message    = [char]0x00 + [char]0x00 + [char]0x00 + [char]0xF6
    $Buffer     = $Enc.GetBytes( $Message ) 

# Send the buffer  
    $Sent       = $Sock.Send( $Buffer ) 
    "{0} characters sent to: {1} " -f $Sent , $IP  
    "Message is:"  
    $Message  

# End of Script
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.