마크베이스 사용방법


마크베이스 V5 : Tutorial 6 (RestAPI with curl)

작성자
machbase
작성일
2018-09-18 14:19
조회
116

마크베이스 V5 : curl과 RestAPI을 통한 Tag 테이블 데이터 입력 및 가져오기


이 문서는 여섯번째 튜토리얼으로서 웹의 프로토콜 명령어를 command 상에서 수행하여 테스트 할 수 있는 curl 프로그램을 활용하여 마크베이스에 대한 데이터 조작을 하도록 해 본다.
당연하지만 모든 마크베이스에서 제공하는 Tag 테이블을 위한 Restful API를 통해서 이후의 모든 과정이 이루어도록 작성되었다.


여섯번째 튜토리얼 수행하기


디렉토리 확인


해당 디렉토리인 edu_6_restAPI_curl 에는아래와 같은 수행 스크립트가 존재한다. (윈도우는 확장자 .bat를 활용한다)
이 튜토리얼은 리눅스에서 동작하는 것을 기본으로 한다.


Host:~/work/TagTutorial/edu_6_restAPI_curl$ ls
1_create_tag.sql 2_insert_meta.sql get_multi.sh get_multi_msec.sh get_single.sh post_nano.sh post_sec.sh select.sql tag_lists.sh time_range.sh
Host:~/work/TagTutorial/edu_6_restAPI_curl$

마크베이스 서버 및 MWA 준비


이 튜토리얼은 Restful API를 활용하기 때문에 반드시 마크베이스 MWA를 동작시켜야 한다. 아래와 같이 구동시킨다.


Host:~/work/TagTutorial/edu_6_restAPI_curl$ machadmin -u

Host:~/work/TagTutorial/edu_6_restAPI_curl$ MWAserver start
SERVER STARTED, PID : 4846
Connection URL : http://192.168.0.148:5001
Host:~/work/TagTutorial/edu_6_restAPI_curl$

위의 화면에서는 192.168.0.148의 5001 포트가 접속 포트이다. (이후에 활용됨)
사용자마다 각기 정보가 다를 수 있으므로, 유의하도록 한다.


Tag 테이블 생성


이전 튜토리얼과 같이 파일 1_create_tag.sql (이 파일은 최초 DBMS를 생성했을 경우에 사용)하고, 두번째 파일 2_insert_meta.sql 을 통해서 태그 메타 정보를 입력한다.
이 튜토리얼에서는 4개의 태그를 통해서 실습을 진행한다.


insert into tag metadata values ('TAG_ELEC1');
insert into tag metadata values ('TAG_ELEC2');
insert into tag metadata values ('TAG_TEMP1');
insert into tag metadata values ('TAG_TEMP2');

두개는 전력 사용량, 나머지 두개는 온도를 나타내는 센서라고 가정한다.


CURL 설치


리눅스 우분투 혹은 레드헷 계열에서는 아래와 같이 curl을 설치하도록 한다.


#우분투 
sudo apt-get install curl

#레드헷
sudo yum install curl

파이썬과 POST를 통한 초간단 센서 데이터 입력


입력을 위한 Rest API 문법


마크베이스는 아래와 같은 포맷으로 데이터를 입력할 수 있는 API를 제공한다.


{
"values":[
[TAG_NAME, TAG_TIME, VALUE], # 태그명,시간,값을 입력한다.
[ .... ]....
],
"date_format":"Date Format" # date_format은 생략시 'YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn' 로 설정된다.
}

초단위 데이터 입력


튜토리얼에는 post_sec.sh 가 제공되며,초 단위로 데이터를 입력하는 예이다. (윈도우일 경우 post_sec.bat)


curl -X POST -H "Content-Type: application/json" "http://127.0.0.1:5001/machiot-rest-api/" -d '{ "values":[["TAG_ELEC1","2018-01-10 01:11:11",100]], "date_format":"YYYY-MM-DD HH24:MI:SS" }'
curl -X POST -H "Content-Type: application/json" "http://127.0.0.1:5001/machiot-rest-api/" -d '{ "values":[["TAG_ELEC2","2018-01-10 02:22:22",200],["TAG_TEMP1","2018-01-10 01:11:11",11],["TAG_TEMP2","2018-01-10 02:22:22",22]], "date_format":"YYYY-MM-DD HH24:MI:SS" }'

