Android13 设置固定热点ip地址192.168.43.1

Android13 设置固定热点ip地址192.168.43.1

文章目录

  • Android13 设置固定热点ip地址192.168.43.1
    • 一、前言
    • 二、设置固定ip地址实现
      • 1、Android13 代码中的实现:
          • 添加属性写法:
      • 2、Android11 或者更旧的代码中的实现:
    • 三、其他
      • 1、Android 代码获连接的wifi 的 ip地址:
      • 2、获取热点的ip地址
        • (1)adb 获取ip地址
        • (2)Android 代码获取所有网络的ip地址和MAC地址:
        • (3)Android 代码获取热点的 ip地址:
        • (4)动态设置热点ip的代码?
        • (5)热点开启流程

一、前言

Android 热点ip一般的系统都是随机生成的,地址一般是:192.168.XX.XX

如果要设置成一个固定的ip地址,就需要适配系统代码。

相关的适配代码主要都在 IpServer.java 里面。

为啥要设置固定热点ip?
一般是投屏软件需求,或者其他一些开机或者打开热点后被自动连接场景的需求。

二、设置固定ip地址实现

1、Android13 代码中的实现:

release\packages\modules\Connectivity\Tethering\src\android\net\ip\IpServer.java

private boolean configureIPv4(boolean enabled) {if (VDBG) Log.d(TAG, "configureIPv4(" + enabled + ")");if (enabled) {//以前的随机的ip地址//mIpv4Address = requestIpv4Address(true /* useLastAddress */);//换成自定义的ip地址mIpv4Address = new LinkAddress("192.168.43.1/24");}。。。。
}

就是这么简单,设置一下开启热点前请求到的ipv4地址就可以了。

从代码大致可以看到,如果未做修改的情况这里热点的默认ip是从上一次存在的热点ip,当然第一次还是随机生成的。

添加属性写法:

如果要添加属性判断设置,后期可以动态修改,那么可以设置一下prop属性。具体修改如下:

import android.os.SystemProperties;private boolean configureIPv4(boolean enabled) {if (VDBG) Log.d(TAG, "configureIPv4(" + enabled + ")");if (enabled) {//set hotspot addr of this constant by  liwenzhiboolean isRandomIp = SystemProperties.getBoolean("persist.sys.dubug.random_hostip", false);if (isRandomIp) {mIpv4Address = requestIpv4Address(true /* useLastAddress */);} else { //默认是固定ipmIpv4Address = new LinkAddress("192.168.43.1/24");}}。。。。
}

2、Android11 或者更旧的代码中的实现:

release\frameworks\base\packages\Tethering\src\android\net\ip\IpServer.java

    private boolean configureIPv4(boolean enabled) {if (VDBG) Log.d(TAG, "configureIPv4(" + enabled + ")");if (enabled) {//以前的随机的ip地址//mIpv4Address = requestIpv4Address();//换成自定义的ip地址mIpv4Address = new LinkAddress("192.168.43.1/24");}}

不同版本上,代码的修改都是差不多的,只是 IpServer.java 这个类的位置有改变。

3、Android13 获取热点ip的过程

release\packages\modules\Connectivity\Tethering\src\android\net\ip\IpServer.java

private boolean configureIPv4(boolean enabled) {if (VDBG) Log.d(TAG, "configureIPv4(" + enabled + ")");if (enabled) {mIpv4Address = requestIpv4Address(true /* useLastAddress */);}。。。。
}private final PrivateAddressCoordinator mPrivateAddressCoordinator;private LinkAddress requestIpv4Address(final boolean useLastAddress) {if (mStaticIpv4ServerAddr != null) return mStaticIpv4ServerAddr;if (shouldNotConfigureBluetoothInterface()) return new LinkAddress(BLUETOOTH_IFACE_ADDR);//在其他对象中获取return mPrivateAddressCoordinator.requestDownstreamAddress(this, useLastAddress);
}

所以具体实现是在 PrivateAddressCoordinator 对象的 requestDownstreamAddress 方法中。

release\packages\modules\Connectivity\Tethering\src\com\android\networkstack\tethering\PrivateAddressCoordinator.java

    /*** Pick a random available address and mark its prefix as in use for the provided IpServer,* returns null if there is no available address.*/@Nullablepublic LinkAddress requestDownstreamAddress(final IpServer ipServer, boolean useLastAddress) {if (mConfig.shouldEnableWifiP2pDedicatedIp()&& ipServer.interfaceType() == TETHERING_WIFI_P2P) {return new LinkAddress(LEGACY_WIFI_P2P_IFACE_ADDRESS);}final LinkAddress cachedAddress = mCachedAddresses.get(ipServer.interfaceType());if (useLastAddress && cachedAddress != null&& !isConflictWithUpstream(asIpPrefix(cachedAddress))) {mDownstreams.add(ipServer);return cachedAddress;}for (IpPrefix prefixRange : mTetheringPrefixes) {final LinkAddress newAddress = chooseDownstreamAddress(prefixRange);if (newAddress != null) {mDownstreams.add(ipServer);mCachedAddresses.put(ipServer.interfaceType(), newAddress);return newAddress;}}// No available address.return null;}

有兴趣的可以自己在源码中查看,Android11 和Android13 的具体获取过程有很大的差异。

上面就是本文的主要内容,下面是其他相关内容,有兴趣可以继续看看。

三、其他

1、Android 代码获连接的wifi 的 ip地址:

public static String getWifiIpAddress(Context context) {WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);if (!wifiManager.isWifiEnabled()) {// Wi-Fi is not enabled, return null or handle the case accordinglyreturn null;}int ipAddress = wifiManager.getConnectionInfo().getIpAddress();byte[] bytes = new byte[4];for (int i = 0; i < 4; ++i) {bytes[i] = (byte)(ipAddress >> ((3 - i) * 8));}StringBuilder sb = new StringBuilder();for (byte b : bytes) {sb.append((b & 0xFF)).append(".");}sb.deleteCharAt(sb.length() - 1);return sb.toString();}

要调用这段代码并获得热点的 IP 地址,只需传入一个有效的 Context 对象作为参数,然后调用 getWifiIpAddress() 方法即可。

2、获取热点的ip地址

(1)adb 获取ip地址

adb shell ifconfig

console:/ # ifconfig                                                           wlan0     Link encap:Ethernet  HWaddr 38:64:07:88:6a:f6  Driver usbUP BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:0 TX bytes:0 
。。。ap0       Link encap:Ethernet  HWaddr 3e:ea:29:0a:07:d9inet addr:192.168.43.1  Bcast:192.168.43.255  Mask:255.255.255.0 inet6 addr: fe80::3cea:29ff:fe0a:7d9/64 Scope: LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:9 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 TX bytes:1450 

一般情况热点的节点名称都是ap0,可以看到ip地址和相关信息。上面的wifi未连接所以才没有ip地址。

(2)Android 代码获取所有网络的ip地址和MAC地址:

Android 热点ip地址 IpServer 和相关的类都是隐藏的所以无法上Wifi那样通过api获取到ip地址,

但是可以通过遍历节点的数据,获取到ip地址,

wifi、有线网、热点的ip地址和节点相关的信息都可以这样获取到:

    /*** 获取ip地址,key为网络端口名称,比如wlan0、eth0、ap0等,value为ip地址,以及节点相关的MAC地址** @return 键值对*/private HashMap<String, String> getNetIPs() {HashMap<String, String> hashMap = new HashMap<>();try {for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {NetworkInterface intf = en.nextElement(); //打印的信息和 ifconfig 的大致对应Log.i(TAG, "----》getEtherNetIP inf = " + intf); //eth0、wifi...for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {InetAddress inetAddress = enumIpAddr.nextElement();if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {Log.i(TAG, "----》getEtherNetIP intf.getName() = " + intf.getName());Log.i(TAG, "----》getEtherNetIP inetAddress = " + inetAddress);Log.i(TAG, "----》getEtherNetIP inetAddress  getHostAddress = " + inetAddress.getHostAddress());byte[] hardwareAddress = intf.getHardwareAddress();//节点对应的ip地址hashMap.put(intf.getName(), "" + inetAddress.getHostAddress());//节点对应的MAC地址,mac地址是byte数值数据,要转换成字符串String mac = bytesToString(hardwareAddress);hashMap.put(intf.getName() + "-MAC", "" + mac);}}}} catch (SocketException ex) {Log.e(TAG, "getEtherNetIP = " + ex.toString());}return hashMap;}//字节数据转换成字符串public static String bytesToString(byte[] bytes) {if (bytes == null || bytes.length == 0) {return null;}StringBuilder buf = new StringBuilder();for (byte b : bytes) {buf.append(String.format("%02X:", b));}if (buf.length() > 0) {buf.deleteCharAt(buf.length() - 1);}return buf.toString();}

上面是获取了ifconfig信息 节点上 Inet4Address 类型的所有信息,如果只要获取热点的ip地址,可以这样写:

(3)Android 代码获取热点的 ip地址:

主要代码:

    /*** 获取热点ip地址字符串*/private String getHotspottIPs() {try {for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {NetworkInterface intf = en.nextElement(); //打印的信息和 ifconfig 的大致对应Log.i(TAG, "----》getEtherNetIP inf = " + intf); //eth0、wifi...for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {InetAddress inetAddress = enumIpAddr.nextElement();if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address && "ap0".equals(intf.getName())) { //判断热点的节点名称ap0,如果不是ap0,就自己修改return "" + inetAddress.getHostAddress();}}}} catch (SocketException ex) {Log.e(TAG, "getEtherNetIP = " + ex.toString());}return "";}

上面的获取热点ip的方法,是不用Context对象,不用权限,普通应用就能调用和获取到信息,验证过是ok的。

所以WiFi、有线网这些网络的ip地址也可以参考这样获取。

网上搜到的通过 ConnectivityManager 获取WifiManager 相关接口获取的代码,都是获取不到热点ip地址的。

即使通过反射也是无法获取到热点相关信息的,因为不仅相关方法是隐藏的,相关类也是被隐藏的,

所以一般的反射手段是无法获取到热点ip的。

(4)动态设置热点ip的代码?

从网上其他文章上看到这样一段设置热点ip的代码:

  InterfaceConfiguration ifcg = mNwService.getInterfaceConfig(intf);                               if (ifcg != null) {                                                       /* IP/netmask: 192.168.43.1/255.255.255.0 */                          ifcg.setLinkAddress(new LinkAddress(                                  NetworkUtils.numericToInetAddress("192.168.43.1"), 24));      ifcg.setInterfaceUp();                                                mNwService.setInterfaceConfig(intfaceName, ifcg); //intfaceName 是节点名称,比如"ap0"                       
}                                                       

在普通应用试了下是没有 InterfaceConfiguration这个类的,需要那些导入了framework的系统才可以找到这些类和调用这些api。

这个段代码并没有进行尝试,怀疑是不一定能设置到固定的ip的;

因为开启热点不是这种代码,还需要配置相关信息的;

并且尝试ifconfig ap0 down再,ifconfig ap0 up,默认是没有热点ip的,

所以不经过某些系统流程是无获取到ip地址的。

有兴趣的可以自己尝试研究看看。

(5)热点开启流程

系统源码追踪:

1、ConnectivityManager.startTethering
2、TetheringManager.startTethering
3、TetheringService.TetheringConnector.startTethering
4、Tethering.startTethering(request, listener);
5、WifiManager.startTetheredHotspot(null /* use existing softap config */)
6、WifiServiceImpl.startTetheredHotspot(@Nullable SoftApConfiguration softApConfig)
7、ActiveModeWarden.startSoftAp(apModeConfig);
8、ActiveModeManager.start();
10、WifiNative.startSoftAp
11、HostapdHal.addAccessPoint

热点开启流程原文链接:

https://blog.csdn.net/wenzhi20102321/article/details/128473734

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中学习调试requests模块时出现的大坑(1)

为防止迷路: 学习机械相关,请关注公众号:南大盛联 学习软件,硬件,请关注公众号号:一训微课 cmd模式下 不知道上面这行的话,需要补课。 pip install requests 这个不知道的话,也要补课 pip是python的安装工具。 install是安装的意思 requests是我们需要安装的模…

HTML超链接去下划线

当在HTML中创建超链接时&#xff0c;默认情况下会显示为带有下划线的蓝色文本。如果想要去掉下划线&#xff0c;可以使用CSS样式来实现。 示例代码&#xff1a; <!DOCTYPE html> <html> <head> <style> a {text-decoration: none;color: blue; /* 设…

微信小程序 --- 事件处理

事件处理 一个应用仅仅只有界面展示是不够的&#xff0c;还需要和用户做交互&#xff0c;例如&#xff1a;响应用户的点击、获取用户输入的值等等&#xff0c;在小程序里边&#xff0c;我们就通过编写 JS 脚本文件来处理用户的操作 1. 事件绑定和事件对象 小程序中绑定事件与…

sora会是AGI的拐点么?

©作者|谢国斌 来源|神州问学 OpenAI近期发布的Sora是一个文本到视频的生成模型。这项技术可以根据用户输入的描述性提示生成视频&#xff0c;延伸现有视频的时间&#xff0c;以及从静态图像生成视频。Sora可以创建长达一分钟的高质量视频&#xff0c;展示出对用户提示的精…

PoC免写攻略

在网络安全领域&#xff0c;PoC&#xff08;Proof of Concept&#xff09;起着重要的作用&#xff0c;并且在安全研究、漏洞发现和漏洞利用等方面具有重要的地位。攻击方视角下&#xff0c;常常需要围绕 PoC 做的大量的工作。常常需要从手动测试开始编写 PoC&#xff0c;再到实…

vue项目电商

这个项目功能有首页&#xff0c;分类&#xff0c;商品详情&#xff0c;购物车&#xff0c;用户注册、登录等等的实现&#xff0c;并且可以在手机上进行展示。 git仓库地址&#xff1a;https://gitee.com/BisShen/project.git

应用层http协议包解析与https加密策略解析

文章目录 一.应用层协议--http协议基础认知二.https协议加密策略解析加密策略1--通信双方只使用对称加密加密策略2--通信双方使用单方非对称加密加密策略3--通信双方都使用非对称加密加密策略4--非对称加密与对称加密配合使用中间人攻击数据签名与CA证书HTTPS数据安全认证的本质…

二维码门楼牌管理系统技术服务的分类与应用

文章目录 前言一、二维码门楼牌管理系统的分类二、二维码门楼牌管理系统的应用优势三、结论 前言 随着城市管理的精细化和智能化&#xff0c;二维码门楼牌管理系统成为了现代城市管理的重要工具。该系统将传统的门牌、楼牌、户牌与二维码技术相结合&#xff0c;实现了信息的快…

如何优化一个运行缓慢的SQL查询?有哪些常见的优化技巧?

如何优化一个运行缓慢的SQL查询&#xff1f; 当面对一个运行缓慢的SQL查询时&#xff0c;优化是提升数据库性能的关键步骤。优化查询不仅可以减少查询执行时间&#xff0c;还可以降低系统资源消耗&#xff0c;提高整体的系统吞吐量。以下将详细探讨如何优化一个运行缓慢的SQL查…

MySQL:常用的SQL语句

提醒&#xff1a;设定下面的语句是在数据库名为 db_book执行的。 一、创建表 1. 创建t_booktype表 USE db_book; CREATE TABLE t_booktype(id INT AUTO_INCREMENT, bookTypeName VARCHAR(20),bookTypeDesc varchar(200),PRIMARY KEY (id) );2. 创建t_book表 USE db_book; C…

[笔记] wsl 禁用配置 win系统环境变量+代理

wsl 配置禁用 win系统环境变量 进入 wsl 的 /etc/wsl.conf 目录&#xff0c;增加以下配置&#xff1a; [interop] enabledfalse appendWindowsPathfalse然后退出wsl&#xff0c;并且执行关闭正在运行的 wsl&#xff0c;执行命令 wsl --shutdown 最后重新进入wsl 即可。 参考…

C语言-----动态内存管理(1)

1.引入 我们之前已经学习了几种开辟内存空间的方式&#xff1a; &#xff08;1&#xff09;int a10;开辟4个字节大小的空间 &#xff08;2&#xff09;int arr[10]{0}定义数组开辟了一串连续的空间 2.malloc和free (1)malloc开辟内存空间可能会失败&#xff0c;因此需要检查…

HTML5+CSS3+JS小实例:文字阴影还能这么玩

实例:文字阴影还能这么玩 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"…

Android java基础_泛型

一.java泛型是什么 Java 泛型&#xff08;Generic&#xff09;是 Java 5 中引入的一种特性&#xff0c;它允许类、接口和方法在定义时使用一个或多个类型参数&#xff0c;这些类型参数在调用时会被实际类型替换&#xff0c;从而增强了代码的重用性和类型安全性。通过使用泛型&…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:形状裁剪)

用于对组件进行裁剪、遮罩处理。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 clip clip(value: boolean | CircleAttribute | EllipseAttribute | PathAttribute | RectAttribute) 按指定的形状对当…

Spring基础——XML配置Bean的实例化

目录 实例化Bean的方式使用构造函数实例化Bean使用静态工厂的方式实例化Bean使用实例化工厂方式实例化Bean通过实现FactoryBean自定义实例化Bean 实例化Bean的方式 bean的创建本质上就是创建一个或多个具有外部配置属性的对象&#xff0c;容器在启动的时候会查看命名Bean的配置…

中美加密监管突传“巨响”!比特币突破7万信号出现!马斯克一句话掀起大行情!

比特币本周触及64000美元高价&#xff0c;2月交易所储备减少近45000多枚比特币&#xff0c;市场将其解读为看涨70000美元的关键信号。中美加密监管传利好&#xff0c;香港加密牌照申请期限结束&#xff0c;已有24家机构入列待批&#xff0c;美国考虑允许比特币ETF及相关信托期权…

uview2中上传文件和若依前后端分离配合的代码

uview2中的上传文件需要配合着自己后端的上传的代码 uview2 代码&#xff1a; uploadFilePromise(url) {return new Promise((resolve, reject) > {// 后续自己封装let a uni.uploadFile({//自己的请求路径url: that.$baseURL /uploadAvater, //上传的文件filePath: tha…

Java | vscode如何使用命令行运行Java程序

1.在vscode中新建一个终端 2.在终端中输入命令 javac <源文件>此命令执行后&#xff0c;在文件夹中会生成一个与原java程序同名的.class文件。然后输入如下命令&#xff1a; java <源文件名称>这样java程序就运行成功了。&#x1f607;

LeetCode:2368. 受限条件下可到达节点的数目(dfs Java)

目录 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 2368. 受限条件下可到达节点的数目 题目描述&#xff1a; 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - …