Android设备如何知道wifi局域网内有多少台主机?

a220315410 2011-06-29 06:54:49
Android设备应该通过何种方式,才能枚举局域网内的所有主机(这里的主机主要是指Android设备)呢?靠发送广播么?还是framework层有提供相关的API支持?还是必须依赖于native层的开发?
...全文
2274 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
iewell 2013-11-28
  • 打赏
  • 举报
回复
希望楼主能给个demo,如何解决这个问题的 十分感谢!iewell@qq.com
  • 打赏
  • 举报
回复
楼主能给一个demo吗?我也在做这个 512573717@qq.com
a220315410 2011-07-11
  • 打赏
  • 举报
回复
最终还是选择了udp广播。
虽然异步socket连接的速度的确比阻塞型的快很多,但是,还是架不住网络糟糕的情况啊。扫一下全部子网IP地址(254个),慢的时候要一分钟的样子,吃不消啊。
a220315410 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fontlose 的回复:]

操作有点频繁和占资源了,如果你有路由密码和路由支持IP查询的话直接打开路由页面获取网页就行了
比如可以直接可以获取http://192.168.2.1/DEV_device.htm
[/Quote]
这个很难保证。。。。。。因为公司的环境只是开发环境,以后的运行环境会怎么样,难说啊
fontlose 2011-07-01
  • 打赏
  • 举报
回复
操作有点频繁和占资源了,如果你有路由密码和路由支持IP查询的话直接打开路由页面获取网页就行了
比如可以直接可以获取http://192.168.2.1/DEV_device.htm
a220315410 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fontlose 的回复:]

恩 这个还是要真机实际测才行
[/Quote]
我使用的一直是真机。
不过,公司的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的好处在于丢包的问题得以解决,但是轮询太费时间,利用多线程的话,的确可以缩短轮询时间,但是造成的负荷又太大。
有谁能给我个更好的方案啊?
fontlose 2011-07-01
  • 打赏
  • 举报
回复
恩 这个还是要真机实际测才行
a220315410 2011-07-01
  • 打赏
  • 举报
回复
昨天尝试了udp广播,udp本来就是不可靠的协议,再加wifi无线网络的不可靠性,根据我的试验,在我们公司的wifi网络下,基本丢包率在50%上下,真的不是很靠谱。。。
a220315410 2011-06-30
  • 打赏
  • 举报
回复
我使用的就是真机,看样子如你所说,的确要装busybox了。

现在,通过google提供的WifiManager类,我已经可以获取当前设备的IP,网关,和子网掩码。这样的话,我已经可以计算出,当前局域网内所有可能的IP地址。
不过使用ping 和 arp -a 这意味着我需要新建一大堆的进程(每ping一次,一个进程,加上arp的进程,假设子网掩码为255,255,255,0,那样的话,总计创建了256条进程),这种方案是不是对于性能不利呢?
fontlose 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 a220315410 的回复:]
arp -a命令是显示本机的ARP缓存表,如果设备不曾连接过局域网内的其他设备的话,arp -a除了返回路由器,别的地址应该都不会返回吧?
而且我使用"adb shell arp" 的结果是arp not found。
[/Quote]
是的 所以前面要一个一个ip试这ping,最后把arp -a就可以显示到在线的ip了
arp not found。不要用模拟器,用真机试试。我用开发板有arp命令。没有就要装busybox了,有很多linux的常用命令
jeky_zhang2013 2011-06-29
  • 打赏
  • 举报
回复
没用过WIFI ,帮顶下
a220315410 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fontlose 的回复:]

在双方没协议的情况下 试试循环Runtime.getRuntime().exec("ping "+ip+"-i 1 -c 2");ping每个IP
Runtime.getRuntime().exec("arp -a >"+savefile);再去处理savefile这个文件

另外就是发送udp广播了,请求方将自身ip和命令广播出去,设备收到命令将自身ip用tcp/udp发送给请求方。
……
[/Quote]
arp -a命令是显示本机的ARP缓存表,如果设备不曾连接过局域网内的其他设备的话,arp -a除了返回路由器,别的地址应该都不会返回吧?
而且我使用"adb shell arp" 的结果是arp not found。
fontlose 2011-06-29
  • 打赏
  • 举报
回复
在双方没协议的情况下 试试循环Runtime.getRuntime().exec("ping "+ip+"-i 1 -c 2");ping每个IP
Runtime.getRuntime().exec("arp -a >"+savefile);再去处理savefile这个文件

另外就是发送udp广播了,请求方将自身ip和命令广播出去,设备收到命令将自身ip用tcp/udp发送给请求方。
每个设备要建立Socket监听广播才可以。

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