위의 첫번째 라인은 하나의 Tag인 TAG_ELEC1에 대해 100을 해당 시간에 대해 1건 입력하는 예제, 두번째 라인은 다수의 태그 즉, TAG_ELEC2, TAG_TEMP1, TAG_TEMP2 에 대해 3건의 데이터를 한꺼번에 입력한다.


MWA가 설치된 주소(127.0.0.1)와 포트(5001)를 적절하게 수정하고, 아래와 같이 수행하면 4개의 태그에 대해 현재의 값을 데이터가 들어간다.


Host:~/work/TagTutorial/edu_6_restAPI_curl$ sh post_sec.sh 
{"ErrorCode": 0, "ErrorMessage": "", "Data": "{\"EXECUTE RESULT\":\"Append success\"}"}
{"ErrorCode": 0, "ErrorMessage": "", "Data": "{\"EXECUTE RESULT\":\"Append success\"}"}
Host:~/work/TagTutorial/edu_6_restAPI_curl$

위와 같이 Append Success라는 메시지가 나오면 성공적으로 입력된 것이다.
아래와 같이 콘솔에서 제공된 select.sql을 통해 데이터를 확인하면


Host:~/work/TagTutorial/edu_5_restAPI_input$ machsql -f select.sql
Mach> select * from tag where name = 'TAG_ELEC1';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_ELEC1 2018-01-10 01:11:11 000:000:000 100
[1] row(s) selected.
Elapsed time: 0.001
Mach> select * from tag where name = 'TAG_ELEC2';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_ELEC2 2018-01-10 02:22:22 000:000:000 200
[1] row(s) selected.
Elapsed time: 0.001
Mach> select * from tag where name = 'TAG_TEMP1';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_TEMP1 2018-01-10 01:11:11 000:000:000 11
[1] row(s) selected.
Elapsed time: 0.001
Mach> select * from tag where name = 'TAG_TEMP2';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_TEMP2 2018-01-10 02:22:22 000:000:000 22
[1] row(s) selected.
Elapsed time: 0.000

위와 같이 각 태그에 대해 각각 1건씩, 총 네 건이 입력된 것을 볼 수 있다.


나노 세컨드 단위 데이터 입력


이제 좀 더 세밀한 시간인 나노 세컨드 단위의 값을 입력해 보자.
제공된 스크립트인 post_nano.sh를 보면 다음과 같다.


curl -X POST -H "Content-Type: application/json" "http://127.0.0.1:5001/machiot-rest-api/" -d '{ "values":[["TAG_ELEC1","2018-01-10 01:11:11 111:222:333",100]], "date_format":"YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn" }'
curl -X POST -H "Content-Type: application/json" "http://127.0.0.1:5001/machiot-rest-api/" -d '{ "values":[["TAG_ELEC2","2018-01-10 02:22:22 444:555:666",200],["TAG_TEMP1","2018-01-10 01:11:11 888:777:666",11],["TAG_TEMP2","2018-01-10 02:22:22 666:555:444",22]], "date_format":"YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn" }'

post_sec.sh와 다른점은 입력되는 시간 포맷에 mmm:uuu:nnn 이 추가되었고, 입력되는 데이터에도 111:222:333 과 같은 스트링이 부가적으로 붙어 있는 것을 알 수 있다.


즉, mmm은 밀리세컨드, uuu는 마이크로세컨드, nnn은 나노세컨드를 입력할 수 있는 포맷이다.
이 스크립트를 수행하면 다음과 같다.


Host:~/work/TagTutorial/edu_6_restAPI_curl$ sh post_nano.sh 
{"ErrorCode": 0, "ErrorMessage": "", "Data": "{\"EXECUTE RESULT\":\"Append success\"}"}
{"ErrorCode": 0, "ErrorMessage": "", "Data": "{\"EXECUTE RESULT\":\"Append success\"}"}
Host:~/work/TagTutorial/edu_6_restAPI_curl$

결과가 제대로 들어갔는지 select.sql을 통해서 확인해 보자.


