讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

如何在 Azure DPS 中正确更新现有设备注册项(Enrollment)

落萱小哥_2558

落萱小哥_2558

发布时间:2026-11-12 21:59:08

|

144人浏览过

|

来源于php中文网

原创

如何在 Azure DPS 中正确更新现有设备注册项(Enrollment)

本文详解在 Azure 设备预配服务(DPS)中更新已有 Enrollment 的关键步骤,重点解决因缺失 if_match 参数导致的 409201 “Enrollment already exists” 错误,并提供可直接运行的 Python 示例代码与最佳实践。

本文详解在 azure 设备预配服务(dps)中更新已有 enrollment 的关键步骤,重点解决因缺失 `if_match` 参数导致的 409201 “enrollment already exists” 错误,并提供可直接运行的 python 示例代码与最佳实践。

在 Azure DPS 中,更新一个已存在的设备注册项(Enrollment)并非简单的“覆盖写入”,而是一个需遵循乐观并发控制(Optimistic Concurrency Control)的原子操作。核心限制在于:DPS 要求所有 create_or_update 请求必须显式携带当前资源的 etag 值作为 if_match 请求头,否则服务将拒绝更新并返回 HTTP 状态码 409 Conflict(错误码 409201: Enrollment already exists)。该机制用于防止并发修改冲突,确保数据一致性。

许多开发者在调用 create_or_update 时误以为只要传入包含 etag 字段的 enrollment 对象即可自动生效——但事实是:etag 必须通过独立参数 if_match 显式传递,SDK 不会自动从对象中提取该字段。

以下为经过验证的、生产就绪的 Python 更新逻辑(基于 azure-iot-provisioning-service-client SDK):

def _create_or_update_enrollment(
    device_id: str,
    external_id: str,
    client_name: str,
    iothub_hostname: str,
    dps_connection_string: str,
) -> dict:
    from azure.iot.provisioning.service import DeviceProvisioningClient
    import logging

    _logger = logging.getLogger(__name__)
    primary_key = _generate_symmetric_key()  # 自定义密钥生成函数
    secondary_key = _generate_symmetric_key()

    client = DeviceProvisioningClient.from_connection_string(dps_connection_string)

    try:
        # 步骤1:获取现有 enrollment(含 etag)
        existing = client.enrollment.get(device_id)
        _logger.info(f"Retrieved existing enrollment for {device_id}")
    except Exception as e:
        _logger.warning(f"No existing enrollment found for {device_id}, will create new one: {e}")
        existing = {}

    # 步骤2:构建或合并 enrollment 数据结构
    # 注意:registrationId 和 deviceId 必须与 device_id 严格一致
    enrollment_data = {
        "registrationId": device_id,
        "attestation": {
            "type": "symmetricKey",
            "symmetricKey": {
                "primaryKey": primary_key,
                "secondaryKey": secondary_key
            }
        },
        "iotHubs": [iothub_hostname],
        "deviceId": device_id,
        "initialTwin": {
            "properties": {"desired": {"key": "value"}},
            "tags": {
                "externalId": external_id,
                "clientName": client_name,
                "endpoint": "messages"
            }
        },
        "allocationPolicy": "static"
    }

    # 步骤3:合并现有字段(如 etag、provisioningStatus 等),避免丢失元数据
    if existing:
        enrollment_data.update({
            "etag": existing.get("etag"),
            "provisioningStatus": existing.get("provisioningStatus", "enabled"),
            "reprovisionPolicy": existing.get("reprovisionPolicy", {"updateHubAssignment": True}),
        })

    # ✅ 关键:必须显式传入 if_match=enrollment_data["etag"]
    try:
        result = client.enrollment.create_or_update(
            id=device_id,
            enrollment=enrollment_data,
            if_match=enrollment_data["etag"]  # ← 缺失此行即触发 409201 错误
        )
        _logger.info(f"Successfully updated enrollment for {device_id}")
        return result
    except Exception as e:
        _logger.error(f"Failed to update enrollment for {device_id}: {e}")
        raise

⚠️ 重要注意事项:

  • if_match 参数值必须来自 get() 返回对象中的 etag 字段,不可省略或硬编码;
  • 若设备尚未注册(首次创建),get() 会抛出异常,此时应清空 etag 并移除 if_match 参数(或设为 None);但在 create_or_update 中传 if_match=None 仍可能失败,建议分支处理:存在则带 if_match 更新,不存在则无 if_match 创建;
  • registrationId 和 deviceId 字段必须与原始注册项完全一致,否则 DPS 将视为新资源并报错;
  • 修改 attestation 类型(如从 symmetricKey 改为 x509)不被支持,仅允许更新密钥值、IoT Hub 列表、初始孪生属性/标签等可变字段;
  • 所有更新操作均会重置 lastUpdatedDateTime,并触发后续设备重分配(取决于 reprovisionPolicy 配置)。

总结而言,Azure DPS 的 Enrollment 更新本质是一次带条件的强一致性写入。掌握 etag + if_match 这一组合,是解锁自动化密钥轮换、动态策略调整等高级场景的前提。务必在生产代码中加入健壮的异常捕获与日志记录,以便快速定位并发冲突或权限问题。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
cdn加速软件有哪些
cdn加速软件有哪些

CDN加速软件可以帮助网站提高内容访问速度和用户体验,降低服务器负载。在选择CDN加速软件时,需要根据实际需求和预算进行权衡,选择合适的软件和服务商。cdn加速软件有AWS CloudFront、Azure Content Delivery Network、Google Cloud CDN、Fastly、Cloudflare和Incapsula。

3907

2023.10.19

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

0

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

0

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

60

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

80

2026.11.06

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

80

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

60

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn