比如某些物联网设备,连接到网络后,会开启一个UDP,用于手机等移动设备的app搜索到,而且这个物联网设备通常会有一个默认的固定端口,我们只要通过向当前局域网的对应端口号发送消息广播,物联网接收到这个消息广播,会给我们回复数据,那么我们接收到这个数据的同时,也获取到了这个物联网设备的ip等基本的网络地址信息,从而去连接这个物联网设备。
那么怎么给局域网发送消息呢?循环遍历网段下所有地址?这个太low,效率太低,通过百度,发现可以使用单广播(单广播与多广播),把发送目标的ip改成 “255.255.255.255”,就是让路由设备给全部连接的设备发送广播消息
try( DatagramSocket dataSocket = new DatagramSocket() ) {
//准备要发送的数据
byte[] byteCmd = new byte[1024];
//给byteCmd设置一些约定的信息
byteCmd[0] = ...
//接收消息的超时时间,以毫秒为单位
dataSocket.setSoTimeout(30000);
//UDP 创建要发送的数据包 用来将长度为 length 的包发送到指定主机上的指定端口。
DatagramPacket senddataPacket = new DatagramPacket(byteCmd, byteCmd.length,
InetAddress.getByName("255.255.255.255"), 物联网设备的端口号);
//设置为广播(此处需要设置)
dataSocket.setBroadcast(true);
//发送数据包
dataSocket.send(senddataPacket);
isStopReceive = false;
//下面是开启了接收消息
byte[] receiveBytes = new byte[1024];
//创建接受信息的包对象
DatagramPacket receivePacket = new DatagramPacket(receiveBytes, receiveBytes.length);
//开启一个死循环,不断接受数据
while(!isStopReceive){
//接收数据,程序会阻塞到这一步,直到收到一个数据包为止
dataSocket.receive(receivePacket);
//解析收到的数据
byte[] recArr = receivePacket.getData();
//判断接收到的recArr是否是自己想要的....如果是 可以把isStopReceive改成true跳出循环
}
}
}catch (Exception e){
e.printStackTrace();
}
不过这个方法不适用与2.4G与5G,切记!!!