Android10 高通平台 softap热点基本流程2

上一篇讲到SoftApManager.IdleState状态中处理CMD_START消息,这个消息用来打开热点功能。我们从这里继续看热点功能基本流程。

public boolean processMessage(Message message) {
    switch (message.what) {
        case CMD_START:
            WifiConfiguration config = (WifiConfiguration) message.obj;
            mApInterfaceName = mWifiNative.setupInterfaceForSoftApMode(
                                mWifiNativeInterfaceCallback);
            int result = startSoftAp((WifiConfiguration) message.obj);
            transitionTo(mStartedState);
    }
}

这里有两个重要的方法,一个是WifiNative.setupInterfaceForSoftApMode和startSoftAp,现在先看setupInterfaceForSoftApMode的实现。

@WifiNative.java
public String setupInterfaceForSoftApMode(@NonNull InterfaceCallback interfaceCallback) {
    startHal();
    startHostapd()
}

startHal用来启动WIFI hal层代码,对hal进行初始化。将通过HIDL和hal进行通信。

startHal()  -> WifiNative.java
    startVendorHal() -> WifiVendorHal.java
        start() -> HalDeviceManager.java
            mWifi = IWifi.getService(true /* retry */);
            mWifi.start();

mWifi是hal层中实现的一个服务,现在需要进入到hardware/interfaces/wifi/1.3/default/wifi.h 目录下去查看start()的实现。

@hardware/interfaces/wifi/1.3/default/wifi.cpp 
Return<void> Wifi::start(start_cb hidl_status_cb) {
    return validateAndCall(this, WifiStatusCode::ERROR_UNKNOWN,
                            &Wifi::startInternal, hidl_status_cb);
}

