如何从安卓系统中获取扫描到的 Wi‑Fi 的 MAC 地址和 RSSI?

在移动定位、网络分析或 Wi‑Fi 工程中,我们经常需要获取周围 Wi‑Fi 的 BSSID(AP MAC 地址)RSSI(信号强度)。本文将分层解析 Android 系统获取这些信息的全过程,并说明每一层的职责与责任方。


一、应用层(App / SDK)

职责

  • 调用系统提供的 API 发起扫描

  • 获取扫描结果并解析 BSSIDRSSI

  • 做权限检查(如定位权限)

主要接口

Android 提供 WifiManagerScanResult

java 复制代码
WifiManager wifiManager =
    (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

wifiManager.startScan();

List<ScanResult> results = wifiManager.getScanResults();
for (ScanResult result : results) {
    String bssid = result.BSSID;   // AP MAC 地址
    int rssi = result.level;       // 信号强度,单位 dBm
}

权限要求

  • Android 8+:必须有 ACCESS_FINE_LOCATION 权限

  • 系统定位开关必须开启

  • 扫描频率受系统限制

责任方:应用开发者,需遵守系统权限与隐私要求。


二、Android Framework 层(系统服务)

职责

  • 管理 Wi‑Fi 服务,如 WifiServiceWifiScanningService

  • 调度扫描任务、缓存结果

  • 权限验证与结果封装

数据流

App → WifiManager → WifiService → WifiScanningService → WifiNative → HAL

  • ScanResultBSSIDRSSI 由底层提供

  • Framework 不计算 RSSI,仅做权限与结构封装

责任方:Android 系统开发团队(Framework 层)


三、HAL 层(硬件抽象层)

职责

  • 为 Framework 提供标准接口

  • 转发扫描命令到底层驱动

  • 接收驱动返回的扫描结果并返回给 Framework

特点

  • 数据结构如:
cpp 复制代码
struct wifi_scan_result {
    mac_addr bssid;
    int rssi;
    int frequency;
    char ssid[32];
};

责任方:设备厂商(Vendor),提供 HAL 实现。


四、Linux 内核层(驱动)

职责

  • 控制 Wi‑Fi 模块执行扫描

  • 解析接收到的 802.11 帧

  • 提取 AP 的 MAC 地址(BSSID) 和信号强度(RSSI)

数据流

Firmware → Wi‑Fi Driver → cfg80211 → nl80211 → HAL

  • RSSI 来自 PHY 层测量

  • BSSID 来自 Beacon 或 Probe Response 帧头

责任方:芯片厂商 / 驱动开发者


五、Firmware 层(芯片固件)

职责

  • 控制 RF 模块与基带处理

  • 扫描信道并测量信号功率

  • 将测量结果传给驱动

特点

  • RSSI 可能经过平滑或校准

  • 不同芯片精度略有差异

责任方:芯片厂商(如 Qualcomm、MTK、Broadcom)


六、硬件模组层(物理天线与射频)

职责

  • 天线接收无线信号

  • RF 模块放大、下变频

  • ADC 转换为数字信号

  • PHY 层计算 RSSI

关键点

  • BSSID:AP 自身广播的物理 MAC

  • RSSI:接收信号功率,单位 dBm

责任方:芯片和模组制造商


七、总结

整个 Wi‑Fi 扫描与信息获取链路分为六层:

层级 职责 责任方
应用层 发起扫描、获取结果、权限管理 应用开发者
Framework 调度扫描、封装结果、权限检查 Android 系统
HAL 标准接口转发、数据结构封装 设备厂商
Linux 内核 / 驱动 控制硬件扫描、解析帧、提取 RSSI/BSSID 芯片厂商 / 驱动开发者
Firmware 控制 RF、测量信号、校准 RSSI 芯片厂商
硬件 接收信号、模拟数字转换、PHY 测量 芯片与模组厂商

Android 提供的 API 只是访问通道,BSSID 由 AP 广播,RSSI 由硬件测量。Android 只负责封装、权限和接口调用,工程上要注意 RSSI 的波动性和不同芯片间的差异。


维智 Android 定位 SDK是一套面向 Android 移动端应用的简单易用定位服务接口,为开发者提供融合定位能力。通过使用维智定位 SDK,开发者可以在不直接依赖底层 NLP 实现质量的前提下,为应用快速集成 极速、智能、精准、高效 的定位功能。

相关推荐
冬奇Lab4 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿7 小时前
Android MediaPlayer 笔记
android
Jony_7 小时前
Android 启动优化方案
android
阿巴斯甜7 小时前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇7 小时前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_12 小时前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android
_小马快跑_12 小时前
Kotlin | 从SparseArray、ArrayMap的set操作符看类型检查的不同
android
_小马快跑_12 小时前
Android | 为什么有了ArrayMap还要再设计SparseArray?
android
_小马快跑_12 小时前
Android TextView图标对齐优化:使用LayerList精准控制drawable位置
android
_小马快跑_12 小时前
Kotlin协程并发控制:多线程环境下的顺序执行
android