磁力计 (Magnetometer)

W3C 工作草案,

关于此文档的更多细节
此版本
https://w3org.cn/TR/2026/WD-magnetometer-20260514/
最新发布版本
https://w3org.cn/TR/magnetometer/
编辑草案
https://w3c.github.io/magnetometer/
历史版本
历史
https://w3org.cn/standards/history/magnetometer/
反馈
public-device-apis@w3.org,主题行为“[magnetometer] … 消息主题 …”(归档
磁力计问题仓库
编辑
Anssi Kostiainen英特尔公司
Rijubrata Bhaumik英特尔公司
测试套件
GitHub 上的 web-platform-tests

摘要

本规范定义了一个具体的传感器接口,用于测量 X、Y、Z 三轴的磁场。

关于本文档

本节描述了本文件在发布时的状态。当前的 W3C 出版物列表和本技术报告的最新修订版可在 W3C 技术报告索引中找到。

本文档由 设备与传感器工作组推荐轨道的工作草案形式发布。本文档旨在成为 W3C 推荐标准。

如果您希望对本文档发表评论,请发送至 public-device-apis@w3.org订阅归档)。发送邮件时,请在主题中加入 “magnetometer”,最好采用以下形式:“[magnetometer] …评论摘要…”。欢迎所有评论。

以工作草案形式发布并不意味着得到 W3C 及其成员的认可。这是草稿文件,可能随时被更新、替换或废止。引用此文档时应说明它仍在进行中。

本文档由一个遵守 W3C 专利政策 的组织编写。W3C 维护一份 公开的专利披露列表,列出与本工作组交付物相关的所有专利披露;该页面还包括披露专利的说明。任何实际了解某专利且认为该专利包含 必要权利要求 的个人,必须按照 W3C 专利政策第 6 节的要求进行披露。

本文件受 2025 年 8 月 18 日 W3C 流程文件的管辖。

多个浏览器引擎对本规范表达了担忧。它在任何浏览器引擎中默认均不可用。按目前的形式,它不太可能推进为 W3C 推荐标准。

本规范正在征求开发者反馈和高价值的使用案例。请通过 GitHub 提交您的反馈。

本文件随时维护和更新。本文件的某些部分正在完善中。

1. 引言

Magnetometer 扩展了通用传感器 API [GENERIC‑SENSOR],以提供设备主磁力计传感器检测到的 磁场 信息。磁力计传感器以 μT(微特斯拉)为单位测量三个物理轴(x、y、z)的 磁场

本规范定义了两个新接口

所谓 磁场,是指由于电流、磁性材料或地球磁场(后者来源于行星自转和地核熔融铁运动的共同作用)产生的磁效应,对磁力计传感器施加磁力的场。

硬铁失真 由产生 磁场 的物体(如磁化铁)引起。

软铁失真 会拉伸或扭曲 磁场,来源于镍、铁等金属。

校准磁场 是在 磁场上已应用 硬铁失真软铁失真 校正后的结果。

未校准磁场 是未进行 硬铁失真 校正、但已进行 软铁失真 校正的 磁场,因此能够报告磁化物体靠近磁力计时导致的 磁场 变化。

2. 示例

let sensor = new Magnetometer();
sensor.start();

sensor.onreading = () => {
    console.log("Magnetic field along the X-axis " + sensor.x);
    console.log("Magnetic field along the Y-axis " + sensor.y);
    console.log("Magnetic field along the Z-axis " + sensor.z);
};

sensor.onerror = event => console.log(event.error.name, event.error.message);

3. 安全与隐私考虑

磁力计提供磁场信息,理论上可用于推断用户位置。例如,攻击者可在特定地点放置预先磁化的表面,或利用建筑物产生的恒定磁场扰动绘制位置映射。由于地球磁场强度不均匀,另一种攻击向量可能是通过磁场强度验证或曝光用户位置。例如,当终端用户通过 VPN 连接时,可将基于地理 IP 的磁场信息与实际位置的磁力计读数进行比较,从而判断用户是否使用 VPN。实现者应注意磁场强度与 CPU 执行等其他因素之间的关联可能导致侧信道泄漏,在特定情况下可能泄露已使用的应用或在其他标签页访问的网站信息。[MAGSPY]

