IP 카메라 및 NVR 에서 사용하는 Network Diagnostic 기능을 구현하는데 필요한 API 리스트와 동작 방식에 대해 상세히 서술했다.

About This Document

Version Date Comment Author
1.0 2013-11-06 최초 작성 시스템 소프트웨어3팀 김우종 선임연구원

본 문서는 IP 카메라 상에서 Network Diagnostic 기능을 구현하기 위해서 필요한 API 에 대한 설명을 기술하고 있다. 이 문서를 통해 Network Diagnostic 기능의 동작을 좀더 쉽게 이해할 수 있고 나아가서는 디버깅 및 기능 개선 하는데 소요되는 시간을 줄일 수 있을 것이라 기대한다.

소스코드와 API 함수 표기는 굴림 글꼴로 표시한다. 이 문서에 언급한 API 는 SVN 상의 최신 소스코드에 반영되어 있다.

내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다.

<Note> 내용 중 알아두면 편리한 각종 참고 사항
<Caution> 내용 중 반드시 알아야 하는 중요한 사항

본 문서는 다음과 같은 약어를 사용한다.

Acronym Description
cron 주기적으로 주어진 스크립트를 실행할 수 있게 도와주는 프로그램
ND Network Diagnostic 의 약어다

Overview

Network Diagnostic 기능은 말 그대로 네트워크를 진단하기 위한 목적으로 사용한다. 진단의 근거(source)가 되는 것은 주기적으로 저장되는 로그인데, 이 문서에서 설명하는 API 를 사용하여 접근이 가능하다.
로그에 포함되는 내용은 다음과 같다.

  1. PACKET LOSS
  2. RTT
  3. INBOUND TRAFFIC
  4. POE
  5. RMON

위 항목은 기본적으로 1분마다 측정되어 파일에 저장된다.

Operation

카메라가 부팅하면, cron 이 동작하면서, 등록된 스크립트를 실행한다. 이것은 각각 1분 또는 하루마다 실행된다.

로그 파일 포맷은 크게 2 가지다. 첫번째는 1분마다 저장하여 최대 7일간 저장되는 포맷이다.

19-09-23 06:07  0       0.89    1.98    5.00    0
19-09-24 06:07  0       0.89    1.98    5.00    0
19-09-25 06:07  0       0.89    1.98    5.00    0
19-09-26 06:07  0       0.89    1.98    5.00    0
19-09-27 06:07  0       0.89    1.98    5.00    0
19-09-28 06:07  0       0.89    1.98    5.00    0

다음은 하루마다 저장되는 로그 파일 포맷이다. 하루 동안의 각 데이터 값의 평균값이 저장된다.

19-10-02        0       1.80    3.15    5.15    7.98    0.00
19-10-03        0       1.80    3.15    5.15    7.98    0.00
19-10-04        0       1.80    3.15    5.15    7.98    0.00
19-10-05        0       1.80    3.15    5.15    7.98    0.00
19-10-06        0       1.80    3.15    5.15    7.98    0.00
19-10-07        0       1.80    3.15    5.15    7.98    0.00
19-10-08        0       1.80    3.15    5.15    7.98    0.00
19-10-09        0       1.80    3.15    5.15    7.98    0.00
19-10-10        0       1.80    3.15    5.15    7.98    0.00
19-10-11        0       1.80    3.15    5.15    7.98    0.00
19-10-12        0       1.80    3.15    5.15    7.98    0.00
19-10-13        0       1.80    3.15    5.15    7.98    0.00
19-10-14        0       1.80    3.15    5.15    7.98    0.00
19-10-15        0       1.80    3.15    5.15    7.98    0.00

API Reference Guide

API 와 그에 사용되는 Structure 에 대한 설명을 한다.

Network Diagnostic API 를 실행한 후 결과값을 저장하는 구조체. 이 값을 통해 원하는 대로 API 가 실행되었는지 여부를 판단한다.

typedef enum
{
    ND_OK = 0,         // 성공
    ND_FAIL = -1      // 실패
}ND_STATUS_T;

얻어올 데이터의 기간을 정의하는 구조체.

typedef enum
{   
    MIN = 1,
    HOUR = 2,
    DAY = 3,
    WEEK = 4,
    MONTH = 5
}ND_DURATION_T;

필터링한 결과 데이터들을 저장하는 구조체.

