android和java 通过UDP搜索同一局域网内指定网络设备

比如某些物联网设备,连接到网络后,会开启一个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,切记!!!

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值