WifiStatus Wifi::startInternal() {
    WifiStatus wifi_status = initializeModeControllerAndLegacyHal();
    chip_ = new WifiChip(kChipId, legacy_hal_, mode_controller_,
                            iface_util_, feature_flags_);
    ret
这部分讲的是啥解释一下教会我看1.wifi mac与bssid:通过wifi魔盒/WIFI Service应用查看连接的热点的mac地址,上面显示的实际是bssid值。这个值并不是对端设备的设备mac地址,而是一个随机的mac地址(产线写入的mac地址是设备的mac地址,在随机mac机制下,不会把该地址暴露给其他设备)Android11上,softAP在第一次开启后,后面都是会使用这个随机的mac地址,可以通过以下命令查看:adb shell cat /sys/class/net/wlan0/address,在更改softAP名称的情况下会改变该地址。关于随机mac地址有以下几点请注意:a. 在手机刷机后,开机后不做任何wifi和softAP等动作,执行adb shellcat /sys/class/net/wlan0/address命令,看到的即是设备的mac地址;b. 打开wifi后,不做连接动作,此时执行上述命令,看到的是扫描时使用的随机mac地址,开关wifi该地址会变化;c. 若打开了wifi连接了一个AP,执行上述命令,看到的是针对该AP的随机mac地址,再次连接一个AP之后,该地址会变化,因为会针对第二个AP生成一个随机mac。开关WiFi,连接之前已经保存的网络,执行上述命令,会看到针对特定AP的mac地址是不会变化的,还是第一次连接这个AP时的mac地址;d. softAP和STA共用wlan0的网卡,在开启softAP之后,执行adb shellcat /sys/class/net/wlan0/address看到的就是softAP模式的随机mac地址,当有设备连接时,这个mac地址就是bssid,开关softAP或者更改加密方式2.4G或者5G均不会改变该mac地址,除非更改softAP的名称(ssid) ;在softAP的ssid不变的时候,其对应的随机mac也是不会改变的,这就是为什么测试时,重新开关softAP或者重启,看到的对端的mac仍然是一样的。改变softAP的ssid,则会重新生成随机mac,此时再次观察,就和之前的mac地址不一样了,bssid也会随之改变。从之前项目的情况来看,各平台应该都是这个机制2.展锐wifi mac地址显示的机制:a. 一般需要通过产线工具来烧录mac地址,烧录后保存在/mnt/vendor/wifimac.txtb. 如果没有烧录的话,则有wifi driver产生随机mac地址,保存在/data/vendor/wifi/wifimac—_tmp.txt中相关逻辑代码在bsp/modules/wcn/wlan/sc2355/main.c中的sprdwl_set_mac_addr函数和sprdwl_get_mac_from_file函数目前的wifi mac地址的方案:烧写完软件后,如果有通过工具写入wifi mac地址的话,就会保存在/mnt/vendor/wifimac.txt这个文件中,后续打开wifi的时候,就会从这个文件读取mac地址的。如果没有通过工具写入过mac地址的话,底层的wifi驱动(注意是底层驱动,在kernel 层)就会产生一个随机的mac地址(40:45:da:xx:xx:xx),然后保存在/data/vendor/wifi/wifimac_temp.txt文件中的,后续打开wifi的时候,就会从这个文件读取mac地址的所以,优先是从/mnt/vendor/wifimac.txt读取,没有的话,就从/data/vendor/wifi/wifimac_temp.txt文件读取3.高通wifi mac地址显示的机制:a. 一般项目产线用diag工具写mac地址,会将mac地址存在:/mnt/vendor/persist/wlan_mac.bin,HQ版本会优先读取这个值作为mac地址。b. 索尼项目用FG4写miscTA,将mac地址写入,客户版本会读miscTA分区从而显示mac地址
最新发布
07-18
<think>好的,我现在需要仔细分析用户提供的关于WiFi MAC地址和BSSID的技术文档,并解释其内容。用户可能希望了解不同平台(如展锐、高通)下MAC地址的处理机制,以及Android系统中随机MAC地址的行为。首先,我需要明确文档中的各个部分,特别是关于MAC地址、BSSID、随机生成机制以及不同厂商的具体实现。 用户提到的几个关键点包括:WiFi魔盒工具显示的MAC实际上是BSSID;Android 11中SoftAP使用随机MAC,更改SSID会改变该地址;展锐平台的MAC烧录路径和随机生成逻辑;高通平台的MAC存储位置及写入方法。此外,文档还涉及了不同场景下MAC地址的变化情况,比如刷机后、开启WiFi但未连接时、连接AP后的变化,以及SoftAP的BSSID生成规则。 接下来,我需要将这些信息结构化,用简洁的语言解释每个部分的核心概念和机制。同时,要确保技术术语准确,比如区分BSSID和设备MAC地址,说明随机MAC的作用和生成条件。对于不同厂商的实现差异,需要分别阐述展锐和高通的处理流程,包括文件路径和工具使用。 另外,用户可能对如何实际操作这些命令或验证机制感兴趣,因此在相关问题中可以包括ADB命令的使用、如何检查MAC地址文件、不同平台下的烧录方法等。还要注意文档中提到的测试现象,例如更改SSID导致BSSID变化,以及重启后保持不变的原因,这些都需要在解释中明确。 最后,需要确保回答符合格式要求,使用中文,分点解释,并在末尾生成3-5个相关问题。要避免使用Markdown,保持口语化,但内容要专业且易于理解。同时,检查是否有遗漏的关键点,如产线工具的作用、驱动层的随机生成逻辑等,确保覆盖所有重要信息。</think>该文档详细解释了安卓设备中WiFi MAC地址与BSSID的生成机制,以及不同芯片平台(展锐、高通)的实现差异,核心内容可分为以下三部分: --- ### **1. WiFi MAC与BSSID的随机化机制(以Android 11为例)** - **BSSID ≠ 设备MAC**:通过WiFi魔盒等工具查看的热点MAC地址实际是**BSSID**(接入点标识),而非手机本身的MAC地址。 - **随机MAC地址规则**: - **未连接时**:开启WiFi但未连接任何网络时,系统会生成**扫描用随机MAC**(每次开关WiFi会变化)。 - **连接AP后**:连接特定热点(AP)时,系统会为该AP生成**专属随机MAC**(重新连接同一AP时保持不变)。 - **SoftAP模式(热点共享)**: - BSSID由随机MAC生成,**更改热点名称(SSID)会重置BSSID**。 - SoftAP与STA(连接WiFi)共用同一网卡(wlan0),通过`adb shell cat /sys/class/net/wlan0/address`可查看当前模式下的MAC。 ```bash # 查看当前WiFi/BSSID地址 adb shell cat /sys/class/net/wlan0/address ``` --- ### **2. 展锐平台MAC地址管理** - **优先级逻辑**: 1. **产线烧录**:通过工具写入MAC至`/mnt/vendor/wifimac.txt`(优先读取)。 2. **随机生成**:若未烧录,驱动层(Kernel)自动生成随机MAC(格式如`40:45:da:xx:xx:xx`),保存至`/data/vendor/wifi/wifimac_temp.txt`。 - **代码实现**:核心逻辑位于`bsp/modules/wcn/wlan/sc2355/main.c`中的`sprdwl_set_mac_addr`和`sprdwl_get_mac_from_file`函数。 --- ### **3. 高通平台MAC地址管理** - **产线写入**: - **Diag工具**:写入MAC至`/mnt/vendor/persist/wlan_mac.bin`(HQ版本优先读取)。 - **索尼项目**:通过FG4写入miscTA分区存储MAC(客户版本从该分区读取)。 --- ### **关键测试现象** - **刷机后首次开机**:未操作WiFi时直接查看wlan0地址,显示的是**原始设备MAC**。 - **SoftAP模式**:SSID不变时,重启或开关热点后BSSID保持一致;修改SSID后BSSID重置。 - **跨平台差异**:展锐依赖文件优先级,高通依赖产线工具与分区写入。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值