Todos los productos
Search
Centro de documentos

IoT Platform:Ejemplo

Última actualización: Sep 07, 2026

Este artículo describe cómo llamar a las operaciones de API de Link SDK for C para implementar tareas de dispositivo. En este ejemplo se utiliza el archivo de código de muestra ./demos/task_posix_demo.c.

Contexto

  • Para obtener más información sobre las tareas de dispositivo, consulte Overview.

  • usa conexiones MQTT. Para ver ejemplos de código relacionados, consulte MQTT connection.

Paso 1: Inicialización

  1. Agregue los archivos de encabezado.

    ...
    ...
    
    #include "aiot_task_api.h"
  2. Configure las dependencias subyacentes y la salida de registros.

        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. Llame a la operación aiot_task_init() para crear una instancia de cliente task e inicializar los parámetros predeterminados.

        task_handle = aiot_task_init();
        if (task_handle == NULL) {
            demo_mqtt_stop(&mqtt_handle);
            printf("aiot_task_init failed\n");
            return -1;
        }

Paso 2: Configurar funciones

Llame a la operación aiot_task_setopt() para configurar los siguientes elementos:

  1. Asocie un identificador de conexión MQTT.

    Importante

    Antes de establecer los parámetros específicos de la tarea del dispositivo, debe configurar parámetros como las credenciales del dispositivo. Para obtener más información, consulte Configure connection parameters for MQTT.

    • Código de muestra:

          aiot_task_setopt(task_handle, AIOT_TASKOPT_MQTT_HANDLE, mqtt_handle);
    • Parámetros:

      Parámetro

      Ejemplo

      Descripción

      AIOT_TASKOPT_MQTT_HANDLE

      mqtt_handle

      Las solicitudes TSL usan esta conexión.

  2. Configure una devolución de llamada de mensajes.

    • Código de muestra

          aiot_task_setopt(task_handle, AIOT_TASKOPT_RECV_HANDLER, demo_task_recv_handler);
    • Parámetros:

      Parámetro

      Ejemplo

      Descripción

      AIOT_TASKOPT_RECV_HANDLER

      demo_task_recv_handler

      Cuando se recibe un mensaje específico de la tarea del dispositivo, se llama a esta función.

Paso 3: Recibir una notificación de tarea descendente