Host:~/work/TagTutorial/edu_6_restAPI_curl$ is -f select.sql 
Mach> select * from tag where name = 'TAG_ELEC1';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_ELEC1 2018-01-10 01:11:11 000:000:000 100
TAG_ELEC1 2018-01-10 01:11:11 111:222:333 100
[2] row(s) selected.
Elapsed time: 0.001
Mach> select * from tag where name = 'TAG_ELEC2';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_ELEC2 2018-01-10 02:22:22 000:000:000 200
TAG_ELEC2 2018-01-10 02:22:22 444:555:666 200
[2] row(s) selected.
Elapsed time: 0.000
Mach> select * from tag where name = 'TAG_TEMP1';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_TEMP1 2018-01-10 01:11:11 000:000:000 11
TAG_TEMP1 2018-01-10 01:11:11 888:777:666 11
[2] row(s) selected.
Elapsed time: 0.000
Mach> select * from tag where name = 'TAG_TEMP2';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_TEMP2 2018-01-10 02:22:22 000:000:000 22
TAG_TEMP2 2018-01-10 02:22:22 666:555:444 22
[2] row(s) selected.
Elapsed time: 0.000
Host:~/work/TagTutorial/edu_6_restAPI_curl$

위에 결과를 보면, 나노 단위의 값이 입력된 것을 확인할 수 있다.


GET를 통한 태그 데이터 추출


이번에는  Restful API를 통해서 태그 데이터를 추출해 보도록 하자.


추출을 위한 Rest API 문법


{MWA URL}/machiot-rest-api/datapoints/raw/{TagName}/{Start}/{End}/{Direction}/{Count}/{Offset}/

TagName : Tag Name. 복수의 Tag 지원(,로 구분하여 사용)
Start, End : 기간, YYYY-MM-DD HH24:MI:SS 또는 YYYY-MM-DD 또는 YYYY-MM-DD HH24:MI:SS,mmm (mmm: millisecond, 생략시 start는 000, End는 999이며, 마이크로와 나노도 모두 999임)
실제 스트링으로 지정할 때는 날짜와 시간 사이에 T를 넣어서 빈공간을 없애준다.
Direction : 0(ascending), 추후 지원 (시간이 증가하는 방향)
Count : LIMIT, 0이면 전체
Offset : offset (기본값 = 0)

단일 태그 데이터 가져오기


주어진 예제에서 가장 간단한 get_single.sh를 보면, 아래와 같이 TAG_ELEC1에 대해서 데이터를 가져오는 예이다.
(주의할 점은 시간 지정시 대문자 T가 들어가는 것을 잊지 말아야 한다는 것이다)


curl -G "http://192.168.0.148:5001/machiot-rest-api/v1/datapoints/raw/TAG_ELEC1/2018-01-01T00:00:00/2018-01-31T00:00:00"


수행하면, 다음과 같이 데이터를 가져온다. (읽기 쉽게 줄바꿈을 넣어서 표시함)


Host:~/work/TagTutorial/edu_6_restAPI_curl$ sh get_single.sh 
{"ErrorCode": 0, "ErrorMessage": "",
"Data": [{"DataType": "DOUBLE",
"ErrorCode": 0,
"TagName": "TAG_ELEC1",
"CalculationMode": "raw",
"Samples": [{"TimeStamp": "2018-01-10 01:11:11 000:000:000", "Value": 100.0, "Quality": 1},
{"TimeStamp": "2018-01-10 01:11:11 111:222:333", "Value": 100.0, "Quality": 1}]}]}

Host:~/work/TagTutorial/edu_6_restAPI_curl$

위와 같이 2건의 TAG_ELEC1에 대한 데이터가 나온 것을 알 수 있다.


다중 태그 데이터 가져오기


주어진 예제 get_multi.sh는  아래와 같이 다수의 태그 대해서 데이터를 가져오는 예이다.


curl -G "http://192.168.0.148:5001/machiot-rest-api/v1/datapoints/raw/TAG_TEMP1,TAG_TEMP2/2018-01-01T00:00:00/2018-01-31T00:00:00"


태그명을 , (컴마)로 구분해서 지정하면, 한꺼번에 가져올 수 있다.


수행하면, 다음과 같이 데이터를 가져온다. (읽기 쉽게 줄바꿈을 넣어서 표시함)


Host:~/work/TagTutorial/edu_6_restAPI_curl$ sh get_multi.sh 
{"ErrorCode": 0,
"ErrorMessage": "",
"Data": [{"DataType": "DOUBLE",
"ErrorCode": 0,
"TagName": "TAG_TEMP1",
"CalculationMode": "raw",
"Samples": [{"TimeStamp": "2018-01-10 01:11:11 000:000:000", "Value": 11.0, "Quality": 1},
{"TimeStamp": "2018-01-10 01:11:11 888:777:666", "Value": 11.0, "Quality": 1}]},
{"DataType": "DOUBLE",
"ErrorCode": 0,
"TagName": "TAG_TEMP2",
"CalculationMode": "raw",
"Samples": [{"TimeStamp": "2018-01-10 02:22:22 000:000:000", "Value": 22.0, "Quality": 1},
{"TimeStamp": "2018-01-10 02:22:22 666:555:444", "Value": 22.0, "Quality": 1}]}]}

