跳到主要内容
版本:开发版

LwM2M 接入

资源受限和蜂窝设备群经常使用 OMA LwM2M,一种基于 CoAP 的紧凑设备管理标准。DeviceChain 直接终止 LwM2M 连接。设备通过由 DTLS 保护的 CoAP/UDP连接,其注册、遥测和固件映射到与其他传输相同的设备模型。

Sparkplug 接入向你的消息代理建立出站连接。LwM2M 则相反:设备向 DeviceChain 的安全 CoAP 端点建立入站连接,与标准 MQTT 路径的方式相同。

状态

LwM2M 接入作为可选服务提供,使用 CoAP/UDP 和 DTLS-PSK。它驱动明确的设备在线状态,将观测到的传感器对象接入为测量,并下发 Read/Write/Execute 命令,为休眠设备提供持久保留与唤醒后投递。重启和设备信息读取可按名称使用,每台设备的制造商、型号、序列号、固件版本和电池电量会在其注册时读取,并保存为属性。Notify 解码只支持 SenML-JSON,因此仅支持 LwM2M 1.0 的客户端可以使用在线状态和命令,但在提供 TLV 解码前无法上报测量。GA 范围是 PSK 凭据;X.509 / 原始公钥和 Bootstrap 服务器仍在计划中。

提供的功能​

握手时认证​

设备提交 DTLS 预共享密钥(PSK)身份。在任何应用流量传输前,DeviceChain 将该身份解析为租户和设备。未知或格式错误的身份会导致握手失败,绝不会进入注册阶段。租户来自经过认证的身份,绝不来自设备在载荷中的声明。

为凭据启用自动注册后,已配置身份首次注册时会创建设备数据行。

网络地址变化的漫游客户端通过 DTLS Connection ID 跟踪,因此蜂窝设备在 IP 变化后仍保留会话。

预共享密钥不属于 Helm 发布。平台把它们保存在由安装程序自己写入的 Secret 中,并在服务启动时投射进去,因此 helm get values 永远不会显示任何一个密钥。参见向 dcctl 提供 LwM2M 身份。

注册生命周期驱动在线状态​

在线状态由协议明确确定,遵循 LwM2M 注册生命周期:

  • Register 将设备标记为在线。
  • 定期 Updates 保持会话存活。
  • Deregister 或注册有效期到期,将设备标记为离线。

与 Sparkplug-B 一样,LwM2M 是主动声明在线状态的传输:设备在线状态由协议明确确定,而非根据超时推断。

传感器对象转化为测量​

DeviceChain 对设备的传感器对象实例执行 Observe,将每条 Notify 解码为普通事件封装中的带类型测量。随后,LwM2M 遥测与其他读数一样进入历史记录、实时状态、仪表板和检测引擎。

  • 传感器对象的对象 ID 位于当前构建视为遥测的固定 IPSO Smart Object 传感器范围(3200–3441)。
  • 每次注册最多观测 32 个实例。
  • 范围和上限都不是可配置设置。
  • 管理对象(Security、Server、Device 及其他 OMA 对象)绝不被观测。
  • 超过 256 个数值的 Notify 会存为多个事件,每个最多 256 个值,而不是截断。按读数计数的租户接入上限仍然生效:如果 Notify 超过上限一次能够接受的数量,已获准的事件保留,其余被削减,并计入 ingest_samples_shed_total。

目前只解码 SenML-JSON 通知,需要事先考虑这一点:仅支持 LwM2M 1.0 的合规客户端无法产生这种通知。SenML 在 LwM2M 1.1 中引入,因此 1.0 客户端会正确地以 4.06 Not Acceptable 回应 Observe。这类设备仍可注册、驱动在线状态并接受命令,但完全不提供遥测数据。这是当前 LwM2M 支持中最大的功能缺口;后续提供旧 TLV 格式解码才能补齐。两种拒绝情况都会被计数,让运维人员能够观察到,而不是从数据缺失推断。

命令与固件​

平台命令转换为对设备资源执行的 LwM2M Read / Write / Execute 操作。

