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.pswp.cn/news/715357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715357.shtml
英文地址,請注明出處:http://en.pswp.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 - …