Host:~/work/TagTutorial/edu_6_restAPI_curl$

위와 같이 2건의 TAG_ELEC1에 대한 데이터가 나온 것을 알 수 있다.


밀리세컨드 범위의 다중 태그 데이터 가져오기


주어진 예제 get_multi_msec.sh는  아래와 같이 다수의 태그 대해서 지정되는 시간 범위를 Mili Second로 지정하는 것이다.


현재 마크베이스 Rest API에서는 마이크로와 나노에 대해서는 시간 범위를 지정하는 것을 제공하지 않으므로, 유의하기 바란다.


curl -G "http://192.168.0.148:5001/machiot-rest-api/v1/datapoints/raw/TAG_TEMP1,TAG_TEMP2/2018-01-10T01:11:11,888/2018-01-10T02:22:22,100"
^^^^ ^^^^

^표시가 된 부분을 자세히 보면, 초 뒤에 ,(comma)와 숫자가 포함된 것을 알 수 있다.


즉, 1시 11분 11초 888밀리 세컨드보다 크고, 2시 22분 22초 100 밀리 세컨드보다 작은 태그 데이터를 가져오는 명령어이다.


수행하면, 다음과 같이 데이터를 가져온다. (읽기 쉽게 줄바꿈을 넣어서 표시함)


Host:~/work/TagTutorial/edu_6_restAPI_curl$ sh get_multi_msec.sh 
{"ErrorCode": 0,
"ErrorMessage": "",
"Data": [{"DataType": "DOUBLE",
"ErrorCode": 0,
"TagName": "TAG_TEMP1",
"CalculationMode": "raw",
"Samples": [{"TimeStamp": "2018-01-10 01:11:11 888:777:666", "Value": 11.0, "Quality": 1}]},
{"DataType": "DOUBLE",
"ErrorCode": 0,
"TagName": "TAG_TEMP2",
"CalculationMode": "raw",
"Samples": [{"TimeStamp": "2018-01-10 02:22:22 000:000:000", "Value": 22.0, "Quality": 1}]}]}

Host:~/work/TagTutorial/edu_6_restAPI_curl$

위와 같이 조건 범위에 있는 데이터를 가져오는 것을 확인할 수 있다.


GET를 통한 기타 태그 정보  추출


이번에는  Restful API를 통해서 태그의 부가 정보를  추출해 보도록 하자.


현재 존재하는 모든 태그의 리스트 얻기


다음과 같이 이 URL은 마크베이스에 존재하는 모든 태그 리스트를 가져온다.


curl -G "http://192.168.0.148:5001/machiot-rest-api/tags/list"

수행하면, 다음과 같이 데이터를 가져온다. (읽기 쉽게 줄바꿈을 넣어서 표시함)


Host:~/work/TagTutorial/edu_6_restAPI_curl$ sh tag_lists.sh 
{"ErrorCode": 0,
"ErrorMessage": "",
"Data": [{"NAME": "TAG_ELEC1"},
{"NAME": "TAG_ELEC2"},
{"NAME": "TAG_TEMP1"},
{"NAME": "TAG_TEMP2"}]}
Host:~/work/TagTutorial/edu_6_restAPI_curl$

위와 같이 모든 리스트를 얻을 수 있다.


임의 태그의 시간 범위 얻기


아래는 마크베이스에서 제공하는 DB 전체에 대한 시간의 최소, 최대 범위를 얻거나, 혹은 임의의 태그에 대한 시간 범위를 얻을 때 활용되는 API에 대한 설명이다.


실제로 차트를 그리는 경우 미리 정보를 얻어서 해당 데이터 출력에 대한 개략적이 크기를 유추하는데 도움이 된다.


{MWA URL}/machiot-rest-api/tags/range/
{MWA URL}/machiot-rest-api/tags/range/{TagName}

TagName : Tag Name (현재 복수의 Tag Name은 지원하지 않음)
TagName이 없는 경우는 전체 Data를 대상으로 시간범위를 구함

주어진 예제인 time_range.sh는 다음과 같다.


curl -G "http://192.168.0.148:5001/machiot-rest-api/tags/range/" # 전체 시간 범위 구함

