安装 Device SDK(MQTT)


本文介绍如何使用 MQTT 协议安装用于 OTA 升级的 Device SDK。

前提条件


了解 EnOS 的 OTA 升级流程,参见 设备固件升级概述

步骤 1:安装 Device SDK


下载 enos-mqtt-sdk-java。如果使用 Maven,可在 pom.xml 中添加以下依赖:

<dependency>
  <groupId>com.envisioniot</groupId>
  <artifactId>enos-mqtt</artifactId>
  <version>2.2.16</version>
</dependency>

步骤 2:下载设备固件


通过 EnOS 云端服务 Java SDK 下载设备固件。

示例代码


以下是通过 Java SDK 实现设备端 OTA 能力的示例代码:

package mqtt;

import com.envisioniot.enos.iot_mqtt_sdk.core.MqttClient;
import com.envisioniot.enos.iot_mqtt_sdk.core.internals.constants.OTAUpdateFailureCause;
import com.envisioniot.enos.iot_mqtt_sdk.core.msg.IMessageHandler;
import com.envisioniot.enos.iot_mqtt_sdk.core.profile.DefaultProfile;
import com.envisioniot.enos.iot_mqtt_sdk.message.downstream.ota.OtaUpgradeCommand;
import com.envisioniot.enos.iot_mqtt_sdk.message.upstream.ota.*;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 示例:通过 MQTT 协议实现 EnOS IoT 的固件升级
 */
public class OtaSample {
    // EnOS MQTT Broker URL,从 EnOS 应用门户 > 开发者控制台的环境信息页面获取
    private static final String BROKER_URL = "tcp://broker_url:11883";

    // 设备凭证,从 EnOS 应用门户 > 开发者控制台的设备详情页面获取
    private static final String PRODUCT_KEY = "productKey";
    private static final String DEVICE_KEY = "deviceKey";
    private static final String DEVICE_SECRET = "deviceSecret";

    private static MqttClient client;

    public static void main(String[] args) throws Exception {
        // 初始化 MQTT 客户端
        client = new MqttClient(new DefaultProfile(BROKER_URL, PRODUCT_KEY, DEVICE_KEY, DEVICE_SECRET));

        // 注册云端推送升级消息处理器
        setOtaUpgradeMessageHandler();

        System.out.println("Starting connection...");
        client.connect();

        // 上报初始固件版本
        reportVersion("initVersion");

        // 可选:设备主动请求升级(默认注释掉)
        // upgradeFirmwareByDeviceReq();

        // 保持连接运行
        while (true) {
            TimeUnit.SECONDS.sleep(5);
        }
    }

    // 注册云端推送升级消息处理器
    private static void setOtaUpgradeMessageHandler() {
        client.setArrivedMsgHandler(OtaUpgradeCommand.class, (command, topics) -> {
            System.out.println("Received command: " + command);
            Firmware firmware = command.getFirmwareInfo();

            // TODO: 从 firmware.fileUrl 下载固件文件

            // 模拟升级进度
            reportUpgradeProgress("20", "Downloading...");
            TimeUnit.SECONDS.sleep(3);
            reportUpgradeProgress("25", "Verifying...");
            TimeUnit.SECONDS.sleep(5);
            reportUpgradeProgress("80", "Installing...");
            TimeUnit.SECONDS.sleep(10);

            // 上报新版本号
            reportVersion(firmware.version);
            return null;
        });
    }

    // 上报升级失败原因(可选)
    private static void reportUpgradeFailureCause() throws Exception {
        client.setArrivedMsgHandler(OtaUpgradeCommand.class, (command, topics) -> {
            // 设备忽略升级
            reportUpgradeProgress(OTAUpdateFailureCause.DEVICE_IGNORED_THIS_UPGRADE_CODE, "Upgrade ignored by device");
            return null;
        });
    }

    // 设备主动请求升级
    private static void upgradeFirmwareByDeviceReq() throws Exception {
        List<Firmware> firmwareList = getFirmwaresFromCloud();
        if (firmwareList != null && !firmwareList.isEmpty()) {
            Firmware firmware = firmwareList.get(0); // 假设只处理第一个固件
            System.out.println("Firmware: version=" + firmware.version + ", fileUrl=" + firmware.fileUrl);

            // 模拟升级流程
            reportUpgradeProgress("20", "Downloading...");
            TimeUnit.SECONDS.sleep(3);
            reportUpgradeProgress("80", "Installing...");
            TimeUnit.SECONDS.sleep(3);
            reportVersion(firmware.version);
        }
    }

    // 上报固件版本
    private static void reportVersion(String version) throws Exception {
        OtaVersionReportRequest request = new OtaVersionReportRequest.Builder()
                .setProductKey(PRODUCT_KEY)
                .setDeviceKey(DEVICE_KEY)
                .setVersion(version)
                .build();
        OtaVersionReportResponse response = client.publish(request);
        System.out.println("Version report sent: " + response);
    }

    // 上报升级进度
    private static void reportUpgradeProgress(String progress, String desc) throws Exception {
        OtaProgressReportRequest request = new OtaProgressReportRequest.Builder()
                .setStep(progress)
                .setDesc(desc)
                .build();
        OtaProgressReportResponse response = client.publish(request);
        System.out.println("Progress reported: " + response);
    }

    // 从云端获取可用固件列表
    private static List<Firmware> getFirmwaresFromCloud() throws Exception {
        OtaGetVersionRequest request = new OtaGetVersionRequest.Builder()
                .setProductKey(PRODUCT_KEY)
                .setDeviceKey(DEVICE_KEY)
                .build();
        OtaGetVersionResponse response = client.publish(request);
        System.out.println("Get version response: " + response);
        return response.getFirmwareList();
    }
}