./demos/logpost_basic_demo.c以支援裝置向物聯網平台上報本地日誌。
背景資訊
步驟一:
- 添加標頭檔。
…… …… #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 https://iot.console.aliyun.com\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;
}