前言:
遇到一个Android+web服务的项目, 做app端时遇到要扫描wifi内的其他ip地址, 之后在网上找了好久, 试过WifiManager不过只能获取bssid,据说就是mac地址,但不是ip啊,然后想使用android底层的Linus的shell命令,搞了不天也不懂...好在最后参考网上帖子. 总算是有眉目了,但是后边说项目不用了,我去...但是不能浪费,
虽然不是完全版,还有问题,但是可以运行,或许以后用的着.另外,不喜勿喷!
思路:
app连接wifi后,会存在一个ip地址, 和电脑一样,那么局域网内的其他机器也在这个网段, 所以
通过本地ip获得相应网段,然后通过ping遍历网段ip,获取同网段局域网ip,以达到目的!
代码:
1,给app分配权限
<!--允许应用程序改变网络状态-->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--允许应用程序改变WIFI连接状态-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--允许应用程序访问WIFI网卡的网络信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许应用程序完全使用网络-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--允许访问网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2,NetUtil.java
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.util.Log;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
/**
* 获得当前网络信息,已经扫描同网段的ip
* Created by Albert.Ma on 2015/8/25.
*/
public class NetUtil {
private Context context;
private String localIpAddress;//本地ip地址 如 192.168.0.1
private String networkSegment;//本地网段 如 192.168.0.
private int ipIndex;//ip最后位 如 1
private volatile List<String> ipListInSameSegment = new ArrayList<>();//存放同网段的ip
private boolean isRoot=false;//是否root
private String ping = "ping -c 3 -w 10 ";//-c 是指ping的次数 -w 100 以秒为单位指定超时间
private Runtime runtime = Runtime.getRuntime();
private Process process = null;
//定义WifiManager对象
private WifiManager mWifiManager;
//定义WifiInfo对象
private WifiInfo mWifiInfo;
//扫描出的网络连接列表
private List<ScanResult> mWifiList;
//网络连接列表
private List<WifiConfiguration> mWifiConfiguration;
//定义一个WifiLock
WifiManager.WifiLock mWifiLock;
//判断是否root
private final static int kSystemRootStateUnknow = -1;
private final static int kSystemRootStateDisable = 0;
private final static int kSystemRootStateEnable = 1;
private static int systemRootState = kSystemRootStateUnknow;
public NetUtil(Context context){
this.context = context;
//取得WifiManager对象
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
//取得WifiInfo对象
mWifiInfo = mWifiManager.getConnectionInfo();
mWifiManager.startScan();
//得到扫描结果
mWifiList = mWifiManager.getScanResults();
//得到配置好的网络连接
mWifiConfiguration = mWifiManager.getConfiguredNetworks();
//设置本地ip
String ip = getLocalIpAddress().toString();
localIpAddress = ip.substring(1, ip.length());
networkSegment = this.localIpAddress.substring(0, this.localIpAddress.lastIndexOf(".") + 1);
}
/**
* 获取本地ip
*/
public InetAddress getLocalIpAddress() {
int hostAddress = mWifiInfo.getIpAddress();
byte[] addressBytes = { (byte)(0xff & hostAddress),
(byte)(0xff & (hostAddress >> 8)),
(byte)(0xff & (hostAddress >> 16)),
(byte)(0xff & (hostAddress >> 24)) };
try {
return InetAddress.getByAddress(addressBytes);
} catch (UnknownHostException e) {
throw new AssertionError();
}
}
/**
* 扫描同网段的ip
*/
public List<String> scanIpInSameSegment(){
if(this.localIpAddress == null || "".equals(this.localIpAddress)){
// Toast.makeText(context, "扫描失败,请检查wifi网络", Toast.LENGTH_LONG).show();
return null;
}
if(!NetUtil.isRootSystem()){
Toast.makeText(context, "扫描网络ip需要root权限,请先root后再尝试!", Toast.LENGTH_LONG).show();
return null;
}
//产生256个线程测试ip
for(int i=0;i<256;i++){
ipIndex = i;
new Thread(new Runnable() {
@Override
public synchronized void run() {
String currentIp = networkSegment + ipIndex;
String command = ping + currentIp;
try {
process = runtime.exec(command);
int result = process.waitFor();
if (result == 0) {
System.out.println("连接成功:" + currentIp);
Log.i("IP", "连接成功:" + currentIp);
ipListInSameSegment.add(currentIp);
} else {
System.out.println("连接失败:" + currentIp);
Log.i("IP", "连接失败:" + currentIp);
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e2) {
e2.printStackTrace();
} finally {
process.destroy();
}
}
}).start();
}
return ipListInSameSegment;
}
/**
* 获得root权限
*/
public void getRootPermission(){
if(NetUtil.isRootSystem()){
return;
}
try {
String rootCommand = "su";
process = runtime.exec(rootCommand);
int result = process.waitFor();
if (result == 0) {
this.isRoot = true;
Log.i("IP", "Root成功");
Toast.makeText(context, "Root成功", Toast.LENGTH_SHORT).show();
} else {
Log.i("IP", "Root失败");
Toast.makeText(context, "Root失败", Toast.LENGTH_SHORT).show();
}
// //输出结果
// BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
// String line = null;
// while ((line = in.readLine()) != null) {
// Log.i("IP", ">>>:" + line);
// }
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 判断是否已经root
*/
public static boolean isRootSystem() {
if (systemRootState == kSystemRootStateEnable) {
return true;
} else if (systemRootState == kSystemRootStateDisable) {
return false;
}
File f = null;
final String kSuSearchPaths[] = { "/system/bin/", "/system/xbin/",
"/system/sbin/", "/sbin/", "/vendor/bin/" };
try {
for (int i = 0; i < kSuSearchPaths.length; i++) {
f = new File(kSuSearchPaths[i] + "su");
if (f != null && f.exists()) {
systemRootState = kSystemRootStateEnable;
return true;
}
}
} catch (Exception e) {
}
systemRootState = kSystemRootStateDisable;
return false;
}
}
3,调用
NetUtil netUtil =new NetUtil(this);
netUtil.getRootPermission();
List<String> ipList = netUtil.scanIpInSameSegment();
String ips ="扫描到的ip:\n";
for(String str:ipList){
ips+=str+"\n";
}
Toast.makeText(LoginActivity.this,ips,Toast.LENGTH_SHORT).show();
4.效果
5.说明
NetUtil包括调用android内的WifiManger,通过它获得本地wifi信息包括ip(例如192.168.0.1), 获得网段,也就是192.168.0.X,X代表要遍历的ip最后一段,其中使用当前运行时状态,用来ping其他ip测试是否连通,注意:
使用Runtime.exec(command)ping时,必须获得root权限,否则不同.这也是网上很多的ping例子但是,不通的原因,或许像我这种小白菜不知道要root.这让我浪费好多时间啊 .然后NetUtil后边有获取root和判断是否root的方法.
6.权限问题
里面使用256个进程去ping, 这里没有做处理,导致主线程运行完了,这256个线程还没跑完, 返回的结果可能不对,需要使用debug,让256个线程跑完后再继续运行主线程才能到达预期效果. 提供个连接或许能有帮助 http://blog.csdn.net/escaflone/article/details/10418651
- 大小: 242 KB
- 大小: 240 KB
分享到:
相关推荐
用户通过搜索或扫描二维码,瞬间即可开启使用,享受快速加载、流畅运行的服务。 该小程序界面设计简洁明了,布局合理,易于上手。同时,其特色功能如实时更新的信息推送、个性化推荐以及社交分享功能,让用户能够...
一般情况下,我们可以通过扫描WiFi网络接口来获取MAC地址: ```java public String getMacAddress() { try { List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); ...
总结起来,搜索同一WiFi局域网中的IP地址是通过Android的`WifiManager`服务获取网络配置,然后使用`InetAddress`的ping功能来检测活动设备。这个过程涉及网络编程、设备间通信和多线程等技术,对于开发涉及网络交互...
在现代生活中,手机已经成为我们日常信息交流和娱乐的重要工具,而通过WiFi进行局域网内的文件传输则大大提升了效率。本篇文章将详细讲解如何利用手机的WiFi功能在局域网内实现文件的传递,主要涉及的技术点包括WiFi...
WiFi Tools工具具有简单、直观的界面,因此您可以在几秒钟内收到有关您网络的完整信息,找出内部或外部IP(具有“我的IP”功能)、SSID、BSSID、广播地址、网关、网络掩码、国家、地区、城市、提供商的地理坐标...
2、用于扫描当前wifi或是局域网下的联网设备,可现实设备IP、Mac地址、设备名称; 3、可用于识别树莓派IP、打印机或扫描仪等局域网下的各类设备IP; 4、安卓端软件为无广告优化版,如果安卓apk用不了的话尝试使用...
在Android平台上,Wi-Fi开发是一项重要的技术,它允许设备通过无线局域网(WLAN)进行通信,实现数据的高速传输。本示例主要涵盖了Wi-Fi的搜索、连接以及数据传输这三个关键环节,这对于构建涉及网络通信的Android...
通过WiFi调试,开发者可以在同一局域网内的电脑上无线连接到Android设备,实现代码的实时部署和调试。 开启WiFi调试的步骤大致如下: 1. 在Android设备上,进入“设置” -> “关于手机” -> “软件信息”,连续点击...
在Android系统中,WiFi功能是移动设备连接到无线局域网(WLAN)的主要途径,为用户提供高速的数据传输。本文将深入探讨Android WiFi原理,帮助理解其工作流程、API使用及其实现机制。 首先,我们要了解Android系统...
1. **开启和扫描WiFi Direct**: - 首先,需要检查设备是否支持WiFi Direct并开启该功能。这通常涉及到获取`WifiP2pManager`实例,然后调用`discoverPeers()`方法进行扫描。 2. **连接到其他设备**: - 扫描完成...
6. **Android权限管理**:在E4A中进行WiFi通信,需要获取相应的Android权限,如ACCESS_FINE_LOCATION和INTERNET,确保程序能够访问网络和定位服务。 7. **数据格式转换**:由于E4A和单片机可能使用不同的数据表示...
WiFi模块是Android系统中一个重要的组成部分,它负责处理设备的无线局域网接入功能。WiFi模块主要包括以下几个方面: 1. **状态管理**:包括设备的启用、禁用及连接状态等。 2. **权限管理**:确保应用程序能够安全...
标题 "安卓手机(android)wifi传送文件源码.rar" 提供的是一个用于在安卓设备间通过Wi-Fi进行文件传输的应用程序源代码。这个项目可能是为了帮助开发者了解如何在没有使用蓝牙或者外部网络的情况下,利用本地Wi-Fi...
6. 配置IP地址:通常在连接AP后,Android会自动分配IP地址。如果需要手动设置,可以使用`DhcpInfo`类。 以下是一个简单的Java代码示例,展示了如何在Android活动中控制WIFI: ```java public class WifiActivity ...
在Android系统中,WiFi管理是至关重要的功能,它允许设备连接到无线局域网(WLAN)以获取网络访问。本篇文章将深入探讨Android WiFi管理的相关知识点,包括API的使用、信号强度监控、网络连接管理和优化策略。 首先...
提到"当前Wifi IP"这个标签,它涉及的是获取设备当前连接的Wi-Fi的IP地址。在Android中,使用`WifiManager`的`getConnectionInfo()`方法可以获取`WifiInfo`对象,其中包含了IP地址;在iOS中,可以使用`Reachability`...
移远FC20模块是这些模块中的一种,它可能包含无线局域网(WiFi)技术,允许设备接入WiFi网络,实现数据交换和远程控制。 WiFi工作原理基于IEEE 802.11标准,它通过无线电波在短距离内传输数据。当移远FC20启动WiFi...
在APICloud Studio中,选择“真机预览”功能,按照提示配置好设备的IP地址和端口号,确保设备和电脑在同一局域网内。 #### 2. 扫码连接 在手机端安装APICloud的预览APP,打开后会显示一个二维码。在APICloud Studio...
为了保证用户友好,开发者可能会设计一个简洁的用户界面,让用户能够输入服务器的IP和端口,或者扫描二维码自动填充这些信息。此外,还有可能提供了数据发送和接收的界面,例如文本框用于输入要发送的信息,以及显示...
WiFi热点是通过无线局域网(WLAN)技术建立的一个无线访问点,它能够将有线网络连接转换为无线信号,让附近的设备能够通过WiFi连接上网。在移动设备上,如智能手机或平板电脑,用户可以设置自己的设备作为热点,供...