curl -G "http://192.168.0.148:5001/machiot-rest-api/tags/range/TAG_ELEC1" # 각 태그의 시간 범위 구함
curl -G "http://192.168.0.148:5001/machiot-rest-api/tags/range/TAG_ELEC2"
curl -G "http://192.168.0.148:5001/machiot-rest-api/tags/range/TAG_TEMP1"
curl -G "http://192.168.0.148:5001/machiot-rest-api/tags/range/TAG_TEMP2"

수행하면, 다음과 같이 데이터를 가져온다. (읽기 쉽게 줄바꿈을 넣어서 표시함)


Host:~/work/TagTutorial/edu_6_restAPI_curl$ sh time_range.sh 
{"ErrorCode": 0, "ErrorMessage": "", "Data": [{"MAX": "2018-01-10 02:22:22 666:555:444", "MIN": "2018-01-10 01:11:11 000:000:000"}]} # DB 전체 시간 범위
{"ErrorCode": 0, "ErrorMessage": "", "Data": [{"MAX": "2018-01-10 01:11:11 111:222:333", "MIN": "2018-01-10 01:11:11 000:000:000"}]} # TAG_ELEC1의 시간 범위
{"ErrorCode": 0, "ErrorMessage": "", "Data": [{"MAX": "2018-01-10 02:22:22 444:555:666", "MIN": "2018-01-10 02:22:22 000:000:000"}]} # TAG_ELEC2의 시간 범위
{"ErrorCode": 0, "ErrorMessage": "", "Data": [{"MAX": "2018-01-10 01:11:11 888:777:666", "MIN": "2018-01-10 01:11:11 000:000:000"}]} # TAG_TEMP1의 시간 범위
{"ErrorCode": 0, "ErrorMessage": "", "Data": [{"MAX": "2018-01-10 02:22:22 666:555:444", "MIN": "2018-01-10 02:22:22 000:000:000"}]} # TAG_TEMP2의 시간 범위
Host:~/work/TagTutorial/edu_6_restAPI_curl$

위와 같이 관련된 태그가 저장된 시간 범위를 쉽게 얻을 수 있다.


마치며


이상으로 실제 curl을 통해서 태그 데이터를 입력 및 얻고, 관련 정보를 추출하는 예를 설명하였다.
이 RestAPI를 잘 활용하면 자신들이 가진 별도의 차트를 웹 상에서 그리는 데  큰 도움이 될 것이다.


실제 마크베이스의 Tag Analyzer도 이러한 RestAPI를 통해서 구현되었다.


 


http://www.machbase.com/download


Contact the Machbase team with your questions!
info@machbase.com

전체 24
번호 제목 작성자 작성일 추천 조회
24
마크베이스 V5 : Tutorial 6 (RestAPI with curl)
machbase | 2018.09.18 | 추천 1 | 조회 116
machbase 2018.09.18 1 116
23
마크베이스(Machbase) Tag Analyzer 사용법
machbase | 2018.08.27 | 추천 1 | 조회 166
machbase 2018.08.27 1 166
22
마크베이스 5.0 : Tutorial 4 (실제 데이터를 통한 Tag Analyzer 기초 활용)
machbase | 2018.08.27 | 추천 1 | 조회 130
machbase 2018.08.27 1 130
21
마크베이스 5.0 : Tutorial 5 (Tag Table with RestAPI)
machbase | 2018.08.24 | 추천 0 | 조회 134
machbase 2018.08.24 0 134
20
Machbase 5.0 : 센서데이터 홍수의 유일한 해결책
machbase | 2018.08.21 | 추천 1 | 조회 325
machbase 2018.08.21 1 325
19
마크베이스 5.0 : Tutorial 3 (Real Time Stream Insert : Many Sensors)
machbase | 2018.08.20 | 추천 0 | 조회 221
machbase 2018.08.20 0 221
18
마크베이스 5.0 : Tutorial 2 (Batch Loading : Many Sensors)
machbase | 2018.08.17 | 추천 0 | 조회 170
machbase 2018.08.17 0 170
17
마크베이스 5.0 : Tutorial 1 (Quick Start)
machbase | 2018.08.17 | 추천 0 | 조회 259
machbase 2018.08.17 0 259
16
마크베이스 5.0
machbase | 2018.08.16 | 추천 0 | 조회 342
machbase 2018.08.16 0 342
15
Machbase 5.0 TAG Table 사용법
machbase | 2018.08.10 | 추천 1 | 조회 211
machbase 2018.08.10 1 211