未校准的磁力计读数可能受附近磁化物体(如首饰)影响,从而泄露可用于 键击监控 的信息。

为缓解这些特定威胁,用户代理应采用以下一种或两种缓解策略

这些缓解策略补充了通用传感器 API [GENERIC‑SENSOR] 中定义的 通用缓解措施

4. 权限策略集成

本规范使用了由字符串 "magnetometer" 标识的 策略受控特性,该特性在 [DEVICE‑ORIENTATION] 中定义。

5. 模型

Magnetometer 传感器类型 具备以下关联数据

扩展传感器接口

磁力计 (Magnetometer)

传感器权限名称

"magnetometer"

传感器特性名称

"magnetometer"

权限撤销算法

使用 "magnetometer" 调用 通用传感器权限撤销算法

虚拟传感器类型

"magnetometer"

对于 Sensor,其 传感器类型Magnetometer最新读取 必须包含

Uncalibrated Magnetometer 传感器类型 具备以下关联数据

扩展传感器接口

UncalibratedMagnetometer

传感器权限名称

"magnetometer"

传感器特性名称

"magnetometer"

权限撤销算法

使用 "magnetometer" 调用 通用传感器权限撤销算法

虚拟传感器类型

"uncalibrated-magnetometer"

对于 Sensor,其 传感器类型Uncalibrated Magnetometer最新读取 必须包含

磁场 值的符号必须遵循 本地坐标系 中的右手规则(见下图)。

Magnetometer coordinate system.

5.1. 参考坐标系

本地坐标系 用作 MagnetometerUncalibratedMagnetometer 读取 的参考框架。它可以是 设备坐标系,也可以是 屏幕坐标系

6. API

6.1. 磁力计接口

[SecureContext,
  Exposed=Window]
interface Magnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum MagnetometerLocalCoordinateSystem { "device", "screen" };

dictionary MagnetometerSensorOptions : SensorOptions {
  MagnetometerLocalCoordinateSystem referenceFrame = "device";
};
new Magnetometer(sensorOptions) 的构造步骤是使用 构造磁力计对象 抽象操作,并传入 thissensorOptions

支持的传感器选项 对于 Magnetometer 包括 “frequency” 与 “referenceFrame”。

6.1.1. Magnetometer.x

x 属性是 Magnetometer 接口的成员,表示 X 轴的 磁场。换言之,它返回对 最新读取获取值 的调用结果,参数为 this 与 “x”。

6.1.2. Magnetometer.y

y 属性是 Magnetometer 接口的成员,表示 Y 轴的 磁场。同理,它返回对 最新读取获取值 的调用结果,参数为 this 与 “y”。

6.1.3. Magnetometer.z

z 属性是 Magnetometer 接口的成员,表示 Z 轴的 磁场。同理,它返回对 最新读取获取值 的调用结果,参数为 this 与 “z”。

6.2. 未校准磁力计接口

[SecureContext,
  Exposed=Window]
interface UncalibratedMagnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
  readonly attribute double? xBias;
  readonly attribute double? yBias;
  readonly attribute double? zBias;
};
new UncalibratedMagnetometer(sensorOptions) 的构造步骤是使用 构造磁力计对象 抽象操作,并传入 thissensorOptions

支持的传感器选项 对于 UncalibratedMagnetometer 包括 “frequency” 与 “referenceFrame”。

6.2.1. UncalibratedMagnetometer.x

x 属性是 UncalibratedMagnetometer 接口的成员,表示 X 轴的 未校准磁场。同理,它返回对 最新读取获取值 的调用结果,参数为 this 与 “x”。

6.2.2. UncalibratedMagnetometer.y

y 属性是 UncalibratedMagnetometer 接口的成员,表示 Y 轴的 未校准磁场。同理,它返回对 最新读取获取值 的调用结果,参数为 this 与 “y”。

6.2.3. UncalibratedMagnetometer.z

z 属性是 UncalibratedMagnetometer 接口的成员,表示 Z 轴的 未校准磁场。同理,它返回对 最新读取获取值 的调用结果,参数为 this 与 “z”。

6.2.4. UncalibratedMagnetometer.xBias