固件更新以相同方式驱动,是运维人员执行的一系列步骤,而不是单个平台操作。你自行针对标准 Firmware Update 对象发出 Writes 和 Execute,作为普通命令。DeviceChain 保持同一设备命令的入队顺序,因此固件写入和执行绝不会乱序。它不将更新建模为统一管理的任务,平台的空中升级也不会送达 LwM2M 设备。具体步骤见使用对象 5 更新固件。

设备响应缓慢、命令积压时,该设备后续命令会暂时搁置,稍后仍按顺序投递。一台设备缓慢不会阻塞其他设备的命令。

当前休眠设备的命令会被持久保留,在下次唤醒时投递(队列模式),而不是丢弃。保留有时间上限,命令不会无限等待。等待期间,命令记录两种状态之一,因此实际积压可能混合两者:

  • PARKED,而不是 SENT。
  • HELD:在线状态已经将设备标记为缺席,命令在尚未发布前就被保留。

两种情况下平台都仍持有命令,因此仍可取消。如果生存时间先到期,记录会说明命令从未到达设备,而不是责怪设备未响应。

使用对象 5 更新固件​

这是目前更新 LwM2M 设备固件的受支持方式。它使用设备配置文件像声明其他命令那样声明的三个命令:lwm2m.write、lwm2m.execute 和 lwm2m.read,每个命令的载荷中都带有 path(写入时还带有标量 value)。**请按顺序执行各步骤,并等每条命令达到 SUCCESSFUL 后再发出下一条。**DeviceChain 保持同一设备命令的入队顺序,但设备自身的固件状态机同样需要这个顺序。

  1. **设置包 URI。**把镜像的位置写入 Firmware Update 对象的 Package URI 资源。设备开始下载。

    {"path": "/5/0/1", "value": "coaps://fw.example/image.bin"}

    用 lwm2m.write 发送该载荷。镜像由你自己托管的地方提供;DeviceChain 不保存它,也不发放链接。不支持写入包本身(/5/0/0),因为一次写入只携带一个不超过 8 KiB 的标量值。

  2. **触发更新。**读取 /5/0/3,直到它变为 2(已下载;1 为下载中),然后执行 Update 资源。

    {"path": "/5/0/2"}

    用 lwm2m.execute 发送该载荷。

  3. **查看进度和结果。**用 lwm2m.read 读取 State 资源(/5/0/3;0 为空闲,1 为下载中,2 为已下载,3 为正在更新)和 Update Result 资源(/5/0/5;0 为初始,1 为成功,2 及以上为错误)。

读取是跟踪进度的唯一方式。DeviceChain 只观测传感器对象范围(3200 到 3441),所以对象 5 永远不会被观测,其状态和结果也不会作为测量到达。对于队列模式的设备,整个序列与其他命令一样走保持并投递的路径:每条命令先被保持,在设备唤醒时投递,最早的先投递。

**托管更新目前还不能送达 LwM2M 设备。**制品、签名转发、以 UPDATED 结束的尝试和发布,都需要这种传输方式目前不具备的条件:

  • 平台的下载链接比 Package URI 资源允许的长度更长:在对象 5 的 1.0 版本中,该资源是不超过 255 字节的字符串。
  • 对象 5 没有承载签名的资源。设备自身的固件格式负责校验,平台没有地方转发签名,因此某个分配可能看起来已通过认证,实际上并没有。
  • LwM2M 没有启动标识符,所以尝试所需的证据,即以目标版本运行的新一次启动,只能根据新的注册和 Device 对象推断。
  • 平台只通过 HTTPS 提供下载,而设备的固件下载可能只支持 CoAP。

请把这份运行手册当作更新 LwM2M 设备的方式。自动化互操作测试覆盖的是注册和遥测,而不是命令,因此在依赖这一序列之前,请先在你自己的设备型号上试一遍。

具名操作与设备信息​

设备对象(Device)的两个标准操作可以按名称使用,无需手工输入 /3/0/4:

命令键作用
lwm2m.reboot执行设备对象的 Reboot 资源。不带参数。
lwm2m.readDeviceInfo读取制造商、型号、序列号、固件版本和电池电量,并返回已读取的值以及无法读取的资源列表。