Si IoT Platform envía una notificación de tarea mientras el dispositivo está en línea, siga estos pasos para procesarla:

  1. Inicie sesión en la consola de IoT Platform y cree una tarea de dispositivo.

  2. Después de crear la tarea del dispositivo, IoT Platform envía una notificación al dispositivo. Una vez que el dispositivo recibe la notificación, se llama a la devolución de llamada demo_task_recv_handler.

    Al definir la lógica de la devolución de llamada, tenga en cuenta lo siguiente:

    • aiot_task_recv_t es un parámetro de entrada de la devolución de llamada. Este parámetro indica el formato de datos.

    • AIOT_TASKRECV_NOTIFY indica el tipo de mensaje.

    • La siguiente tabla describe un ejemplo de notificación y su formato de datos Alink.

      Ejemplo

      Formato de datos Alink

      Descripción

      {
          "task": {
              "taskId": "i5Ks6***pF010101",
              "status": "SENT",
              "jobDocument": {
      
              },
              "jobFile": {
                  "signMethod": "Md5",
                  "sign": "wssxff56dhdsd***",
                  "fileUrl": "https://iotx-***.aliyuncs.com/***.zip"
              }
          }
      }
      {
            "id": "7542940",
            "version": "1.0",
              "params": {
                  "task": {
                      "taskId": "i5Ks6***pF010101",
                      "status": "SENT",
                      "jobDocument": {
                        },
                "jobFile":{
                   "signMethod":"Md5",
                   "sign":"wssxff56dhdsd***",
                   "fileUrl": "https://iotx-***.aliyuncs.com/***.zip"
                }
                  }
              }
          }

      El contenido del mensaje tiene formato JSON. Dicho contenido corresponde al valor del parámetro params en los datos Alink.

    • El dispositivo ejecuta las tareas de la tarea principal y luego envía sus estados a IoT Platform. Para obtener más información sobre cómo actualizar tareas, consulte Step 5: Update the statuses of tasks under the job.

    • Este ejemplo no incluye la lógica para ejecutar las tareas. Debe especificar la lógica de procesamiento según sus necesidades de negocio.

      void demo_task_recv_handler(void *handle, const aiot_task_recv_t *packet, void *userdata)
      {
          switch (packet->type) {
              case AIOT_TASKRECV_NOTIFY: {
                  const task_desc_t *in_desc = &(packet->data.notify);
      
                  printf("revice task notify, task_id:[%s],status:[%d],job_document[%s],document_file_url:[%s],\
                  sign_method:[%s],sign[%s]\r\n",
                         in_desc->task_id, in_desc->status, in_desc->job_document,
                         in_desc->document_file_url, in_desc->sign_method, in_desc->sign);
      
                  /* 1.If no job records exist in the handle, save the job that is sent by IoT Platform to the default_task_desc field in the handle. */
                  if (NULL == g_local_task_desc) {
                      demo_copy_task_to_local_task(&g_local_task_desc, in_desc);
                      /* Start the job. In this example, the job information is printed. You can specify the logic based on your business needs. */
                      int res = pthread_create(&g_task_thread, NULL, demo_task_thread, g_local_task_desc);
                      if (res != 0) {
                          printf("pthread_create demo_task_thread failed: %d\r\n", res);
                      } else {
                          /* Set the type of the downloading thread to detach. After the firmware is obtained, the downloading thread automatically exits. */
                          pthread_detach(g_task_thread);
                      }
                      /* Change the job status.TODO: The following code is for reference only. After the job is completed, you must set the status to AIOT_TASK_STATUS_SUCCEEDED. */
                      g_local_task_desc->status = AIOT_TASK_STATUS_IN_PROGRESS;
                      aiot_task_update(handle, g_local_task_desc);
                      demo_free_local_task(&g_local_task_desc);
                      break;
                  }
      
                  /* 2.If the job status is set to the final status by IoT Platform, the local job is cleared. */
                  if (in_desc->status == AIOT_TASK_STATUS_CANCELLED || in_desc->status == AIOT_TASK_STATUS_REMOVED
                      || in_desc->status == AIOT_TASK_STATUS_TIMED_OUT) {
                      /* TODO: Clear the local job and stop the thread. */
                      /* If the job is the default job recorded in the handle, clear the memory of the job. Otherwise, you must maintain the memory of the job. */
                      if (NULL != g_local_task_desc && 0 == strcmp(in_desc->task_id, g_local_task_desc->task_id)) {
                          /* Release the memory of the local job. */
                          demo_free_local_task(&g_local_task_desc);
                      }
                      break;
                  }
      
                  /* 3.If a local job already exists, IoT Platform updates the description of the job. You must check the updated description. */
                  if (in_desc->status == AIOT_TASK_STATUS_IN_PROGRESS) {
                      if (NULL != g_local_task_desc && 0 == strcmp(in_desc->task_id, g_local_task_desc->task_id)) {
                          /* TODO: Update the description of the local job. You can suspend the current job based on your business needs. * /
                          break;
                      }
                  }
      
                  /* 4.In other cases, the received job is determined as a new job. If a job is running and a new job is received, you can create a list in the main() function. */
                  /* Pass in the list as the userdata parameter and record all jobs in this list for maintenance. */
                  break;
              }
      ……
      ... 
      }

Paso 4: Solicitar una tarea de dispositivo

Una vez que el dispositivo se conecta, puede solicitar una tarea de dispositivo.

  1. Llame a la operación aiot_task_get_task_detail para enviar una solicitud a IoT Platform. Si establece el parámetro en NULL, obtendrá la información de la primera tarea pendiente de ejecución.

    Nota

    Si IoT Platform envía varias tareas de dispositivo al dispositivo, puede llamar a la operación aiot_task_get_task_list para consultarlas antes de recibir las notificaciones. Después, podrá consultar la información de cada tarea de dispositivo.

        res = aiot_task_get_task_detail(task_handle, NULL);
        if (res < STATE_SUCCESS) {
            aiot_task_deinit(&task_handle);
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }
                            
  2. Cuando IoT Platform recibe la solicitud, devuelve al dispositivo la información de la tarea creada.

  3. Una vez que el dispositivo recibe la notificación de la tarea, se llama a la devolución de llamada demo_task_recv_handler.

    Al definir la lógica de la devolución de llamada, tenga en cuenta lo siguiente:

    • aiot_task_recv_t es un parámetro de entrada de la devolución de llamada. Este parámetro indica el formato de datos.

    • AIOT_TASKRECV_GET_DETAIL_REPLY indica el tipo de mensaje.

    • La siguiente tabla describe un ejemplo de notificación y su formato de datos Alink.

      Ejemplo

      Formato de datos Alink

      Descripción

      {
                "taskId": "i5Ks***F010101",
                "status": "IN_PROGRESS",
                "jobDocument": {
             },
               "jobFile":{
                    "signMethod":"Md5",
                    "sign":"wssxff56dhdsd***",
                    "fileUrl": "https://iotx-***.aliyuncs.com/***.zip"
            }
      }
      {
            "id": "1234",
            "code": 200,
            "data": {
              "taskId": "$next",
              "task":{
                    "taskId": "i5Ks***F010101",
                    "status": "IN_PROGRESS",
                    "jobDocument": {
                 },
                   "jobFile":{
                        "signMethod":"Md5",
                        "sign":"wssxff56dhdsd***",
                        "fileUrl": "https://iotx-***.aliyuncs.com/***.zip"
                }
               }
              }
          }

      El contenido del mensaje tiene formato JSON. Dicho contenido corresponde al valor del parámetro params en los datos Alink.

    • El dispositivo ejecuta las tareas de la tarea principal y luego envía sus estados a IoT Platform. Para obtener más información sobre cómo actualizar tareas, consulte Step 5: Update the statuses of tasks under the job.

    • Este ejemplo no incluye la lógica para ejecutar las tareas. Debe especificar la lógica de procesamiento según sus necesidades de negocio.

      void demo_task_recv_handler(void *handle, const aiot_task_recv_t *packet, void *userdata)
      {
          switch (packet->type) {
      ...
      ... 
              case AIOT_TASKRECV_GET_DETAIL_REPLY: {
                  const task_get_detail_reply_t *in_reply = &(packet->data.get_detail_reply);
                  printf("revice task get detail, code:[%d]\r\n", in_reply->code);
                  if (200 == in_reply->code) {
                      printf("revice task get detail reply, task_id:[%s],status:[%d]\r\n",
                             in_reply->task.task_id, in_reply->task.status);
                      if (in_reply->task.status != AIOT_TASK_STATUS_NOT_FOUND) {
                          printf("job_document[%s],document_file_url:[%s], sign_method:[%s],sign[%s]\r\n",
                                 in_reply->task.job_document, in_reply->task.document_file_url,
                                 in_reply->task.sign_method, in_reply->task.sign);
                          task_desc_t task;
                          memset(&task, 0, sizeof(task));
                          memcpy(&task, &(in_reply->task), sizeof(task));
                          /* TODO: Implement the job by starting a thread. */
      
                          /* Change the job status. TODO: The following code is for reference only. You can specify the logic based on your business needs. After the task is completed, set the status to AIOT_TASK_STATUS_SUCCEEDED. */
                          task.status = AIOT_TASK_STATUS_IN_PROGRESS;
                          task.progress = 88;
                          aiot_task_update(handle, &task);
                      }
                  }
                  break;
              }
      ……
      ... 
      }

Paso 5: Actualizar los estados de las tareas de la tarea principal

Después de obtener la información de la tarea y ejecutar las tareas correspondientes, el dispositivo debe enviar sus estados a IoT Platform.

  1. Llame a la operación aiot_task_update para enviar los estados de las tareas a IoT Platform.

    Al enviar los estados de las tareas, tenga en cuenta lo siguiente:

    • task_desc_t indica el formato de datos.

    • aiot_task_update indica la operación de API.

    • El siguiente ejemplo muestra un mensaje con formato Alink.

      Nota

      El contenido del mensaje tiene formato JSON. Dicho contenido corresponde al valor del parámetro params en los datos Alink.

      {
          "id": "123",
          "version": "1.0",
          "params": {
              "taskId": "i5Ks***F010101",
              "status": "IN_PROGRESS",
              "statusDetails": {
                  "key": "value"
              },
              "progress": 50
          }
      }

      El contenido del mensaje tiene formato JSON. Dicho contenido corresponde al valor del parámetro params en los datos Alink. El contenido del mensaje tiene formato JSON. Dicho contenido corresponde al valor del parámetro params en los datos Alink. Nota: El contenido del mensaje tiene formato JSON. Dicho contenido corresponde al valor del parámetro params en los datos Alink. El contenido del mensaje tiene formato JSON. Dicho contenido corresponde al valor del parámetro params en los datos Alink.

    • En este ejemplo se envía el estado AIOT_TASK_STATUS_IN_PROGRESS. En escenarios de negocio reales, debe obtener los estados de las tareas y enviarlos.

      • Código de muestra del paso 3

                        g_local_task_desc->status = AIOT_TASK_STATUS_IN_PROGRESS;
                        aiot_task_update(handle, g_local_task_desc);
                        demo_free_local_task(&g_local_task_desc);
      • Código de muestra del paso 4

                            task.status = AIOT_TASK_STATUS_IN_PROGRESS;
                            task.progress = 88;
                            aiot_task_update(handle, &task);
  2. Una vez enviados los estados de las tareas, IoT Platform devuelve un mensaje de respuesta. En ese momento, se llama a la devolución de llamada demo_task_recv_handler.

    Al definir la lógica de la devolución de llamada, tenga en cuenta lo siguiente:

    • aiot_task_recv_t es un parámetro de entrada de la devolución de llamada. Este parámetro indica el formato de datos.

    • AIOT_TASKRECV_UPDATE_REPLY indica el tipo de mensaje.

    • Este ejemplo no incluye la lógica para ejecutar las tareas. Debe especificar la lógica de procesamiento según sus necesidades de negocio.

      void demo_task_recv_handler(void *handle, const aiot_task_recv_t *packet, void *userdata)
      {
          switch (packet->type) {
      ...
      ... 
              case AIOT_TASKRECV_UPDATE_REPLY: {
                  const task_update_reply_t *update_reply = &(packet->data.update_reply);
                  printf("revice task update reply, code:[%d]\r\n", update_reply->code);
      
                  if (200 == update_reply->code) {
                      printf("revice task update reply, task_id:[%s]\r\n", update_reply->task_id);
                  }
      
                  if (71012 == update_reply->code) {
                      printf("aiot_task_update task's status_details value must be json format\r\n");
                  }
                  /* TODO */
                  break;
              }
      ……
      ... 
      }

Paso 6: Salir del programa

Llame a la operación aiot_task_deinit() para destruir la instancia de cliente task y liberar los recursos.

    res = aiot_task_deinit(&task_handle);
    if (res < STATE_SUCCESS) {
        demo_mqtt_stop(&mqtt_handle);
        printf("aiot_task_deinit failed: -0x%04X\n", -res);
        return -1;
    }

Paso 7: Finalizar la conexión

Nota

MQTT suele usarse en dispositivos que requieren una conexión persistente. Por lo tanto, el programa normalmente no llega a este punto.

En el programa de muestra, el hilo principal se encarga de configurar los parámetros y establecer la conexión. Una vez establecida, el hilo principal puede entrar en hibernación.

Puede llamar a aiot_mqtt_disconnect para enviar un mensaje de desconexión a IoT Platform y desconectarse de la red.

    res = aiot_mqtt_disconnect(mqtt_handle);
    if (res < STATE_SUCCESS) {
        aiot_mqtt_deinit(&mqtt_handle);
        printf("aiot_mqtt_disconnect failed: -0x%04X\n", -res);
        return -1;
    }

A continuación

  • Después de configurar el archivo de código de muestra, compílelo para generar un archivo ejecutable. En este ejemplo se genera el archivo ejecutable ./output/task_posix_demo.

    Para obtener más información, consulte Compile and run.

  • Para obtener más información sobre los resultados de ejecución, consulte Operation logs.