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

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


一、应用层(App / SDK)

职责

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

  • 获取扫描结果并解析 BSSID 和 RSSI

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

主要接口

Android 提供 WifiManager 和 ScanResult:

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 服务,如 WifiService、WifiScanningService

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

  • 权限验证与结果封装

数据流

App → WifiManager → WifiService → WifiScanningService → WifiNative → HAL

  • ScanResult 的 BSSID 和 RSSI 由底层提供

  • 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 实现质量的前提下,为应用快速集成 极速、智能、精准、高效 的定位功能。

相关推荐
大圣编蚕3 小时前
初探 NDK 的世界:从零开始理解 Android 原生开发
android
云贝贝贝3 小时前
MySQL 慢查询定位与索引优化实战
android
加载力科技4 小时前
Mac 打开 ISO 文件完整教程:3 种方法挂载与解压,挂载失败也能提取文件
macos·命令模式·磁盘工具·mac打开iso·hdiutil·iso解压·mac技巧
Web Security Loop4 小时前
MAC安装最新Burpsuite pro详细步骤教程
web安全·macos·网络安全·安全性测试
骑着蜗牛撵大象3274 小时前
服务下线不再炸:分层关闭、TCP 存活探测与负载均衡排水的落地套路
android·tcp/ip·负载均衡·tcp·高可用·健康检查·优雅关闭
Raspberry_Pi_官方账号5 小时前
Raspberry Pi Desktop 全面升级,现已登陆 PC 和 Mac
服务器·网络·macos·树莓派·raspberry pi·raspberrypios
king13598745505 小时前
EmbeddingGemma 2 270M 实测:Mac CPU、PDF/Word、256d 与 FTS5
macos·pdf·word
三少爷的鞋6 小时前
别再这么写协程了!Marcin Moskała 剖析的 几个常见协程误区与重构
android
mmsx8 小时前
Android 防二次打包第一道锁:签名校验与完整性校验
android·kotlin
mmsx8 小时前
Android 混淆不等于安全:二次打包链路完整走一遍
android·kotlin