Skip to content

CORE-20 Battery 模式门禁、20 秒采样与 Thermal 来源审计方案

调研结论

当前 pmd3.device-condition.raw 已通过独立 Diagnostics Relay 读取完整 IOPMPowerSource,不会争用 DTX。iOS 17/18 当前 USB 样本都明确返回 ExternalConnected=true;同时 InstantAmperagePowerTelemetryData.BatteryPower 可能为 0 或负值,说明 USB 供电环境下把 abs(InstantAmperage)×Voltage/1000 直接发布为应用耗电会混合外部供电、整机负载与电池充放电状态。

固定的 pymobiledevice3 11.3.1 上游 battery monitor 保留 InstantAmperageVoltageTemperatureIsChargingCurrentCapacity 原始值,不负责 Perfowl 产品语义;固定的 py-ios-device 2.4.26 虽提供绝对值功率示例,也没有解决 USB 外部供电门禁、目标 App 归因或 PerfDog 同窗校准。因此本批不直接点亮 Battery,也不把 PowerTelemetryData 未知单位字段提升为新指标。

Thermal 方面,两库只提供通知名称候选或设备条件诱导能力;Notification Proxy 的观察消息没有已证明的 0–3 当前状态值,iOS 17/18 IOPMPowerSource 也没有返回稳定 ThermalStatus。本批只形成来源审计,不以温度或 Energy thermal cost 猜设备热状态。

公式先行

指标原始字段转换与门禁scope / unit窗口缺失、重置与取整算法版本
Battery CurrentInstantAmperageExternalConnectedIsCharging仅当 ExternalConnected == falseIsCharging == false 且电流有限且 <=0 时取 abs(InstantAmperage)device / milliampere candidate首次立即采样,之后固定 deadline 20 s外部供电=external-power-connected;充电=charging;状态缺失=power-state-missing;正电流=source-sign-unverified;不取整battery-discharge-current.candidate.v2
Battery VoltageVoltage + 同一电源状态仅在上述 battery-only 门禁内接受有限正值device / millivolt candidate同一 20 s 快照非正或缺失=missing;不跨快照补值;不取整battery-voltage.candidate.v2
Battery Power同一快照的有效 Current、Voltageabs(InstantAmperage) × Voltage / 1000device / milliwatt candidate同一 20 s 快照任一无效则 value=null,并继承门禁原因;不插值、不累计、不取整battery-discharge-power.candidate.v2
Battery TemperatureTemperature原值在 0–8000 时 /100device / source-native + degree-celsius随同 20 s Diagnostics 快照越界/缺失为 missing;真实 0 保留;不插值;计算层不取整centi-celsius-to-celsius.candidate.v1
ThermalStatus稳定源 ThermalStatus只接受 0/1/2/3device / enum-raw随来源事件源缺失为 missing;通知名称、温度、Energy cost 不替代;不聚合thermal-status-enum.candidate.v2

固定 deadline 语义为:第一次读取不延迟;第 N 次目标时间为 start + N×20s,读取耗时不会累积漂移;如果一次读取超过一个窗口,跳过已经错过的 deadline,不进行追赶式连发。

最小开发范围

  1. Device Condition 默认采样周期从 1 s 调整为 20 s,并使用 monotonic deadline 调度。
  2. Battery Current / Voltage / Power 加入外部供电、充电状态、符号和正电压门禁;USB 下缺值不得显示 0。
  3. 保留所有原始 IOPMPowerSource 字段,继续允许后续离线审计 PowerTelemetryData,但不新增其 metricID。
  4. 实时 wire 承接三项 Battery 值与质量;Swift 数据模型先接通,但 Battery 选择器继续 Unsupported,直到 Wi-Fi 设备发现、断开 USB 后的 E4 与 PerfDog 同窗完成。
  5. ThermalStatus 保持 Partial/missing;新增来源审计测试,确认通知名称不被误当枚举值。
  6. 交付身份升级为 Collector Foundation 1.2-beta、Mac App 1.0.0 (20) internal beta;Registry 仍为 53。

验收门禁

  • E2:Python 系统/冻结 3.12 与 Swift 全量测试;覆盖 battery-only、USB external、charging、状态缺失、正电流、非正电压、真实 0、20 s deadline 与 wire 解码。
  • E2:既有 raw Session 双重重放哈希一致,Registry 保持 53。
  • E4:当前连接 iOS 17/18 至少一台执行超过 20 s 的最终打包 Collector;需观察至少 2 个 Device Condition raw,确认 USB external 门禁使三项电学值为 null 且温度仍是独立候选。
  • 若当前只连接一台设备,状态写为 partial,不外推另一系统;若无设备,本批只交付 E2。
  • Battery 产品状态在 Wi-Fi 设备发现、ExternalConnected=false 真机样本和 PerfDog 同窗前保持 Unsupported;ThermalStatus 在稳定当前值来源前保持 Partial。

Perfowl · Performance Observer