xBias 属性是 UncalibratedMagnetometer 接口的成员,表示 X 轴的 硬铁失真 校正值。它返回对 最新读取获取值 的调用结果,参数为 this 与 “xBias”。

6.2.5. UncalibratedMagnetometer.yBias

yBias 属性是 UncalibratedMagnetometer 接口的成员,表示 Y 轴的 硬铁失真 校正值。它返回对 最新读取获取值 的调用结果,参数为 this 与 “yBias”。

6.2.6. UncalibratedMagnetometer.zBias

zBias 属性是 UncalibratedMagnetometer 接口的成员,表示 Z 轴的 硬铁失真 校正值。它返回对 最新读取获取值 的调用结果,参数为 this 与 “zBias”。

7. 抽象操作

7.1. 构造磁力计对象

input (输入)

object,一个 MagnetometerUncalibratedMagnetometer 实例

options,一个 MagnetometerSensorOptions 对象。

  1. allowed 为调用 检查传感器策略受控特性 并传入 object传感器类型 得到的结果。

  2. If allowed is false, then

    1. Throw a SecurityError DOMException.

  3. Invoke initialize a sensor object with object and options.

  4. 如果 options.referenceFrame 为 “screen”,则

    1. object本地坐标系 设为 屏幕坐标系

  5. 否则,将 object本地坐标系 设为 设备坐标系

8. 自动化

本节扩展了 通用传感器 API § 9 自动化,提供 Magnetometer 专有的虚拟传感器元数据。

8.1. 磁力计自动化

针对每种类型的虚拟传感器元数据的 有序映射 必须包含如下 条目

key

"magnetometer"

value

一个 虚拟传感器元数据,其 读取解析算法解析 XYZ 读取

8.2. 未校准磁力计自动化

针对每种类型的虚拟传感器元数据的 有序映射 必须包含如下 条目

key

"uncalibrated-magnetometer"

value

一个 虚拟传感器元数据,其 读取解析算法未校准磁力计读取解析算法

8.2.1. 未校准磁力计读取解析算法

input (输入)

parameters, a JSON Object

output

一个 传感器读取undefined

  1. reading 为使用 解析 XYZ 读取 并传入 parameters 的结果。

  2. 如果 readingundefined

    1. 返回 undefined

  3. keys 为列表 « "xBias", "yBias", "zBias" »。

  4. 对每个 keykeys 中执行

    1. value 为调用 解析单值数字读取,并传入 parameterskey 的结果。

      1. If value is undefined.

        1. 返回 undefined

    2. 设定 reading[key] 为 value[key]。

  5. Return reading.

9. 磁力计传感器的局限性

本节为非规范性内容.

地球磁场的方向与强度随地点(尤其是纬度)变化。例如,赤道附近的磁场强度最低,极地区域最高。硬铁干扰(如手机扬声器中的永久磁铁)会影响读取精度,电子设备、笔记本、电池等会产生软铁干扰。打开手机的飞行模式可以降低电磁干扰。

除了上述空间变化外,时间因素(如太阳风或磁暴)同样会扭曲地球磁层以及外部磁场。

10. 使用案例与需求

本节为非规范性内容.

磁力计可用于多种场景,例如

不同用例对数据粗糙度与采样频率的要求各不相同。例如,金属探测或磁性按钮输入可使用更粗的采样率和更低的频率;而手势识别、室内导航、VR/AR 等则需要更高的采样率。传感器融合场景的最优采样率取决于所使用的融合算法以及其他运动传感器的特性。

11. 使用磁力计的指南针指向

本节为非规范性内容.

指南针是一种会自动对齐至地球磁极的仪器,数世纪以来被用于导航。地球自转轴决定了我们在地图上使用的地理北极和南极。但地理极与磁极之间大约相差 11.5°(约 1000 英里)。磁偏角 用于校正磁向,以得到真实的方向。

若设备始终保持水平(与地球表面平行),则只需使用地球磁场的 xy 分量(即平面分量)即可确定指南针指向。若要得到地理北(真北)方向,则在此基础上加上相应的 磁偏角

磁偏角磁偏角 是水平面上磁北与真北之间的夹角,取决于地球表面的位置,并随时间变化。约定上,当磁北位于真北的东侧时,磁偏角为正;位于西侧时为负。您可以实时获取 磁偏角 的数值,例如使用美国国家海洋和大气管理局(NOAA)提供的 磁偏角计算器

