Android 热点开发调试总结

Android 热点开发调试总结

一、前言

如果开发热点相关功能,必须先掌握基本api知识和相关广播的监听;

热点用的功能基本都是系统签名权限的系统应用,比如Settings;

有些方案中需要设置热点不同的信道值,这个是Settings没有的功能;

本简单介绍热点开发基本知识,有兴趣的可以看看。

二、热点开发

1、开关和默认配置

//开启和关闭
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//开启
connectivityManager.startTethering(TetheringManager.TETHERING_WIFI, true, mCallback, new Handler(Looper.getMainLooper()));
//关闭
connectivityManager.stopTethering(TetheringManager.TETHERING_WIFI);

配置信息:
SoftApConfiguration config = buildNewConfig();
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setSoftApConfiguration(config);

	//SoftApConfiguration 对象信息封装方法
    private SoftApConfiguration buildNewConfig() {
        SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
        int securityType = XXX; //热点0:无密码;1:WPA
        configBuilder.setSsid("" + XXX); //热点名称
        if (securityType != 0) { 
            configBuilder.setPassphrase(passwordXXX, securityType);
        }
        //设置信道和频段,信道值必须和频段匹配否则会异常报错
        //频段:bandXXX:1表示2.4G(范围1-14);2表示5G (范围36-165)
        configBuilder.setChannel(currentChannelXXX,bandXXX);
        return configBuilder.build();
    }

热点配置要关开一次才能生效。

上面的接口方法是适用于Android13 或者更新版本的代码,Android11 设置热点信息接口是不一样的。

wifi和热点配置信息保存的位置:
上层信息:
console: /data/misc/apexdata/com.android.wifi # ls
WifiConfigStore.xml (wifi信息) WifiConfigStoreSoftAp.xml (热点信息)

底层信息:
console:/data/vendor/wifi/hostapd # ls
ctrl  hostapd_wlan1.conf(热点信息,wlan1/ap0)

底层保存的文件不一定所有方案都有,上层文件只要打开过wifi、热点就会生成。

2、主要流程

热点开启接口调用的主要流程如下:

(1)ConnectivityManager.startTethering
(2)TetheringManager.startTethering(request, executor, tetheringCallback)
(3)TetheringService.TetheringConnector.startTethering
(4)Tethering.startTethering(request, listener);
//方法名变化,使用null 对象开启热点
(5)WifiManager.startTetheredHotspot(null /* use existing softap config */)
(6)WifiServiceImpl.startTetheredHotspot(@Nullable SoftApConfiguration softApConfig) 
//方法名再变化
(7)ActiveModeWarden.startSoftAp(apModeConfig);
(8)ActiveModeManager.start();
    ActiveModeManager manager = mWifiInjector.makeSoftApManager(listener, callback, softApConfig);
        listener.setActiveModeManager(manager);
        manager.start();
ActiveModeManager是接口类,会调用到SoftApManager.start()
(9)SoftApManager.startSoftAp()
(10)WifiNative.startSoftAp(mApInterfaceName, localConfigBuilder.build(), mSoftApListener)
(11)HostapdHal.addAccessPoint(ifaceName, config, listener::onFailure)
(12)根据硬件版本调用不同的接口实现:addAccessPoint_X_X

其实从这里可以看到,WifiManager.startTetheredHotspot 也是可以打开热点,只是没有监听回调。

3、相关日志

日志关键字和示例:

热点部分关键字都是:wifi
主要关键字:SoftApManager
底层相关日志:wpa_supplicant、wifi-service、hostapd
其他相关:WifiNative、WifiHAL
节点相关:wlan、ap0

日志过滤示例:
logcat | grep -i wifi
logcat | grep -iE "WifiService|SoftApManager"
logcat | grep -iE "WifiService|SoftApManager|wpa_supplicant|hostapd|WifiNative|WifiHAL|wlan|ap0"

热点正常启动的日志示例:

