You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于Azure IoT Hub设备更新服务获取设备端MSI更新包

实现Azure IoT Hub设备更新获取MSI包的思路与代码示例

核心流程梳理

Azure IoT Hub设备更新服务的设备端核心逻辑是:设备与IoT Hub建立连接后,监听云端推送的孪生属性补丁(包含更新包的元数据与下载地址),通过地址下载MSI包,最后执行本地安装。

设备端获取更新包的代码实现(基于azure.iot.devices)

以下是Python示例代码,可直接在本地机器模拟设备运行:

from azure.iot.device import DeviceClient
import requests
import subprocess

# 替换为你的设备连接字符串
DEVICE_CONNECTION_STRING = "HostName=你的IoT Hub名称.azure-devices.net;DeviceId=你的设备ID;SharedAccessKey=你的设备密钥"

def main():
    # 初始化设备客户端
    client = DeviceClient.create_from_connection_string(DEVICE_CONNECTION_STRING)
    client.connect()
    print("设备已连接到IoT Hub")

    # 定义孪生属性更新回调函数
    def handle_desired_properties_patch(patch):
        print(f"\n收到更新补丁: {patch}")
        # 提取MSI包的下载URL(需与云端部署的元数据字段匹配)
        update_info = patch.get("update")
        if update_info and "packageUrl" in update_info:
            package_url = update_info["packageUrl"]
            save_path = "latest_update.msi"
            # 下载MSI包
            download_msi_package(package_url, save_path)
            # 执行静默安装(Windows环境)
            install_msi_package(save_path)

    # 注册回调监听孪生属性变更
    client.on_twin_desired_properties_patch_received = handle_desired_properties_patch

    # 保持程序运行
    while True:
        pass

def download_msi_package(url, save_path):
    try:
        response = requests.get(url, stream=True)
        response.raise_for_status()
        with open(save_path, "wb") as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"MSI包已成功下载到: {save_path}")
    except Exception as e:
        print(f"下载失败: {str(e)}")

def install_msi_package(msi_path):
    try:
        # Windows静默安装命令,/qn表示无交互
        subprocess.run(
            ["msiexec", "/i", msi_path, "/qn"],
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        print("MSI包已完成静默安装")
    except subprocess.CalledProcessError as e:
        print(f"安装失败,错误信息: {e.stderr.decode('utf-8')}")

if __name__ == "__main__":
    main()

模拟器替代方案(无需真实硬件)

如果没有实体设备,可通过以下方式模拟设备端测试:

  • 直接在本地Windows机器运行上述代码,模拟IoT设备
  • 使用Azure IoT Explorer触发更新:
    1. 打开Azure IoT Explorer,连接到你的IoT Hub
    2. 找到目标测试设备,进入「孪生」页面
    3. 在「期望属性」中添加更新元数据,示例:
      {
        "update": {
          "packageUrl": "https://你的存储账户Blob地址/xxx.msi",
          "version": "1.0.1"
        }
      }
      
    4. 提交后,本地运行的模拟设备会立即收到补丁并触发下载流程

关键注意事项

  • 确保MSI包的存储地址(如Azure Blob)允许设备访问:可设置Blob为公共读取,或为设备分配SAS令牌/托管身份权限
  • 设备端需具备管理员权限,才能执行msiexec安装命令
  • 可扩展代码添加下载进度监控、错误重试、安装结果上报到云端等逻辑

内容的提问来源于stack exchange,提问作者Ajay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:06:06