磁北的计算方法如下

let sensor = new Magnetometer();
sensor.start();
let heading = Math.atan2(sensor.y, sensor.x) * (180 / Math.PI);
console.log('Heading in degrees: ' + heading);

给定纬度和经度的地理北的计算方法如下

// Get the latitude and longitude, omitted for brevity here.
let latitude = 0, longitude = 0;

// Get the magnetic declination at the given latitude and longitude.
fetch('https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination' +
      '?lat1=' + latitude + '&lon1=' + longitude + '&resultFormat=csv')
  .then(response => response.text()).then(text => {
    let declination = parseFloat(text.replace(/^#.*$/gm, '').trim().split(',')[4]);

    // Compensate for the magnetic declination to get the geographic north.
    console.log('True heading in degrees: ' + (heading + declination));
});

注意: 如果设备未与地面保持水平,开发者需要使用三轴加速度计来实现各种倾角补偿技术。需要使用由加速度计和磁力计融合而成的方向传感器数据,才能实现此特定用例。

12. 致谢

Tobie Langel for the work on Generic Sensor API.

13. 符合性

Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification.

本规范的所有文本均为规范性文本,明确标记为非规范性的部分、示例和注释除外。 [RFC2119]

A conformant user agent must implement all the requirements listed in this specification that are applicable to user agents.

The IDL fragments in this specification must be interpreted as required for conforming IDL fragments, as described in the Web IDL specification. [WEBIDL]

索引

本规范定义的术语

通过引用定义的术语

引用

规范性引用

[ACCELEROMETER]
Anssi Kostiainen. 加速度计. 12 February 2025. CRD. URL: https://w3org.cn/TR/accelerometer/
[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. Device Orientation and Motion (设备朝向与运动). 2025年2月12日. CRD. URL: https://w3org.cn/TR/orientation-event/
[ECMASCRIPT]
ECMAScript 语言规范. URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron. 通用传感器 API. 21 January 2026. CRD. URL: https://w3org.cn/TR/generic-sensor/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions (权限). 2025年10月6日. WD. URL: https://w3org.cn/TR/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy (权限策略). 2025年10月6日. WD. URL: https://w3org.cn/TR/permissions-policy-1/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准. Living Standard. URL: https://webidl.spec.whatwg.org/

非规范性参考文献

[MAGINDOORPOS]
Janne Haverinen, Anssi Kemppainen. 基于环境磁场的全球室内自主定位. Informational. URL: https://doi.org/10.1016%2Fj.robot.2009.07.018
[MAGITACT]
Hamed Ketabdar, Kamer Ali Yüksel, Mehran Roshandel. Magitact. Informational. URL: https://dl.acm.org/doi/10.1145/1719970.1720048
[MAGSPY]
Nikolay Matyunin, Yujue Wang, Tolga Arul, Kristian Kullmann, Jakub Szefer, Stefan Katzenbeisser. MagneticSpy:利用移动设备磁力计进行网站和应用指纹识别. Informational. URL: https://dl.acm.org/doi/abs/10.1145/3338498.3358650
[MOTION-SENSORS]
Kenneth Christiansen; Alexander Shalamov. 运动传感器说明. 30 August 2017. NOTE. URL: https://w3org.cn/TR/motion-sensors/
[VRBUTTON]
Boris Smus. Google Cardboard 的磁性输入. Informational. URL: https://bugs.chromium.org/p/chromium/issues/detail?id=445926

IDL 索引

[SecureContext,
  Exposed=Window]
interface Magnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
};

enum MagnetometerLocalCoordinateSystem { "device", "screen" };

dictionary MagnetometerSensorOptions : SensorOptions {
  MagnetometerLocalCoordinateSystem referenceFrame = "device";
};

[SecureContext,
  Exposed=Window]
interface UncalibratedMagnetometer : Sensor {
  constructor(optional MagnetometerSensorOptions sensorOptions = {});
  readonly attribute double? x;
  readonly attribute double? y;
  readonly attribute double? z;
  readonly attribute double? xBias;
  readonly attribute double? yBias;
  readonly attribute double? zBias;
};