1,在局域网中,在未知设备IP的前提下,能搜索出设备,Http协议不能达到这个功能,所以采用Udp协议;
采用的组播地址:239.255.255.250 端口号:37020
2,发送的数据格式,统一使用 Xml格式的数据;
<?xml version="1.0" encoding="utf-8"?>
<Probe>
<DeviceType>FULLFDevice</DeviceType>
<Uuid>781FC569-B980-4742-AF9C-49569FFBB4C0</Uuid>
<Types>inquiry</Types>
</Probe>
3,当搜索到设备后,设备会相应的返回数据;
<?xml version="1.0" encoding="UTF-8"?>
<ProbeMatch>
<Uuid>BB5A6773-5CDE-4206-8F05-45E9407C9666</Uuid>
<Types>inquiry</Types>
<DeviceType>Intellduty</DeviceType>
<DeviceDescription>Intellduty</DeviceDescription>
<DeviceSN>NULL</DeviceSN>
<CommandPort>5000</CommandPort>
<MAC>00-A4-0E-FE-BE-EE</MAC>
<CpuSerial >ecf6a6e07acc9a8e</CpuSerial >
<IPv4Address>192.168.2.2</IPv4Address>
<IPv4SubnetMask>255.255.255.0</IPv4SubnetMask>
<IPv4Gateway>192.168.2.1</IPv4Gateway>
<DNS1>8.8.8.8</DNS1>
<DNS2></DNS2>
<DHCP>false</DHCP>
<SoftwareVersion>S.U206.K202.R006.B122</SoftwareVersion>
<BootTime>2020-09-15 11:51:21</BootTime>
<Activated>false</Activated>
<ET>NULL</ET>
<UID>NULL</UID>
</ProbeMatch>
说明如下:DeviceType的类型,常见有 Robot -机器人 ;Intellduty-通道机 ;LaneCodeInterphone-车道码对讲机
CpuSerial即为设备的唯一标记,也是http协议中deviceno的内容;
4,参考的Java代码
MulticastSocket socket = null;
public void runClient() {
try {
byte[] receiveBuffer = new byte[1024 * 16];
DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
InetAddress group = InetAddress.getByName("239.255.255.250");
socket = new MulticastSocket(37020);
socket.joinGroup(group);//加入组播地址
send();
send();
send();
while (!closed) {
socket.receive(receivePacket);
System.out.println("received packet from " + receivePacket.getAddress().getHostAddress() + " : " + receivePacket.getPort());
String msg = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
if (msg != null) {
if (msg.contains("Robot")
|| msg.contains("Intellduty")
|| msg.contains("LaneCodeInterphone")) {
System.out.println("received packet from " + receivePacket.getAddress().getHostAddress() + " : " + receivePacket.getPort());
System.out.println("received " + msg);
}
}
Thread.sleep(1000);
}
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 组播发送数据
*/
public void send() {
String msg = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<Probe>\n" +
" <DeviceType>FULLFDevice</DeviceType>\n" +
" <Uuid>781FC569-B980-4742-AF9C-49569FFBB4C0</Uuid>\n" +
" <Types>inquiry</Types>\n" +
"</Probe>";
// String msg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
// "<Probe>\n" +
// " <Uuid>9D6ED2F3-3466-473C-8295-8F0168829022</Uuid>\n" +
// " <Types>update</Types>\n" +
// " <PWErrorParse>true</PWErrorParse>\n" +
// " <MAC>00-A4-0E-FE-BE-EE</MAC>\n" +
// " <DeviceType></DeviceType>\n" +
// " <Password>0</Password>\n" +
// " <IPv4Address>192.168.2.2</IPv4Address>\n" +
// " <CommandPort>5000</CommandPort>\n" +
// " <HttpPort>80</HttpPort>\n" +
// " <IPv4SubnetMask>255.255.255.0</IPv4SubnetMask>\n" +
// " <IPv4Gateway>192.168.2.1</IPv4Gateway>\n" +
// " <DNS>192.168.2.1</DNS>\n" +
// " <IPv6Address>::</IPv6Address>\n" +
// " <IPv6Gateway></IPv6Gateway>\n" +
// " <IPv6MaskLen>64</IPv6MaskLen>\n" +
// " <DHCP>false</DHCP>\n" +
// "</Probe>";
try {
byte[] message = msg.getBytes(); //发送信息
InetAddress inetAddress = InetAddress.getByName(ip); //指定组播地址
DatagramPacket datagramPacket = new DatagramPacket(message, message.length, inetAddress, port); //发送数据包囊
MulticastSocket multicastSocket = new MulticastSocket();//创建组播socket
multicastSocket.send(datagramPacket);
} catch (Exception e) {
e.printStackTrace();
}
}