求助:基于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触发更新:
- 打开Azure IoT Explorer,连接到你的IoT Hub
- 找到目标测试设备,进入「孪生」页面
- 在「期望属性」中添加更新元数据,示例:
{ "update": { "packageUrl": "https://你的存储账户Blob地址/xxx.msi", "version": "1.0.1" } } - 提交后,本地运行的模拟设备会立即收到补丁并触发下载流程
关键注意事项
- 确保MSI包的存储地址(如Azure Blob)允许设备访问:可设置Blob为公共读取,或为设备分配SAS令牌/托管身份权限
- 设备端需具备管理员权限,才能执行
msiexec安装命令 - 可扩展代码添加下载进度监控、错误重试、安装结果上报到云端等逻辑
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