它们是普通命令。像其他命令一样在设备配置文件中声明它们(配置文件的“命令”选项卡提供 添加 LwM2M 标准命令 按钮,可一次添加两者),它们会经过与其他命令相同的入队检查、权限、审计记录以及保留与唤醒后投递。设备上不存在的资源会连同原因一起报告为缺失,而不会使整次读取失败。

lwm2m.reboot 创建时的影响级别为 DISRUPTIVE,因此带有维护窗口的设备类型会保留它,直到窗口开启。原始 lwm2m.execute 不受控制。

出厂重置(Factory Reset)有意不按名称提供:它具有破坏性且无法撤销。它同样不能作为原始 lwm2m.execute 发送:针对 /3/0/5(Device 对象的任意实例)的 Execute 会被以 COMMAND_DESTRUCTIVE_REFUSED 拒绝,无论是单条命令、批量命令还是自动化规则发出的。计划提供带确认的具名操作。固件更新同样仍是使用对象 5 更新固件中所述由运维人员执行的步骤序列。

同样的设备对象信息也会自动采集。设备注册时,DeviceChain 会读取这些资源一次,并将其记录为设备的客户端属性(manufacturer、modelNumber、serialNumber、firmwareVersion、batteryLevel),因此会显示在设备页面上。设备未上报的资源会列在 lwm2m.deviceInfoMissing 属性中。这绝不会延迟注册或遥测:它在注册完成之后运行,与命令遵循相同的按设备顺序,每个资源只请求一次,对无响应的设备仅重试一次,且同一设备最多每小时读取一次。未变化的值不会被重写。

相同流水线​

解码后的测量和在线状态变更经过普通的解码 → 解析 → 持久化路径,因此所有下游功能都像处理其他设备一样处理 LwM2M 设备。

租户与身份​

每台设备通过经过认证的 DTLS PSK 身份绑定到租户,连接时映射为 (tenant, externalId)。由于握手时就检查身份,设备绝不可能提交其他租户的流量。线上身份是不透明句柄,而不是可读的 tenant:device 字符串。

高可用性​

同一时间只有一个副本提供 CoAP 端点,由带隔离保护的所有权租约控制。这不是调优选项。设备向一个绑定的 UDP 套接字建立入站连接,如果第二个副本共享 Service,它就会静默收到并丢弃部分数据报。只有租约持有者绑定套接字,部署也拒绝渲染多个副本。

租约使替换安全且自动。替代 Pod 在取得租约前不绑定任何端点,因此两个进程不会同时绑定该端点。队列模式设备可能有意长时间保持静默,所以新领导者从持久化投影重建在线状态,而不是探测设备。未重新注册的设备只有在超过服务器最大注册有效期后才标记为离线。切换不会错误地把休眠设备标记为离线。

恢复是自动的,但不是即时的。需要替代 Pod 调度和绑定的时间,再加上最长 30 秒的租约隔离窗口。该窗口中的数据报会丢失,而 CoAP 可确认消息会重传,因此切换本身大多不会被察觉。

观测不会在切换后保留。 DTLS 会话随旧进程结束,新领导者启动时没有任何会话,因此只有设备主动重新注册后,才会再次发出 Observe。在线状态会重建,遥测不会。

数据中断时长只受每台设备自己的注册有效期限制。使用 LwM2M 默认值的设备,有效期为 86400 秒:完全健康的设备也可能整整一天没有数据。

要缩短中断,请缩短设备请求的注册有效期,代价是注册更新更频繁。应根据你能够接受重启后多长时间没有遥测数据来选择。

服务器的最大注册有效期(maxLifetimeSeconds)是所有注册有效期的上限。降低它不会缩短数据中断,因为设备不会获知这个截断,仍按自身计划更新。应将其设置得高于设备请求的最长有效期。请求更长有效期的设备可能在自身两次更新之间过期,因此不仅每次切换时会被标记为离线,正常运行时也会。

运行​

CoAP 端点由单个拥有所有权的副本提供。因此,在生产环境依赖 LwM2M 前应了解几个运维特性:切换的代价、为什么观测不会自行恢复,以及如何限制遥测中断。这些内容见**运行边缘服务**。