本文以C Link SDK中的Demo文件./demos/logpost_basic_demo.c为例,介绍如何调用Link SDK的API,以支持设备向物联网平台上报本地日志。
背景信息
步骤一:初始化
添加头文件。
…… …… #include "aiot_logpost_api.h"配置底层依赖和日志输出。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);调用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客户端实例,并初始化默认参数。
关联MQTT连接的句柄。
重要配置上报日志功能参数前,请确保已配置设备认证信息等相关参数。具体操作,请参见MQTT配置连接参数。
示例代码:
aiot_logpost_setopt(logpost_handle, AIOT_LOGPOSTOPT_MQTT_HANDLE, mqtt_handle);相关参数:
配置项
示例
说明
AIOT_LOGPOSTOPT_MQTT_HANDLE
mqtt_handle
日志上报功能的请求基于MQTT连接,通过该配置项,关联MQTT连接句柄。
配置日志上报开关。
示例代码:
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:关闭。
配置状态监控。
定义状态监控回调函数。
您可以参考以下内容,编写回调函数的处理逻辑:
事件消息的数据结构类型为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 console.\r\n"); } default: break; } }配置状态监控的回调函数。
示例代码:
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,根据上一步配置的参数,向物联网平台发送请求,以上报业务相关日志。
上报日志时,需注意:
上报的日志消息的数据结构类型为aiot_logpost_msg_t。
上报的日志消息的Alink格式,请参见设备日志上报的Alink格式。
示例代码向物联网平台上报日志消息为
log in while(1)。
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;
}