本文以C Link SDK中的Demo文件./demos/logpost_basic_demo.c为例,介绍如何调用Link SDK的API,以支持设备向物联网平台上报本地日志。

背景信息

  • 使用日志上报功能前,请确保已在物联网平台控制的设备详情页,打开设备本地日志上报开关。更多信息,请参见概述

  • 日志上报功能基于MQTT接入,开发过程中涉及MQTT接入的代码说明,请参见MQTT接入

步骤一:初始化

  1. 添加头文件。
    ……
    ……
    
    #include "aiot_logpost_api.h"
  2. 配置底层依赖和日志输出。
        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. 调用aiot_logpost_init,创建data-model客户端实例,并初始化默认参数。
        logpost_handle = aiot_logpost_init();
        if (logpost_handle == NULL) {
            demo_mqtt_stop(&mqtt_handle);
            printf("aiot_logpost_init failed\r\n");
            return -1;
        }

步骤二:配置功能

调用aiot_logpost_setopt,创建LogPost客户端实例,并初始化默认参数。

  1. 关联MQTT连接的句柄。
    注意 配置上报日志功能参数前,请确保已配置设备认证信息等相关参数。具体操作,请参见MQTT配置连接参数
    • 示例代码:
          aiot_logpost_setopt(logpost_handle, AIOT_LOGPOSTOPT_MQTT_HANDLE, mqtt_handle);                      
    • 相关参数:
      配置项 示例 说明
      AIOT_LOGPOSTOPT_MQTT_HANDLE mqtt_handle 日志上报功能的请求基于MQTT连接,通过该配置项,关联MQTT连接句柄。
  2. 配置日志上报开关。
    • 示例代码:
          sys_log_switch = 1
          ……
          …… 
          aiot_logpost_setopt(logpost_handle, AIOT_LOGPOSTOPT_SYS_LOG, (void *)&sys_log_switch);                    
    • 相关参数:
      配置项 示例 说明
      AIOT_LOGPOSTOPT_SYS_LOG sys_log_switch 设备系统日志开关。打开后,将上报设备的通信延时和建立连接的耗时信息。

      开关参数的取值为:

      • 1(默认):打开。
      • 0:关闭。
  3. 配置状态监控
    1. 定义状态监控回调函数。
      您可以参考以下内容,编写回调函数的处理逻辑:
      • 事件消息的数据结构类型为aiot_logpost_event_t,是回调函数的入参。
      • 事件消息的类型为AIOT_LOGPOSTEVT_CONFIG_DATA
      • 示例代码仅做打印处理。
      void demo_logpost_event_handler(void *handle, const aiot_logpost_event_t *event, void *userdata)
      {
          switch (event->type) {
              /* 日志配置事件, 当设备与物联网平台建立连接,或在控制台页面控制日志开关时,会收到此事件 */
              case AIOT_LOGPOSTEVT_CONFIG_DATA: {
                  printf("user log switch state is: %d\r\n", event->data.config_data.on_off);
                  printf("toggle it using the switch in device detail page in https://iot.console.aliyun.com\r\n");
              }
              default:
                  break;
          }
      }
    2. 配置状态监控的回调函数。
      • 示例代码:
            aiot_logpost_setopt(logpost_handle, AIOT_LOGPOSTOPT_EVENT_HANDLER, (void *)aiot_logpost_event_handler);                     
      • 相关参数:
        配置项 示例 说明
        AIOT_LOGPOSTOPT_MQTT_HANDLE aiot_logpost_event_handlere 通过Link SDK将设备接入物联网平台后,Link SDK主动查询物联网平台控制台的设备上报日志功能是否开启,物联网平台回复查询结果时,触发该回调函数,执行对应的处理。

步骤三:发送请求

调用aiot_logpost_send,根据上一步配置的参数,向物联网平台发送请求,以上报业务相关日志。

上报日志时,需注意:

void demo_send_log(void *handle, char *log)
{
    int32_t res = 0;
    aiot_logpost_msg_t msg;

    memset(&msg, 0, sizeof(aiot_logpost_msg_t));
    msg.timestamp = 0;                          /* 单位为ms的时间戳, 填写0则SDK将使用当前的时间戳 */
    msg.loglevel = AIOT_LOGPOST_LEVEL_DEBUG;    /* 日志级别 */
    msg.module_name = "APP";                    /* 日志对应的模块 */
    msg.code = 200;                             /* 状态码 */
    msg.msg_id = 0;                             /* 云端下行报文的消息标示符, 若无对应消息可直接填0 */
    msg.content = log;                          /* 日志内容 */

    res = aiot_logpost_send(handle, &msg);
    if (res < 0) {
        printf("aiot_logpost_send failed: -0x%04X\r\n", -res);
    }
}
    ……
    …… 
    while (1) {
        sleep(10);

        /* TODO: 用户可取消注释上报日志到云端, 注意: 日志模块完成初始化后上报通道默认为关闭状态, 日志模块会在收到设备建连内部事件后立即同步云端控制台的开关状态。*/
        demo_send_log(logpost_handle, "log in while(1)");
        
    }

步骤四:退出程序

调用aiot_logpost_deinit,销毁LogPost客户端实例,释放资源。

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

后续步骤

  • 例程文件配置完成后,需进行编译,生成可执行文件./demos/logpost-basic-demo

    更多信息,请参见编译与运行

  • 关于运行结果的详细说明,请参见运行日志