在双方没协议的情况下 试试循环Runtime.getRuntime().exec("ping "+ip+"-i 1 -c 2");ping每个IP
Runtime.getRuntime().exec("arp -a >"+savefile);再去处理savefile这个文件另外就是发送udp广播了,请求方将自身ip和命令广播出去,设备收到命令将自身ip用tcp/udp发送给请求方。
每个设备要建立Socket监听广播才可以。

解决方案 »

  1.   

        arp -a命令是显示本机的ARP缓存表,如果设备不曾连接过局域网内的其他设备的话,arp -a除了返回路由器,别的地址应该都不会返回吧?
         而且我使用"adb shell arp" 的结果是arp not found。
      

  2.   

    是的 所以前面要一个一个ip试这ping,最后把arp -a就可以显示到在线的ip了
    arp not found。不要用模拟器,用真机试试。我用开发板有arp命令。没有就要装busybox了,有很多linux的常用命令
      

  3.   

        我使用的就是真机,看样子如你所说,的确要装busybox了。
         
         现在,通过google提供的WifiManager类,我已经可以获取当前设备的IP,网关,和子网掩码。这样的话,我已经可以计算出,当前局域网内所有可能的IP地址。
         不过使用ping 和 arp -a 这意味着我需要新建一大堆的进程(每ping一次,一个进程,加上arp的进程,假设子网掩码为255,255,255,0,那样的话,总计创建了256条进程),这种方案是不是对于性能不利呢?
      

  4.   

        昨天尝试了udp广播,udp本来就是不可靠的协议,再加wifi无线网络的不可靠性,根据我的试验,在我们公司的wifi网络下,基本丢包率在50%上下,真的不是很靠谱
      

  5.   

        我使用的一直是真机。
         不过,公司的wifi网络好像真的不是很好,两台平板电脑互ping的时候,经常出现1000毫秒以上的延迟。
         
         目前关于如何获知局域网内的其他设备,我有两个方案:
         1.UDP广播,AP在运行的过程中,不停的发送UDP广播(例如每一秒钟一次),然后接收端每10秒检查一次收到的广播包,如果发现过去的10秒钟内接受到过某个IP发送的广播包,则认为这个IP所在的机器上正在运行我的AP(简单的来说,就是这个机器在线),接收端可以和它通信。考虑到网络的丢包率的话,可以提高发送端的发送频率或者增大接收端的扫描间隔,来提高可靠性。
         2.使用TCP轮询。通过本机IP和子网掩码,计算本子网内所有可能的IP地址,轮询这些IP地址,尝试Socket.connect(SocketAddress remoteAddr, int timeout)来进行连接,能连上则认为机器在线。超时则判断机器离线。不过,这种情况下,timeout的值设置得小的话,则在网络情况不佳(就以我们公司的wifi网络为例),容易遗漏设备,timeout值设置过大,则轮询花费的时间太多。TCP的好处在于丢包的问题得以解决,但是轮询太费时间,利用多线程的话,的确可以缩短轮询时间,但是造成的负荷又太大。
        有谁能给我个更好的方案啊?
      

  6.   

    操作有点频繁和占资源了,如果你有路由密码和路由支持IP查询的话直接打开路由页面获取网页就行了
    比如可以直接可以获取http://192.168.2.1/DEV_device.htm
      

  7.   

        最终还是选择了udp广播。
         虽然异步socket连接的速度的确比阻塞型的快很多,但是,还是架不住网络糟糕的情况啊。扫一下全部子网IP地址(254个),慢的时候要一分钟的样子,吃不消啊。
      

  8.   

    楼主能给一个demo吗?我也在做这个 [email protected]
      

  9.   

    希望楼主能给个demo,如何解决这个问题的 十分感谢![email protected]