RuView 跨平台 WiFi 感知 macOS 篇:基于 CoreWLAN 的 ORCA 适配层设计与 Swift Helper 桥接实现
本文对应仓库文档 ADR-025: macOS CoreWLAN WiFi Sensing via Swift Helper Bridge,属于 RuView(wifi-densepose)「把普通 WiFi 信号变成空间智能」系列在 macOS 平台上的落地方案。RuView 的主战场是 ESP32-S3 等设备输出的原始 CSI(信道状态信息,56~192 个子载波、约 20 Hz);而 macOS 桌面端受 Apple 平台约束只能拿到 RSSI 级信号,本文讲解如何用「Swift 子进程 Helper + Rust 适配器」的方式把 CoreWLAN 扫描结果接入既有的多 BSSID 信号智能流水线,实现存在检测与运动感知,并保持与 Windows
netsh路径完全一致的类型与处理架构。读完本文,你将掌握:--source auto探测链路的编排方式、CoreWLAN 平台限制与权限模型、Swift JSON 输出 schema、合成 BSSID 的生成策略,以及 RSSI-only 感知能力与 CSI 感知的边界差异。
1. 背景与定位:macOS 曾经是静默的「模拟器路径」
1.1 痛点:macOS 用户被静默地落入仿真模式
RuView 的 sensing-server 在 --source auto 模式下依次探测数据源:先探测 ESP32 UDP,再探测 Windows netsh,最后回落到仿真模式。此前 macOS 没有任何真实 WiFi 适配器接入,macOS 用户会无声地走进模拟数据路径——这是四个主流桌面/开发平台(Windows、Linux、macOS、Docker)中唯一缺失真实 WiFi 感知支持的平台。ADR-025(代号 ORCA —— OS-native Radio Channel Acquisition)正是为补齐这一缺口而提出的设计。
从 sensing-server 主入口 的源码可以看到,真实的自动探测逻辑集中在 plan_source() 状态机(约 main.rs#L3713)与 probe_windows_wifi()(main.rs#L3641):在 auto 模式下始终绑定 UDP:5005 接收器,仅在启动探测到 ESP32 或 netsh WiFi 时才切换到真实数据源,否则运行模拟器直到真实 CSI 到达。macOS 探测分支即是在这一状态机之上新增的一级探测。
1.2 平台约束:CoreWLAN 是唯一正道
ADR 正文明确列出了 macOS 26.3 目标平台下必须面对的系统级约束:
| 约束 | 细节 |
|---|---|
airport CLI 已被移除 |
Apple 在新版 macOS 移除了位于 /System/Library/PrivateFrameworks/... 的 airport 命令行工具,不存在 CLI 兜底方案。(ADR 正文记录为 macOS 15 移除;Rust 适配器 的模块注释则记为 Sonoma 14.4+,二者共同指向「现代 macOS 不再提供命令行扫描入口」这一事实。) |
| CoreWLAN 是唯一路径 | CWWiFiClient(Swift/ObjC)是受支持的 WiFi 扫描 API,可返回 RSSI、信道、SSID、噪声、PHY 模式、安全类型。 |
| BSSID 被系统涂改 | 隐私策略下 CWNetwork.bssid 的 MAC 地址会被涂改:无 Location Services + WiFi entitlement 的 App 拿到的是 nil(或源码注释描述的全零 MAC 00:00:00:00:00:00),无法直接作为 AP 标识。 |
| 无原始 CSI | Apple 不暴露 CSI 或子载波级数据,macOS 只能做 RSSI-only 感知,与 Windows netsh 同级。 |
| 扫描速率 | CWInterface.scanForNetworks() 单次约 2~4 秒,无缓存时有效速率约 0.3~0.5 Hz。 |
| 权限 | 访问 BSSID 需要触发 Location Services 授权弹窗;无授权时 SSID + RSSI + channel 依然可用。 |
1.3 机会:把 10~30 个可见 SSID 当作「伪子载波」
与 ADR-022 Windows WiFi Enhanced Fidelity 完全同构的思路是:把环境中可见的多个 AP 当作伪子载波。室内环境通常能扫到 10~30+ 个分布在 2.4 GHz / 5 GHz 频段的 SSID,每个人体动作对每个 AP 的 RSSI 扰动因几何位置不同而不同,从而构成空间分集。
| 数据源 | 有效子载波数 | 采样率 | 能力边界 |
|---|---|---|---|
| ESP32-S3(CSI) | 56–192 | 20 Hz | 全量:姿态、生命体征、穿墙 |
Windows netsh(ADR-022) |
10–30 BSSIDs | ~2 Hz | 存在、运动、粗略呼吸 |
| macOS CoreWLAN(本文 ADR) | 10–30 SSIDs | ~0.3–0.5 Hz | 存在检测、运动感知 |
比 Windows 更低的扫描率由更高的信号质量补偿:CoreWLAN 返回校准过的 dBm(而非百分比)外加噪声底,可做正规的 SNR 计算——这正是 macOS 路径独有、而 Windows netsh 拿不到的增益项(后续字段映射表中 snr = rssi - noise 即由此而来)。
1.4 为什么选「Swift 子进程」,而不是 Rust FFI
| 方案 | 复杂度 | 可维护性 | 构建 | 结论 |
|---|---|---|---|---|
| Swift CLI → JSON → stdout | 低 | 独立二进制、可版本化 | swiftc(随 Xcode CLT 附带) |
采纳 |
通过 cc crate 做 ObjC FFI |
中 | 头文件绑定脆弱、ABI 变动频繁 | 需要 Xcode headers | 否决 |
objc2 crate(Rust ObjC 桥) |
高 | CoreWLAN 不在上游 objc2-frameworks 中 |
需要手写类定义 | 否决 |
swift-bridge crate |
高 | 生态年轻、异步桥接不支持 | 需要在 Cargo 里集成 Swift 构建 | 否决 |
ADR 指出,std::process::Command + 解析 JSON 的模式已被 NetshBssidScanner(Windows)验证过,完全一致地复用到 macOS;子进程边界还顺带把 Apple framework 依赖与 Rust 构建图彻底隔离。
1.5 SOTA 依据
ADR 列举了三项近年研究作为「多平台 RSSI 感知」的佐证:WiFind(2024) 证明跨平台 RSSI 指纹识别需要对 dBm/百分比/原始值做归一化以支撑模型可移植;WiGesture(2025) 在 15+ AP 的商用硬件上用 RSSI 方差做手势识别达到 89% 准确率,说明时序 RSSI 方差本身携带充分的运动信息;CrossSense(2024) 用迁移学习把 CSI 富硬件上学到的特征迁移到 RSSI-only 设备,特征迁移有效性 78%。这些证据共同支撑了 RuView 的多层级硬件策略(CSI 层 / RSSI 多 AP 层)。
2. 决策:一个 Swift Helper 二进制 + 一个 Rust 适配器
实现形态是 macOS CoreWLAN 感知适配器 = Swift Helper 二进制 + Rust 适配器对,完全沿用 ADR-022 确立的 NetshBssidScanner 子进程模式。真实 RSSI 数据流经既有的 WindowsWifiPipeline(它只消费 BssidObservation 结构体,与数据来自哪个平台无关)。
2.1 设计原则
- 子进程隔离 —— Swift 二进制是独立工具,与 Rust workspace 独立构建与版本化;
- 同域类型 —— macOS 适配器产出
Vec<BssidObservation>,与 Windows 路径完全一致,所有下游处理原样复用; - SSID:channel 合成 BSSID —— 真实 BSSID 被涂改(无 Location Services)时,用确定性哈希生成稳定的伪 BSSID;文档化局限:同 SSID 同信道的多个 AP 会坍缩为一条观测(mesh 组网等场景才常见);
#[cfg(target_os = "macos")]门控 —— macOS 专属代码只在 macOS 编译,Windows / Linux 构建不受影响;- 优雅降级 —— Swift Helper 缺失或失败时,
--source auto跳过 macOS WiFi 并以明确告警回落到仿真模式。
3. 架构与真实源码落点
3.1 组件总览
ADR 给出了如下数据通路(Swift 侧输出 → Rust 适配器 → 既有流水线 → 对外 API):
┌─────────────────────────────────────────────────────────────────────┐
│ macOS WiFi Sensing Path │
│ ┌──────────────────────┐ ┌───────────────────────────────────┐│
│ │ Swift Helper Binary │ │ Rust Adapter + Existing Pipeline ││
│ │ │ │ MacosCoreWlanScanner ││
│ │ CWWiFiClient │JSON │ │ ││
│ │ scanForNetworks() ──┼────►│ Vec<BssidObservation> ││
│ │ interface() │ │ │ ││
│ │ │ │ ▼ ││
│ │ Outputs: │ │ BssidRegistry ││
│ │ - ssid │ │ │ ││
│ │ - rssi (dBm) │ │ ▼ ││
│ │ - noise (dBm) │ │ WindowsWifiPipeline (reused) ││
│ │ - channel │ │ [8-stage signal intelligence] ││
│ │ - band (2.4/5/6) │ │ │ ││
│ │ - phy_mode │ │ ▼ ││
│ │ - bssid (if avail) │ │ SensingUpdate → REST/WS ││
│ └──────────────────────┘ └───────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────────┘
3.2 Swift Helper 的设计(ADR 规划)
规划文件: v2/tools/macos-wifi-scan/main.swift(按 ADR 规划路径,负责 CoreWLAN 全量扫描;实际仓库中可见的早期 Swift 源码见下文 3.2.1)。
三种 CLI 模式与输出约定:
# (no args) → Full scan, output JSON array to stdout
# --probe → Quick availability check, output {"available": true/false}
# --connected → Connected network info only
扫描模式的 JSON 数组元素 schema:
[
{
"ssid": "MyNetwork",
"rssi": -52,
"noise": -90,
"channel": 36,
"band": "5GHz",
"phy_mode": "802.11ax",
"bssid": "aa:bb:cc:dd:ee:ff" | null,
"security": "wpa2_personal"
}
]
构建命令(需先执行 xcode-select --install 安装 Xcode Command Line Tools):
# Requires Xcode Command Line Tools (xcode-select --install)
cd tools/macos-wifi-scan
swiftc -framework CoreWLAN -framework Foundation -O -o macos-wifi-scan main.swift
ADR 同时规划了 tools/macos-wifi-scan/build.sh 构建脚本封装以上 swiftc 调用。
3.2.1 仓库中已有的 Swift 源码佐证
仓库 archive/v1/src/sensing/mac_wifi.swift 保留着 CoreWLAN 接入的原型实现(被 macos_scanner.rs 的模块注释、CHANGELOG 记录为 helper 二进制来源)。它演示了核心 API 的真实调用方式——通过 CWWiFiClient.shared().interface() 获取当前接口,然后循环读取已连接 AP 的 RSSI、噪声底与传输速率(这正是 ADR「未来工作」中 fast-poll 已连接 AP 的能力基础):
import Foundation
import CoreWLAN
func main() {
guard let interface = CWWiFiClient.shared().interface() else {
fputs("{\"error\": \"No WiFi interface found\"}\n", stderr)
exit(1)
}
// Flush stdout automatically to prevent buffering issues with Python subprocess
setbuf(stdout, nil)
let interval: TimeInterval = 0.1 // Run at ~10Hz (connected-AP fast poll)
while true {
let timestamp = Date().timeIntervalSince1970
let rssi = interface.rssiValue()
let noise = interface.noiseMeasurement()
let txRate = interface.transmitRate()
let json = """
{"timestamp": \(timestamp), "rssi": \(rssi), "noise": \(noise), "tx_rate": \(txRate)}
"""
print(json)
Thread.sleep(forTimeInterval: interval)
}
}
main()
该原型面向「已连接接口单点 ~10 Hz 采集」;而 ADR-025 面向的是「scanForNetworks() 全量扫描、多点空间分集」。CHANGELOG 亦记载了配套的 Python 感知适配器(调起该 helper 的 mac_wifi),并明确移除了其中的虚假字节计数,保证数据诚实。读者在把 Swift helper 用于 Rust 侧前,应以 ADR 规划的 JSON-lines schema 为准进行适配(Rust 解析器按行读取并以 { 起始过滤状态行)。
3.3 Rust 适配器:仓库中的真实实现
ADR 规划的适配器文件为 crates/wifi-densepose-wifiscan/src/adapter/macos_scanner.rs;仓库实际实现位于 v2/crates/wifi-densepose-wifiscan/src/adapter/macos_scanner.rs,模块注释直接声明这是「ADR-025 (ORCA) 的 macOS 对应物、Windows NetshBssidScanner 的对照实现」。
3.3.1 Scanner 结构体与公开 API
// #[cfg(target_os = "macos")]
pub struct MacosCoreWlanScanner {
helper_path: String, // 默认 "mac_wifi"(在 $PATH 上查找),可用 with_path() 显式指定
}
impl MacosCoreWlanScanner {
pub fn new() -> Self // 默认在 $PATH 查找 mac_wifi
pub fn with_path(path: impl Into<String>) -> Self // 显式指定 Swift helper 路径
pub fn scan_sync(&self) -> Result<Vec<BssidObservation>, WifiScanError>
// 执行 Command::new(&self.helper_path).arg("--scan-once")
}
实际代码用 std::process::Command 以 --scan-once 参数同步调用 helper(macos_scanner.rs#L68-L88):helper 不存在时返回 WifiScanError::ProcessError,退出码非零时返回 WifiScanError::ScanFailed,随后把 stdout 交给解析器。同时实现 Default。可见零新增 Rust 依赖的承诺在实现中被进一步收紧——解析器甚至刻意避免引入 serde_json(见 3.3.3),只依赖 std。
3.3.2 字段映射表(macOS 独有增益)
| CoreWLAN 字段 | → | BssidObservation 字段 |
转换说明 |
|---|---|---|---|
rssi(dBm) |
→ | rssi_dbm |
直接映射(CoreWLAN 为校准 dBm) |
rssi(dBm) |
→ | signal_pct |
((rssi + 100.0) * 2.0).clamp(0.0, 100.0),如 -50 dBm→100%、-100 dBm→0% |
noise(dBm) |
→ | snr |
rssi - noise(ADR 规划的新字段,macOS 数据优势) |
channel |
→ | channel |
直接映射 |
band |
→ | band |
由 BandType::from_channel(channel) 推导 |
phy_mode |
→ | radio_type |
ADR 规划字符串→RadioType 枚举;实际实现因 CoreWLAN 不直接提供 radio 类型,改为 infer_radio_type(channel):5 GHz(36–177)→ RadioType::Ac,其余 → RadioType::N |
bssid |
→ | bssid_id |
真实 MAC 可用则直接用;否则合成确定性伪 BSSID |
ssid |
→ | ssid |
直接映射 |
3.3.3 合成 BSSID:涂改与隐私边界处理
macOS Sonoma 及之后版本会对未持 com.apple.wifi.scan entitlement 的应用返回涂改 BSSID。实际实现中,resolve_bssid()(macos_scanner.rs#L164-L176)先尝试解析真实 MAC,若为全零 MAC(00:00:00:00:00:00,即涂改信号)则走 synthetic_bssid()。
需要特别指出:ADR 草案文本建议使用 sha256(ssid + channel)[:12] 生成 12 位伪 BSSID;而仓库落地实现为避免引入 sha2 crate,改为确定性 FNV-1a 64 位哈希(macos_scanner.rs#L182-L199),取前 6 字节作为 MAC,并置位 locally-administered 位(byte0 的 bit1)同时清空 multicast 位,从而保证这些合成 MAC 永远不会与真实 OUI 分配的 MAC 冲突——这是对 ADR 原则「文档化局限:同 SSID 同信道 AP 坍缩为一条观测」的实现级细化,比原草案更严谨(真实 OUI 首字节不会置本地管理位)。
fn synthetic_bssid(ssid: &str, channel: u8) -> BssidId {
// FNV-1a 64-bit,确定性且零依赖
let mut hash: u64 = 0xcbf2_9ce4_8422_2325;
for &byte in ssid.as_bytes() {
hash ^= u64::from(byte);
hash = hash.wrapping_mul(0x0100_0000_01b3);
}
hash ^= u64::from(channel);
hash = hash.wrapping_mul(0x0100_0000_01b3);
let bytes = hash.to_le_bytes();
let mut mac = [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5]];
// Set locally-administered bit and clear multicast bit
mac[0] = (mac[0] | 0x02) & 0xFE;
BssidId(mac)
}
3.3.4 JSON 解析:无 serde 的轻量实现
parse_macos_scan_output() 按行解析(macos_scanner.rs#L108-L124):空行、非 { 开头、或解析失败的行被静默跳过(helper 可能在 stdout 混入状态消息)。单行解析由手写的 extract_string_field / extract_number_field 完成,仅做 "key": value 模式提取并对转义引号做处理——其注释明确写着「为避免把 serde_json 变成硬依赖而用轻量手写解析器,因为 JSON 结构简单且已知」。对每个观测会填充 BandType::from_channel(channel)、infer_radio_type(channel) 与 signal_pct。
3.3.5 单元测试:行为即规格
文件内嵌测试覆盖了解析关键路径(macos_scanner.rs#L269-L357):
parse_valid_output:构造三行样例(真实 MAC / 2.4 GHz / 涂改 MAC),断言ssid、bssid、rssi_dbm、channel、band、radio_type全部正确;对涂改行断言合成 MAC 非全零、置位本地管理位、清空多播位;synthetic_bssid_is_deterministic:同一 SSID+channel 哈希稳定;SSID 或 channel 任一变化则 MAC 变化;parse_empty_and_junk_lines:空行、纯文本、残缺 JSON 均不产生观测;extract_string_field_basic/extract_number_field_basic:字段提取正确性及缺失字段返回None;signal_pct_clamping:RSSI -50 → 100%、-100 → 0% 的边界钳制。
3.3.6 平台门控与再导出
适配层在 adapter/mod.rs 中与其他平台适配器并列:netsh_scanner、wlanapi_scanner、以及 #[cfg(target_os = "macos")] pub mod macos_scanner; 和 #[cfg(target_os = "linux")] pub mod linux_scanner;,仅在 macOS 上编译并 pub use MacosCoreWlanScanner 与 parse_macos_scan_output。crate 根 lib.rs 同样以 #[cfg(target_os = "macos")] 再导出二者。因此 Windows / Linux 构建完全不触碰 macOS 代码——这正是 ADR 设计原则 4 的直接证据。
3.4 Sensing Server 集成与自动探测顺序(ADR 规划)
ADR 规划在 crates/wifi-densepose-sensing-server/src/main.rs 新增两个函数:
| 函数 | 职责 |
|---|---|
probe_macos_wifi() |
调用 MacosCoreWlanScanner::probe(),返回 bool |
macos_wifi_task() |
异步循环:扫描 → 构造 BssidObservation 向量 → 喂给 BssidRegistry + WindowsWifiPipeline → 发出 SensingUpdate,结构与 windows_wifi_task() 相同 |
由此更新后的 --source auto 探测顺序为:
1. ESP32 UDP probe (port 5005) → --source esp32
2. Windows netsh probe → --source wifi (Windows)
3. macOS CoreWLAN probe [NEW] → --source wifi (macOS)
4. Simulated fallback → --source simulated
对照当前 main.rs 的真实代码:plan_source("auto", esp32, wifi) 的判源顺序为 ESP32 优先、其次 WiFi(probe_windows_wifi())、否则仿真并保持 UDP 绑定(run_simulator 逻辑见约 main.rs#L3774-L3810 的回归测试注释);macOS 分支尚未进入主程序(当前 server 只接入 netsh 路径的 windows_wifi_task),因此 macOS 任务接入属于 ADR 规划中待实现的 server 集成层,而扫描/解析适配器已就绪并通过测试——文章读者可据此判断「crate 层已可用、server 层接线待完成」的真实推进状态。
3.5 八阶段流水线复用评估
既有的 WindowsWifiPipeline(源自 ADR-022,实际代码见 v2/crates/wifi-densepose-wifiscan/README.md 及 main.rs#L3243 的 windows_wifi_task)完全工作在 BssidObservation / MultiApFrame 之上,因此对 macOS 数据全量复用:
| 阶段 | 是否可复用 | 说明 |
|---|---|---|
| 1. 预测门控 Predictive Gating | ✅ | 按时序方差过滤静态 AP |
| 2. 注意力加权 Attention Weighting | ✅ | 按运动敏感度为 AP 加权 |
| 3. 空间相关 Spatial Correlation | ✅ | 跨 AP 信号相关性 |
| 4. 运动估计 Motion Estimation | ✅ | RSSI 方差 → 运动等级 |
| 5. 呼吸提取 Breathing Extraction | ⚠️ 边际可用 | ~0.3 Hz 扫描率低于呼吸频段(0.1–0.5 Hz)的 Nyquist 下界,仅可能检出极慢呼吸 |
| 6. 质量门控 Quality Gating | ✅ | 拒绝低置信估计 |
| 7. 指纹匹配 Fingerprint Matching | ✅ | 位置/姿态分类 |
| 8. 编排 Orchestration | ✅ | 融合各阶段 |
关键局限: CoreWLAN ~0.3–0.5 Hz 的扫描率显著低于 netsh 的 ~2 Hz,阶段 5 呼吸提取精度受限;运动与存在检测仍有效,因为二者依赖的是更长时间窗上的方差。
4. 构建、运行与验证
4.1 构建 Swift Helper(macOS 本地)
# 前置:Xcode Command Line Tools
xcode-select --install
# 依 ADR 规划路径构建;构建脚本封装同款 swiftc 命令
cd tools/macos-wifi-scan
swiftc -framework CoreWLAN -framework Foundation -O -o macos-wifi-scan main.swift
# 产出后确保其位于 $PATH(或与 server 二进制同目录),Rust 侧默认查找 "mac_wifi"
4.2 Rust 侧验证(需真实 Mac)
| 测试项 | 命令 | 预期 |
|---|---|---|
| Swift helper 构建 | cd tools/macos-wifi-scan && ./build.sh |
产出 macos-wifi-scan 二进制 |
| 可用性探测 | ./macos-wifi-scan --probe |
{"available": true} |
| 全量扫描 | ./macos-wifi-scan |
真实 SSID、dBm RSSI、信道的 JSON 数组 |
| 已连接网络 | ./macos-wifi-scan --connected |
单个 JSON 对象 |
| 无 WiFi | 关闭 WiFi 再运行 | {"available": false} 或空数组 |
| Rust 单元测试 | cargo test -p wifi-densepose-wifiscan |
JSON 解析、合成 BSSID、helper 缺失报错均通过 |
| 端到端 | ./target/release/sensing-server --source wifi |
server 启动,日志标识 macOS CoreWLAN 数据源 |
ADR 给出的端到端验收清单(Mac Mini 环境)包括:curl http://localhost:8080/api/v1/sensing/latest 应返回 source: "wifi:<SSID>" 的真实 RSSI;/api/v1/vital-signs 的运动检测应对物理移动有响应;打开 http://localhost:8080 UI 可见信号场随 RSSI 变化;--source auto 应正确探测到 macOS WiFi 而不回落到仿真。
4.3 交叉平台回归
| 平台 | 构建 | 预期 |
|---|---|---|
| macOS(Mac Mini) | cargo build --release |
macOS 适配器编译并工作 |
| Windows | cargo build --release |
macOS 适配器被 #[cfg] 跳过,Windows 路径不变 |
| Linux | cargo build --release |
macOS 适配器被跳过,ESP32 / 仿真路径不变 |
需要留意 ADR 的验证环境为 Mac Mini(M2 Pro, macOS 26.3),凡涉及扫描速率、涂改行为与权限弹窗的结论均以该目标系统为前提;不同 macOS 版本的行为(尤其 BSSID 涂改策略与 airport 可用性)可能与正文记录存在差异。
5. 局限与缓解
| 局限 | 影响 | 缓解 |
|---|---|---|
| BSSID 涂改 | 同 SSID 同信道 AP 坍缩为一条观测 | 以 ssid:channel 派生伪 BSSID(实现为 FNV-1a + 本地管理位),并文档化该边界情况;实际中仅在 mesh 组网等场景常见 |
| 慢扫描率(~0.3 Hz) | 呼吸提取不可靠(低于 Nyquist 下界) | 运动/存在检测不受影响;呼吸输出标记低置信。未来方案:缓存 + 已连接 AP 快速轮询混合 |
| 需要 Swift helper 在 PATH 中 | 源码构建多一步 | 提供 build.sh;Docker 镜像预打包;缺失时给出清晰错误 |
| BSSID 需 Location Services | 完整 BSSID 需用户授权弹窗 | 无授权时优雅降级到 SSID:channel 伪 BSSID |
| 无 CSI | 无法匹敌 ESP32 姿态估计精度 | 属于预期——RSSI 级感知只承诺存在 + 运动,与 Windows 同级 |
6. 未来工作
| 增强项 | 描述 | 依赖 |
|---|---|---|
| 已连接 AP 快速轮询 | 通过 CWInterface.rssiValue() 以 ~10 Hz 轮询当前连接 AP 的 RSSI(无需全量扫描) |
CoreWLAN rssiValue() 性能实测(仓库 mac_wifi.swift 原型已演示该 API) |
Linux iw 适配器 |
同一子进程模式解析 iw dev wlan0 scan |
需要 Linux 实测机(仓库已含 linux_scanner.rs 与 iw 解析器) |
WindowsWifiPipeline 更名 RssiPipeline |
反映其跨平台复用的事实 | ADR-022 文档更新 |
| 802.11bf 感知 | 未来 macOS 可能借 802.11bf 暴露 CSI | Apple 框架可用性 |
| macOS Docker 镜像 | 预打包 Swift helper 的 macOS Docker 镜像 | Docker 多架构构建 |
7. 延伸阅读与证据索引
- 本 ADR:docs/adr/ADR-025-macos-corewlan-wifi-sensing.md
- 同源平台适配设计:ADR-022 Windows WiFi Enhanced Fidelity
- 上位理念:ADR-013 Feature-Level Sensing Commodity Gear(特征级传感 / 商用硬件)、ADR-014 SOTA Signal Processing、ADR-018 ESP32 Dev Implementation
- 跨平台接口探测总览:ADR-049 Cross-Platform WiFi Interface Detection
- 平台适配器实现:macos_scanner.rs、adapter/mod.rs、lib.rs、wifi-densepose-wifiscan README
- Swift 原型:archive/v1/src/sensing/mac_wifi.swift
- 实现记录:CHANGELOG.md(含 macOS CoreWLAN 适配器 / FNV-1a 合成 BSSID / Python 适配器条目)
- 参考的外部资料(Apple 官方 CoreWLAN 文档、
CWWiFiClient、CWNetwork、macOS 移除airport的开发者论坛讨论)本文不展开链接,可按官方文档名检索核对。
<输出文章>
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00