Git 提交约定详解 WhatCable:让 Mac 识别 USB-C 线缆能力的菜单栏神器 zoxide & fzf 安装与使用指南(终端提效神器) IDEA快捷键(Mac) MyBatis源码深度解析 ThreadLocal异步场景问题解析 Spring IOC与AOP详解 Spring源码中的设计模式详解 HashMap源码分析 java语法糖详解 Trae-Java环境配置 欢迎来到我的博客 为什么Java中只有值传递? 关于技术分享 代码之美 首页美化教程 如何创建GitHub个人网站
← 返回首页

WhatCable:让 Mac 识别 USB-C 线缆能力的菜单栏神器

项目地址:https://github.com/darrylmorley/whatcable
作者:Darryl Morley | 开源协议:MIT | Stars:3.8k+


一、问题背景:USB-C 的"黑盒"困境

USB-C 接口统一了充电、数据传输和视频输出,但一个 Type-C 口可以承载的能力差异巨大:

  • 一根普通的 USB 2.0 充电线(仅支持 5V/2A,约 10W)
  • 一根 Thunderbolt 4 线缆(支持 40 Gbps 数据、最高 240W 供电)
  • 两者外观完全相同,用户无法从物理上区分

macOS 虽然通过 IOKit 暴露了底层信息,但对普通用户来说过于技术化。WhatCable 正是为了解决这个问题而生——它把复杂的硬件信息翻译成人类语言,让你一眼就知道每根线能干什么。


二、核心功能一览

2.1 端口诊断(以通俗语言呈现)

每个 USB-C 端口会显示以下信息:

信息类型 示例内容
快速概览 Thunderbolt/USB4 / USB 设备 / Display 连接 / 仅充电 / 慢速充电线 / 未连接
充电诊断 “线材限制充电速度” / “当前充电 30W(充电器可达 96W)” / “充电良好,96W” / “电池已满,不充电”
数据传输诊断 “线材限制传输速度” / “设备运行在 10 Gbps,已达最快,非线材问题”
E-Marker 信息 实际速度(USB 2.0 / 5/10/20/40/80 Gbps)、电流额定值(3A/5A/60W/100W/240W)、芯片厂商
信任信号 当 E-Marker 报告异常时(零 VID、保留位模式等),显示橙色警告卡,提示"此线材可能有问题"
充电器 PDO 列表 充电器支持的所有电压档位,实时高亮当前协商档位
连接设备身份 从 PD Discover Identity 响应中解码出的厂商名称和产品类型
Thunderbolt 拓扑 活动链路的每车道速度、代际(TB3/TB4/TB5)及多跳交换机拓扑
桌面小组件 支持 Small/Medium/Large 三种尺寸的 WidgetKit 组件,直接在桌面查看状态

2.2 设置选项

  • 隐藏空端口
  • 登录时自动启动
  • 作为 Dock 应用运行(而非菜单栏图标)
  • 调整字体大小
  • 多语言支持(英语、亚美尼亚语、意大利语、波兰语、简体中文,或跟随系统)
  • 线缆插拔通知
  • 可选提交匿名诊断数据以改善硬件覆盖率

2.3 命令行工具

whatcable                    # 人类可读摘要
whatcable --json             # JSON 结构化输出,可配合 jq 使用
whatcable --watch            # 流式更新,实时监控线缆变化
whatcable --raw              # 包含底层 IOKit 属性
whatcable --report           # 预填 GitHub Issue,一键上报可疑线材
whatcable --test-kit         # 运行诊断探针并提交匿名数据

三、技术架构深度解析

3.1 读取的四类 IOKit 服务

WhatCable 不使用任何私有 API、辅助守护进程或特权 entitlements,而是直接读取系统提供的四类内核扩展:

