IP 카메라 및 NVR 에서 사용하는 Network Diagnostic 기능을 구현하는데 필요한 API 리스트와 동작 방식에 대해 상세히 서술했다.
About This Document
Revision History
Version | Date | Comment | Author |
1.0 | 2013-11-06 | 최초 작성 | 시스템 소프트웨어3팀 김우종 선임연구원 |
Purpose
본 문서는 IP 카메라 상에서 Network Diagnostic 기능을 구현하기 위해서 필요한 API 에 대한 설명을 기술하고 있다. 이 문서를 통해 Network Diagnostic 기능의 동작을 좀더 쉽게 이해할 수 있고 나아가서는 디버깅 및 기능 개선 하는데 소요되는 시간을 줄일 수 있을 것이라 기대한다.
Conventions and Acronyms
Codes
소스코드와 API 함수 표기는 굴림 글꼴로 표시한다. 이 문서에 언급한 API 는 SVN 상의 최신 소스코드에 반영되어 있다.
Notes & Cautions
내용 중 알아두면 편리한 참고 사항과 반드시 알아야 하는 중요 사항을 다음과 같이 표시한다.
<Note> | 내용 중 알아두면 편리한 각종 참고 사항 |
<Caution> | 내용 중 반드시 알아야 하는 중요한 사항 |
Acronyms
본 문서는 다음과 같은 약어를 사용한다.
Acronym | Description |
cron | 주기적으로 주어진 스크립트를 실행할 수 있게 도와주는 프로그램 |
ND | Network Diagnostic 의 약어다 |
Overview
Network Diagnostic 기능은 말 그대로 네트워크를 진단하기 위한 목적으로 사용한다. 진단의 근거(source)가 되는 것은 주기적으로 저장되는 로그인데, 이 문서에서 설명하는 API 를 사용하여 접근이 가능하다.
로그에 포함되는 내용은 다음과 같다.
- PACKET LOSS
- RTT
- INBOUND TRAFFIC
- POE
- RMON
위 항목은 기본적으로 1분마다 측정되어 파일에 저장된다.
Operation
Initialization
카메라가 부팅하면, cron 이 동작하면서, 등록된 스크립트를 실행한다. 이것은 각각 1분 또는 하루마다 실행된다.
Logging
로그 파일 포맷은 크게 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 에 대한 설명을 한다.
Structures
ND_STATUS_T
Network Diagnostic API 를 실행한 후 결과값을 저장하는 구조체. 이 값을 통해 원하는 대로 API 가 실행되었는지 여부를 판단한다.
typedef enum { ND_OK = 0, // 성공 ND_FAIL = -1 // 실패 }ND_STATUS_T;
ND_DURATION_T
얻어올 데이터의 기간을 정의하는 구조체.
typedef enum { MIN = 1, HOUR = 2, DAY = 3, WEEK = 4, MONTH = 5 }ND_DURATION_T;
ND_RESULT_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;
Common API Functions
ND_GetDataResult
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 | 호출되면, 전체 데이터 파일에서 인자를 조건으로 필터링한 결과값을 얻는다. |
Code
#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; }
Example
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); }