我正在尝试使用 Java.io 通过 Java 查找 LAN 上的 lantronix 设备。 * API
我需要使用UDP协议来通过端口30718广播网络中的所有电脑。当我广播它们时,我会得到网络上设备的响应。
我需要某种方法来进行 UDP 广播并检索网络上电脑的响应。
提前致谢。
解决方案:
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.");
}
}
}
我知道...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