安装 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();
}
}