logcat | grep -iE "WifiService|SoftApManager"
04-25 14:46:39.834   915  3164 I WifiService: setSoftApConfiguration uid=1000 //调用开启热点时间
04-25 14:46:39.946   915  3164 I WifiService: startTetheredHotspot uid=1073
04-25 14:46:40.035   915  1179 D SoftApManager[wlan1]: 11BE is not allowed, removing from configuration //节点日志wlan1
04-25 14:46:40.036   915  1179 D SoftApManager[wlan1]: startSoftAp: channels {1=0} iface wlan1 country CN //频段、信道{1=0}
04-25 14:46:40.087   915  2050 I WifiService: updateInterfaceIpState uid=1073
04-25 14:46:40.215   915  1179 D SoftApManager[wlan1]: Soft AP is started SoftApInfo{bandwidth= 2, frequency= 2447,bssid=56:78:c9:14:65:a2, wifiStandard= 4, mApInstanceIdentifier= wlan1, mIdleShutdownTimeoutMillis= 600000, mVendorData= []}, isRemoved: false
04-25 14:46:40.224   915  1179 D SoftApManager[wlan1]: Timeout message scheduled, on wlan1, delay = 600000 //自动关闭的时间600秒
04-25 14:46:40.266   915  3164 I WifiService: updateInterfaceIpState uid=1073 //更新热点ip
04-25 14:46:40.266   915  1179 D WifiService: updateInterfaceIpState: ifaceName=wlan1 mode=1 previous LOHS mode= -1

从上面日志大致可以看到:

调用开启热点时间,节点日志wlan1,频段、信道{1=0}(framework会随机生成信道值),

自动关闭的时间600秒(10分钟),开启完成更新热点ip,开启完成大概400毫秒 等信息。

如果打开异常,就看哪个过程缺少,查看过程中的异常日志进行分析。

4、相关广播

热点相关广播比较少,主要就是开关变化的广播。

WifiManager.WIFI_AP_STATE_CHANGED_ACTION:热点开关广播

广播返回的热点状态。
  @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {
            int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
            switch (state) {
                case WifiManager.WIFI_AP_STATE_DISABLED:
                    Log.d(TAG, "热点已关闭");
                    break;
                case WifiManager.WIFI_AP_STATE_DISABLING:
                    Log.d(TAG, "热点正在关闭");
                    break;
                case WifiManager.WIFI_AP_STATE_ENABLED:
                    Log.d(TAG, "热点已开启");
                    break;
                case WifiManager.WIFI_AP_STATE_ENABLING:
                    Log.d(TAG, "热点正在开启");
                    break;
                case WifiManager.WIFI_AP_STATE_FAILED:
                    Log.d(TAG, "热点开启失败");
                    break;
            }
        }
    }

正常情况监听开启和关闭+开启失败广播即可。

5、demo示例

demo效果图片如下:
在这里插入图片描述

主要功能:热点开关控制,简单参数设置,自定义参数设置,自定义热点配置;

监听热点开关变化后,更新热点ip,国家码等信息。

后续提供了apk的源码和 3588 AN15 、311D2 AN13 签名的Demo apk;

如果不想重新编译apk,可以放到源码中,替换之前某个apk,重新编译也会生成对应系统签名的apk。

源码和apk下载地址:

https://download.csdn.net/download/wenzhi20102321/90714296

新开的方案有可能遇到只能打开2.4G热点或者只能打开未设置信道的5G热点;

其他情况打开热点会失败,这种情况需要驱动底层先分析解决。

三、其他

1、Android 热点开发调试小结

(1)热点开关可以通过ConnectivityManager或者WifiManager对象的接口控制
(2)修改热点配置的接口是:WifiManager.setSoftApConfiguration
(2)热点相关接口的调用一般要系统签名权限,所以开发热点基本都是系统应用;

2、其他热点相关知识小结

(1)Android11 热点开启流程

Android11 热点framework 中上层的代码逻辑进行梳理 :

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

(2)Android11 热点配置信息保存分析

分析热点保存/获取热点信息过程,热点配置文件生成的具体文件位置:

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

(3)Android 实现热点开机后自动开启

Android 热点是有api设置永久开启,热点名称,热点密码等接口,但是“永久开启”实际上是不自动关闭,重启设备后热点并不会自动开启。

Android Wifi实现开关状态记忆是基于Settings.GLOBAL.WIFI_ON属性,

所以热点如果要实现状态记忆那么也是要设置一个Settings属性或者prop属性,

系统启动后判断属性决定是否启动热点就可以实现热点状态记忆了。

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

(4)Android 热点二维码简单示例

Android 原生设置有热点二维码分享功能,有些系统应用也会有这个需求。

简单demo如下:

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

(5)Android11 热点Band值为3
1、band=3,是在Band=2并且channel=0的情况出出现
2、band=3 会在 ApConfigUtil.updateApChannelConfig 方法中重新设置band和channel值
3、band=3 的情况,会先判断是否支持5G频段热点,如果支持会返回5G 对应的channel和band,否则判断2.4G热点

详细分析如下:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值