Después de migrar una instancia, debe redirigir las llamadas a la API de la nube de los servicios relacionados hacia la instancia Enterprise Edition de destino. Para ello, desarrolle métodos que actualicen el ID de instancia del dispositivo en su base de datos y pase el ID de instancia Enterprise Edition actualizado al invocar las API de la nube para controlar los servicios del dispositivo. Este ejemplo utiliza un entorno de desarrollo Java.
Contexto
Para obtener más información sobre la migración de instancias, consulte Must-reads before you start.
Para suscribirse a los datos de migración de instancias, consulte Configure data forwarding rules.
Entorno de desarrollo
El entorno de desarrollo requiere:
Versión de JDK: JDK 8 o posterior
Entorno de desarrollo integrado (IDE): IntelliJ IDEA Community Edition
Descripción del código de ejemplo
|
Función |
Descripción |
|
Actualización de datos del dispositivo |
Analiza los mensajes de migración de instancias suscritos from una instancia pública mediante el motor de reglas. Posteriormente, procesa los mensajes de reenvío de datos correspondientes a los dispositivos migrados correctamente y actualice el ID de instancia en la base de datos según la información del dispositivo. |
|
Control de servicios del dispositivo |
Modifica el método de llamada a la API para los servicios de control de dispositivos. Al invocar una API de la nube, consulte el ID de instancia Enterprise Edition en la tabla de la base de datos, establezca el parámetro de solicitud IotInstanceId con dicho ID y luego llama a la API. |
Código de ejemplo para actualizar datos del dispositivo
El método para actualizar los datos del dispositivo depende del SDK utilizado para el acceso del cliente AMQP. Para consultar un ejemplo de acceso mediante cliente AMQP, consulte Java SDK access example.
Para actualizar el método que procesa los mensajes de migración de instancias, reemplace el método processMessage con el siguiente código. Los métodos updateDeviceInstanceId(productKey, deviceName, targetInstanceId) y recoverDeviceInstanceId(productKey, deviceName) actualizan los datos en la base de datos. Debe desarrollar estos métodos según sus necesidades.
private static void processMessage(Message message) {
try {
byte[] body = message.getBody(byte[].class);
String content = new String(body);
String topic = message.getStringProperty("topic");
String messageId = message.getStringProperty("messageId");
logger.info("receive message"
+ ",\n topic = " + topic
+ ",\n messageId = " + messageId
+ ",\n content = " + content);
if (null == content) {
logger.error("content is null");
}
JSONObject object = JSON.parseObject(content);
String status = object.getString("status");
// Update the instance ID of the successfully migrated device.
String targetInstanceId = object.getString("targetInstance");
// Process the successfully migrated devices and update their instance IDs to the target Enterprise instance ID.
if (StringUtils.equals(status, "GRAY_EXECUTING") || StringUtils.equals(status, "ALL_EXECUTING")) {
JSONArray successDevices = object.getJSONArray("successDevices");
if (successDevices == null) {
return;
}
for (int i = 0; i < successDevices.size(); i++) {
JSONObject device = successDevices.getJSONObject(i);
if (null == device) {
return;
}
String deviceName = device.getString("deviceName");
String productKey = device.getString("productKey");
// todo: Update the instance ID of the successfully migrated device in the database based on the productKey, deviceName, and target.
// updateDeviceInstanceId(productKey, deviceName, targetInstanceId)
}
}
// Process the successfully rolled-back devices and restore their original instance IDs.
if (StringUtils.equals("status", "ROLL_BACK_EXECUTING")) {
JSONArray successDevices = object.getJSONArray("successDevices");
if (successDevices == null) {
return;
}
for (int i = 0; i < successDevices.size(); i++) {
JSONObject device = successDevices.getJSONObject(i);
if (null == device) {
return;
}
String deviceName = device.getString("deviceName");
String productKey = device.getString("productKey");
// todo: Restore the instanceId in the database based on the productKey and deviceName. The recovery policy depends on the business scenario.
// 1. If the original business that called the public instance did not store an instance ID, restore the instance ID to null.
// 2. If the original business that called the public instance stored a specific instance ID value, restore the instance ID to its original default value.
// recoverDeviceInstanceId(productKey, deviceName)
}
}
} catch (Exception e) {
logger.error("processMessage occurs error ", e);
}
}
Código de ejemplo para controlar servicios del dispositivo
El método para invocar las API de negocio relacionadas con el dispositivo depende del SDK de la nube de IoT Platform. Para obtener más información, consulte Java SDK usage notes.
El siguiente código toma como ejemplo la API Pub y agrega el método de llamada a la API pub(client, productKey, deviceName). Debe implementar el método getInstanceId(productKey, deviceName) según sus requisitos.
public static void main(String[] args) {
String accessKey = "${accessKey}";
String accessSecret = "${accessSecret}";
String productKey = "${productKey}";
String deviceName = "${deviceName}";
IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
pub(client, productKey, deviceName);
}
private static void pub(DefaultAcsClient client, String productKey, String deviceName) {
PubRequest request = new PubRequest();
// Obtain the instance ID from the database.
String instanceId = getInstanceId(productKey, deviceName);
// If the instance ID is not empty, pass the parameter to set the instance ID. Note that only Enterprise instances require this parameter. Public instances do not.
if (!StringUtils.isEmpty(instanceId)) {
request.setIotInstanceId(instanceId);
}
request.setProductKey("${productKey}");
request.setMessageContent(Base64.encodeBase64String("hello world".getBytes()));
request.setTopicFullName("/${productKey}/${deviceName}/user/get");
request.setQos(0); // QoS 0 and QoS 1 are supported.
try {
PubResponse response = client.getAcsResponse(request);
System.out.println(response.getSuccess());
System.out.println(response.getCode());
System.out.println(response.getErrorMessage());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
e.printStackTrace();
}
}
/**
* Obtain the instance ID from the database.
*
* @param productKey
* @param deviceName
* @return
*/
private static String getInstanceId(String productKey, String deviceName) {
String instanceId = "";
// todo: Query and organize information from the database based on the productKey and deviceName.
// instanceId = query(productKey, deviceName);
return instanceId;
}