服务 提供的信息
AppleHPMInterfaceType10/11/12(M3 时代)、AppleTCControllerType10/11(M1/M2)、IOPort(M4 Mac mini 前置端口) 各端口状态:连接/断开、传输协议、插入方向、E-Marker 存在性
IOPortFeaturePowerSource 来自连接源的完整 PDO 列表,含实时"获胜"PDO
IOPortTransportComponentCCUSBPDSOP 系列 PD Discover Identity VDO,包括端口伙伴(SOP)、线材近端 E-Marker(SOP’)、远端 E-Marker(SOP’',若存在)
XHCI 控制器子树 将每个连接的 USB 设备与物理端口配对,通过 XHCI 端口节点的 UsbIOPort 注册表路径实现

3.2 线速与功率解码规范

线速和功率解码严格遵循 USB Power Delivery 规范(R3.2 V1.2,2026年3月版)。厂商名称来自内置的 SQLite 数据库(whatcable.db),该库合并了 USB-IF 发布的厂商列表、社区 usb.ids 列表,以及用户上报的精选线材指纹。

3.3 信任信号机制

软件无法验证线材内部芯片是否真实,因此 WhatCable 实现了一套"信任信号"机制:

  • 橙色警告卡出现在 E-Marker 报告异常数值时,措辞谨慎:“此标识看起来异常”,而非"这是假货"
  • 检测的特征包括:零 VID、速度/电流/延迟字段中的保留位模式、不在 USB-IF 发布列表中的 VID
  • 这种" hedged signaling"设计避免了误判,同时提醒用户保持警惕

3.4 源码模块结构

Sources/
├── WhatCable/          # 主菜单栏应用 UI(SwiftUI Popover、设置、通知)
├── WhatCableCore/      # 共享诊断逻辑、PD 位解码、文本格式化
├── WhatCableDarwinBackend/  # IOKit 监听器(端口状态、PD 身份、电源源、USB 设备、Thunderbolt 拓扑)
├── WhatCableAppKit/     # AppKit 级窗口和面板管理
├── WhatCablePlugins/    # Pro 功能(功耗监测、授权、线材诊断视图、液触检测)
├── WhatCableWidget/     # WidgetKit 扩展(Small/Medium/Large 桌面组件)
└── WhatCableCLI/        # CLI 二进制,与 App 共享 Core/Backend/Plugins

四、安装与运行

4.1 方式一:手动下载

  1. 访问 GitHub Releases
  2. 下载 WhatCable.zip,解压后将 WhatCable.app 拖入 /Applications
  3. 签名和公证由构建脚本自动处理,Gatekeeper 无警告

4.2 方式二:Homebrew(推荐)

brew tap darrylmorley/whatcable
brew install --cask whatcable

Homebrew 版本会自动将 CLI 符号链接到 /usr/local/bin/whatcable

4.3 为什么没有上架 Mac App Store?

App Sandbox 会阻止对底层 IOKit 的读取,而这正是 WhatCable 依赖的核心功能。因此项目选择以签名+公证的方式分发,而非上架 App Store。

4.4 系统要求

  • macOS 14 (Sonoma) 或更高版本
  • 仅限 Apple Silicon(Intel 平台的 USB-C 端口由 Intel Titan Ridge/JHL9580 Thunderbolt 3 控制器驱动,无法获取所需的 USB-PD 状态和 E-Marker 数据)

五、WhatCable Pro:付费增值版

免费版已经非常强大,Pro 版($4.99,一次性购买,支持最多 2 台 Mac)解锁以下高级功能:

功能 说明
实时功耗监测 Live Power Meter,带输入功率图表
PD 合同检查 完整的逐连接分析,对比端口/线材/设备各自支持 vs 实际协商结果,突出薄弱环节
端口健康计数器 统计端口使用情况,估算线材电阻
Pin diagrams 引脚图和液触检测状态
Pro 界面 独立窗口展示,可分离为独立窗口
兼容无功耗暴露的 Mac 即使 Mac 不暴露实时端口功耗,也能工作

六、隐私与安全

  • 所有数据本地处理:WhatCable 直接从 IOKit 读取 USB-C 端口状态,全部在本地完成,不会向任何服务器发送数据
  • 更新检查:定期检查 GitHub Releases API,请求中不包含个人数据或硬件信息
  • 诊断数据:设置中有"贡献诊断数据"按钮,点击后才收集并提交匿名端口和功耗数据,完全可选
  • 线材报告:“Report this cable” 按钮预填 GitHub Issue,用户需手动点击提交,提交前数据对用户可见

七、Linux 移植:usbeehive

@abrauchli 为 Linux 开发了 Rust 移植版 usbeehive,通过读取内核 typec sysfs 接口而非 IOKit,是独立实现而非 Fork。

安装:cargo install usbeehive


八、项目数据概览

指标 数据
GitHub Stars 3.8k+
Forks 101
Issues 13
Pull Requests
分支数 11
Tags 59
Commits 308+
最新版本 v0.5.13(build 27)
编程语言 Swift(Swift 5.9+ / Xcode 15+)
许可证 MIT
最低 macOS 14 (Sonoma)
平台 Apple Silicon ONLY

九、总结与评价

WhatCable 是一个典型的"小而美"的开发者工具——它精准地解决了一个看似小众但普遍存在的问题:用户不知道手里的 USB-C 线到底能跑多快、充多少电。

项目的工程实践值得学习:

  1. 纯 IOKit 方案:不依赖任何私有 API,只读取系统公开接口,安全性和可持续性极佳
  2. 清晰的分层架构:Core/Backend/Plugins 三层分离,便于维护和扩展
  3. 保守的信任信号设计:不对线材真伪下定论,而是给出警示,体现了良好的风险意识
  4. 开源+Pro 商业模式:免费版足够好用,Pro 版解决进阶需求,商业模型清晰

对于 macOS 开发者而言,WhatCable 展示了如何通过 IOKit 深入系统底层,并将复杂信息以友好方式呈现给用户。对于普通用户,它是辨别"真假快充线""假 Thunderbolt 线"的实用工具。


本文基于 WhatCable 项目 README、源码结构和 GitHub 仓库信息整理撰写。

评论