typedef struct
{
    char datetime[ND_TOTAL][ND_BUF_SIZE];    // 날짜,시간
    int packet_loss[ND_BUF_SIZE];             // PACKET LOSS
    float rtt[ND_BUF_SIZE];                  // RTT
    float inbound_traffic[ND_BUF_SIZE];           // INBOUND TRAFFIC
    float poe[ND_BUF_SIZE];               // POE
    float rmon[ND_BUF_SIZE];           // RMON
    int count;                    // 전체 데이터의 갯수
}ND_RESULT_T;
Description 필터링 된 결과 데이터들을 가져온다.
Syntax ND_STATUS_T ND_GetDataResult(ND_DURATION_T dur, char* datetime, ND_RESULT_T *result_data)
Parameters duration(IN) - 기간
datetime(IN) - 날짜시간
result_data(OUT) - 얻은 데이터를 저장할 구조체
Return Value If the function succeeds, the return value is WIFI_OK.
If the function fails, the return is WIFI_FAIL.
Remarks datetime 인자의 값은 '월/일/시간/년도' 형식이다
See Also WIFI API 명세서
Details 호출되면, 전체 데이터 파일에서 인자를 조건으로 필터링한 결과값을 얻는다.
#define FILTER_FILE     "/srv/network/ff"
 
WIFI_STATUS_T ND_GetDataResult(ND_DURATION_T dur, char* datetime, ND_RESULT_T *result_data)
{
 
        char cmd[256] = {0,};
        int ret; 
        int s_count = 0; 
        int count = 0; 
        char *line;
        char *pointer;
        FILE *file;
        char buf[256];
        int total_line = 0; 
 
        ND_RESULT_T _g_result_data;
 
        memset(&_g_result_data, 0, sizeof(_g_result_data));
 
        memcpy(&_g_result_data, result_data, sizeof(ND_RESULT_T));
 
        sprintf(cmd, "/srv/network/cal %s %d", datetime, dur);
 
        ret = proxy_시스템(cmd, PROXY_TYPE_SYSTEM, 10);           // 한글 주의
 
        file = fopen(FILTER_FILE, "r");
 
        if (file == NULL)
        {
                printf("Can`t open filter file!\n");
 
                return WIFI_FAIL;
        }
 
        for (line = fgets(buf, sizeof(buf), file); line != NULL; line = fgets(buf, sizeof(buf), file))
        {
                pointer = (char *)strtok(line, "\t");                   // pointer (13-11-01 16:32 )
 
                strcpy(_g_result_data.datetime[count], pointer);                        // copy date  
 
//                printf("\n!!!!!!!!!! pointer = %s !!!!!!!!!!!!!!!\n", pointer);
 
 
                while ((pointer = (char *)strtok(NULL, "\t")) != NULL)
                {
 
                        if(s_count == 0)
                        {
                                _g_result_data.packet_loss[count] = atoi(pointer);
                        }
 
                        if(s_count == 1)
                        {
                                _g_result_data.rtt[count] = atof(pointer);
                        }
 
                        if(s_count == 2)
                        {
                                _g_result_data.inbound_traffic[count] = atof(pointer);
                        }
 
                        if(s_count == 3)
                        {
                                _g_result_data.poe[count] = atof(pointer);
                        }
 
                        if(s_count == 4)
                        {
                                _g_result_data.rmon[count] = atof(pointer);
                        }
 
                        s_count++;
                }
 
                s_count = 0;
                count++;
 
                if(count == total_line)
                        break;
        }
 
        _g_result_data.count = count;
 
 
        fclose(file);
 
        memcpy(result_data, &_g_result_data, sizeof(ND_RESULT_T));
 
        return WIFI_OK;
}
        int ret = 0;
        char *date = "110116322013";
        int ii;
 
        ND_RESULT_T w_result;
 
        memset(&w_result, 0, sizeof(w_result));
 
        ret = ND_GetDataResult(RTT, MIN, date, &w_result);
 
        printf("\n!!!!!!!!!!!!!!!!! total_count = %d\n", w_result.count);
 
 
        for(ii=0; ii < w_result.count; ii++)
        {
                printf("\ndatetime = %s\t", w_result.datetime[ii]);
                printf("\npacket_loss= %d\t", w_result.packet_loss[ii]);
                printf("\nrtt = %.2f\t", w_result.rtt[ii]);
                printf("\ntraffic = %.2f\t", w_result.inbound_traffic[ii]);
                printf("\npoe = %.2f\t", w_result.poe[ii]);
                printf("\nrmon = %.2f\n", w_result.rmon[ii]);
//              printf("\ncount = %d\n", w_result.count);
        }
  • computer/itx/network_diagnostic_api_명세서.txt
  • Last modified: 4 years ago
  • by likewind