OTA 升级 - 安装 Device SDK (MQTT)¶
本文介绍如何使用 MQTT 协议安装用于 OTA 升级的 device SDK 步骤。
有关 HTTP/HTTPS 协议,参见 安装 Device SDK (HTTP/HTTPS).
开始前准备¶
了解EnOS的OTA升级流程,参见设备固件升级概述。
步骤1:安装 Device SDK¶
下载 enos-mqtt-sdk-java。如果使用 Maven,其依赖如下:
<dependency>
<groupId>com.envisioniot</groupId>
<artifactId>enos-mqtt</artifactId>
<version>2.1.2</version>
</dependency>
步骤2:下载设备固件¶
通过云端服务 SDK
示例代码¶
以下为通过 Java SDK 进行设备端 OTA 能力开发的示例代码:
import com.envisioniot.enos.iot_mqtt_sdk.core.IConnectCallback;
import com.envisioniot.enos.iot_mqtt_sdk.core.MqttClient;
import com.envisioniot.enos.iot_mqtt_sdk.core.exception.EnvisionException;
import com.envisioniot.enos.iot_mqtt_sdk.core.msg.IMessageHandler;
import com.envisioniot.enos.iot_mqtt_sdk.core.msg.IMqttDeliveryMessage;
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;
/**
* device firmware over-the-air
*/
public class OtaSample {
//Please use your own productKey, deviceKey, and deviceSecret
static String productKey = "testPK";
static String deviceKey = "testDK";
static String deviceSecret = "testDS";
//Use the actual mqtt-broker url
static String brokerUrl = "tcp://{mqtt-broker-url}";
static MqttClient client;
public static void main(String[] args) throws Exception {
client = new MqttClient(new DefaultProfile(brokerUrl, productKey, deviceKey, deviceSecret));
initWithCallback(client);
//Report firmware version first
reportVersion("initVersion");
// upgradeFirmwareByCloudPush();
// upgradeFirmwareByDeviceReq();
}
public static void upgradeFirmwareByCloudPush() {
client.setArrivedMsgHandler(OtaUpgradeCommand.class, new IMessageHandler<OtaUpgradeCommand, IMqttDeliveryMessage>() {
@Override
public IMqttDeliveryMessage onMessage(OtaUpgradeCommand otaUpgradeCommand, List<String> list) throws Exception {
System.out.println("receive command: " + otaUpgradeCommand);
Firmware firmware = otaUpgradeCommand.getFirmwareInfo();
//TODO: download firmware from firmware.fileUrl
//Mock reporting progress
reportUpgradeProgress("20", "20");
TimeUnit.SECONDS.sleep(2);
reportUpgradeProgress("25", "25");
TimeUnit.SECONDS.sleep(20);
reportUpgradeProgress("80", "80");
TimeUnit.SECONDS.sleep(20);
//Firmware upgrade success, report new version
reportVersion(otaUpgradeCommand.getFirmwareInfo().version);
return null;
}
});
}
public static void upgradeFirmwareByDeviceReq() throws Exception {
List<Firmware> firmwareList = getFirmwaresFromCloud();
String version = null;
for (Firmware firmware : firmwareList) {
version = firmware.version;
StringBuffer sb = new StringBuffer();
sb.append("Firmware=>[");
sb.append("version=" + firmware.version);
sb.append("signMethod=" + firmware.signMethod);
sb.append("sign=" + firmware.sign);
sb.append("fileUrl=" + firmware.fileUrl);
sb.append("fileSize=" + firmware.fileSize);
sb.append("]");
System.out.println(sb.toString());
}
if (version != null) {
reportUpgradeProgress("20", "20");
TimeUnit.SECONDS.sleep(10);
reportUpgradeProgress("80", "80");
TimeUnit.SECONDS.sleep(20);
reportVersion(version);
}
}
public static void reportVersion(String version) throws Exception {
OtaVersionReportRequest.Builder builder = new OtaVersionReportRequest.Builder();
builder.setProductKey(productKey).setDeviceKey(deviceKey).setVersion(version);
OtaVersionReportRequest request = builder.build();
System.out.println("send =>" + request.toString());
client.fastPublish(builder.build());
}
private static void reportUpgradeProgress(String progress, String desc) throws Exception {
OtaProgressReportRequest.Builder builder = new OtaProgressReportRequest.Builder();
builder.setStep(progress).setDesc(desc);
client.fastPublish(builder.build());
}
private static List<Firmware> getFirmwaresFromCloud() throws Exception {
OtaGetVersionRequest.Builder builder = new OtaGetVersionRequest.Builder();
builder.setProductKey(productKey).setDeviceKey(deviceKey);
OtaGetVersionRequest request = builder.build();
OtaGetVersionResponse response = client.publish(request);
System.out.println("send getversion request =>" + request.toString());
System.out.println("receive getversion response =>" + response.toString());
return response.getFirmwareList();
}
private static void initWithCallback(MqttClient client) {
System.out.println("start connect with callback ... ");
try {
client.connect(new IConnectCallback() {
@Override
public void onConnectSuccess() {
System.out.println("connect success");
}
@Override
public void onConnectLost() {
System.out.println("onConnectLost");
}
@Override
public void onConnectFailed(int reasonCode) {
System.out.println("onConnectFailed : " + reasonCode);
}
});
} catch (EnvisionException e) {
e.printStackTrace();
}
}
}