Posting

Machbase의 최신 소식을 지금 만나보세요

[MACHBASE 기초] TAG TABLE 05 – PYTHON

드디어 다섯 번째 포스팅입닌다. 이번에는 파이썬 클라이언트와 Restful API를 사용해서 센서 데이터를 TAG TABLE에 넣어보도록 하겠습니다. 이렇게 TAG TABLE에 저장된 데이터는 Tag Analyzer를 통해서 실시간 확인이 가능하비다.

1. 사전 준비

1-1. 디렉토리 확인

마찬가지로 실습에 필요한 스크립트와 데이터가 저장되어 있는 edu_5_restAPI_input 에 아래와 같은 파일이 있는지 확인해 주세요.

Host:~/work/TagTutorial/edu_5_restAPI_input$ ls
1_create_tag.sql
2_insert_meta.sql
3_post_basic.py
4_post_many_random.py

1-2. 마크베이스 서버 및 MWA 준비

이 튜토리얼은 Restful API를 활용하기 때문에 반드시 마크베이스와 MWA를 동작시켜야 합니다. 마크베이스는 machadmin을 사용합니다.

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

MWA는 아래와 같이 구동시킵니다. Connection URL은 MWA에 접속하는 경로를 나타내비다. 아래에서는192.168.0.148의 5001 포트가 접속 포트입니다. URL과 포트는 사용자마다 다를 수 있으므로, 유의해 주세요.

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

1-3. Tag 테이블 생성

이전 실습들과 같이 파일 1_create_tag.sql (이 파일은 최초 DBMS를 생성했을 경우에 사용)을 실행하고, 두 번째 파일 2_insert_meta.sql로 태그 메타 정보를 입력해 주세요. 이번에서 총 4개의 태그를 통해 실습을 진행합니다. TAG_ELEC1과 TAG_ELEC2는 전력 사용량, TAG_TEMP1과 TAG_TEMP2는 온도를 나타내는 센서라고 가정하겠습니다.

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');

1-4. 파이썬 설치 및 모듈 설치

MACHBASE는 파이썬 2 혹은 3을 모두 활용할 수 있습니다. 그러나, 일부 모듈 설치가 더 필요할 수 있는데, 만일 에러가 난다면, pip를 통해서 아래와 같이 설치해 주세요 (나머지는 기본적으로 설치되는 time, sys, random 과 같은 모듈이다)

pip install requests
pip install json


2. 실습

2-1. 데이터 입력

앞에서 말씀 드렸듯이 파이썬과 POST를 통해서 간단하게 센서 데이터를 입력하는 과정을 설명드리겠습니다. 디렉토리에 3_post_basic.py이라는 파이썬 클라이언트 프로그램이 준비되어 있습니다. 이 프로그램을 통해 4개의 센서로 현재 시간으로 정해진 값을 하나 입력할 수 있습니다. 먼저 코드 상에 “사용자가 수정하는 부분”을 자신의 PC에 MWA가 설치된 주소와 포트로 수정해 주세요.

import json
import requests
import time

##############################
# USER's ENV : 사용자가 수정하는 부분 (HOSTNAME, PORT)
##############################
HOSTNAME = '192.168.0.148'
PORT = 5001
URL = 'http://%s:%d/machiot-rest-api/' % (HOSTNAME, PORT)

##############################
# POST
##############################

mytr = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

data = {
"values":[
["TAG_ELEC1",mytr,80],
["TAG_ELEC2",mytr,60],
["TAG_TEMP1",mytr,20],
["TAG_TEMP2",mytr,30]
],
"date_format":"YYYY-MM-DD HH24:MI:SS"
}

data_json = json.dumps(data)

headers = {'Content-type': 'application/json'}

response = requests.post(URL, data=data_json, headers=headers)

print(response.text)

그리고 나서 아래와 같이 수행하면 4개의 태그에 대해 현재의 값을 데이터가 들어간 것을 확인할 수 있습니다. Append Success라는 메시지가 나오면 성공적으로 입력된 것입니다.

Host:~/work/TagTutorial/edu_5_restAPI_input$ python 3_post_basic.py
{"ErrorCode": 0, "ErrorMessage": "", "Data": "{\"EXECUTE RESULT\":\"Append success\"}"}

콘솔에서 방금 입력된 데이터를 확인해 보겠습니다.

Host:~/work/TagTutorial/edu_5_restAPI_input$ machsql
=================================================================
Machbase Client Query Utility
Release Version 5.0.2.community
Copyright 2014 MACHBASE Corporation or its subsidiaries.
All Rights Reserved.
=================================================================
MACHBASE_CONNECT_MODE=INET, PORT=5656
Type 'help' to display a list of available commands.
Mach> select count(*) from tag;
count(*)
-----------------------
4
[1] row(s) selected.
Elapsed time: 0.001
Mach> select * from TAG where name = 'TAG_ELEC1';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_ELEC1 2018-08-23 17:31:37 000:000:000 80
[1] row(s) selected.
Elapsed time: 0.001
Mach> select * from TAG where name = 'TAG_ELEC2';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_ELEC2 2018-08-23 17:31:37 000:000:000 60
[1] row(s) selected.
Elapsed time: 0.002
Mach> select * from TAG where name = 'TAG_TEMP1';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_TEMP1 2018-08-23 17:31:37 000:000:000 20
[1] row(s) selected.
Elapsed time: 0.001
Mach> select * from TAG where name = 'TAG_TEMP2';
NAME TIME VALUE
--------------------------------------------------------------------------------------------------
TAG_TEMP2 2018-08-23 17:31:37 000:000:000 30
[1] row(s) selected.
Elapsed time: 0.002

2-2. 데이터 연속 입력

이번에는 파이썬 Restful API를 통해서 지속적으로 데이터를 입력하겠습니다. 또한 입력된 데이터를 웹을 통해서 실시간으로 확인하는 것을 보여드리겠습니다. 먼저 위해서 4_post_many_random.py를 수행해 주세요. 이 프로그램은 4개의 태그에 대해서 1초에 각 태그에 대해 랜덤 한 값을 한 건씩 현재 시간으로 입력합니다. 인자를 넣지 않으면, 10분간 입력을 하고, (총 600초) 더 짧거나 길게 할 경우에는 인자를 입력하여 조정하실 수 있습니다.

import sys
import json
import requests
import time
import random

##############################
# USER's ENV
##############################
HOSTNAME = '192.168.0.148'
PORT     = 5001
URL = 'http://%s:%d/machiot-rest-api/' % (HOSTNAME, PORT)
DEFAULT_COUNT = 600;
##############################
# POST
##############################

data = {
 "date_format":"YYYY-MM-DD HH24:MI:SS"
}

headers = {'Content-type': 'application/json'}

if __name__ == '__main__':

    if (len(sys.argv) == 2):
        count = sys.argv[1];
    else:
        count = DEFAULT_COUNT;

    for i in range(0, int(count)):
        mytr =  time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        values = [
            ["TAG_ELEC1",mytr,80 + random.random()* 25],
            ["TAG_ELEC2",mytr,60 + random.random()* 30],
            ["TAG_TEMP1",mytr,20 + random.random()* 20],
            ["TAG_TEMP2",mytr,30 + random.random()* 10],
        ];
        data["values"] = values;
        data_json = json.dumps(data)
        print data_json;
        response = requests.post(URL, data=data_json, headers=headers)
        print response.text;
        time.sleep(1);

위의 코드를 수행하면 다음과 같이 입력됩니다. 

Host:~/work/TagTutorial/edu_5_restAPI_input$ python 4_post_many_random.py
{"date_format": "YYYY-MM-DD HH24:MI:SS", "values": [["TAG_ELEC1", "2018-08-23 17:43:09", 86.0631219510065], ["TAG_ELEC2", "2018-08-23 17:43:09", 87.62673577985534], ["TAG_TEMP1", "2018-08-23 17:43:09", 23.494672873051584], ["TAG_TEMP2", "2018-08-23 17:43:09", 31.296384404469038]]}
{"ErrorCode": 0, "ErrorMessage": "", "Data": "{\"EXECUTE RESULT\":\"Append success\"}"}
{"date_format": "YYYY-MM-DD HH24:MI:SS", "values": [["TAG_ELEC1", "2018-08-23 17:43:10", 88.19144708467276], ["TAG_ELEC2", "2018-08-23 17:43:10", 74.91681663993567], ["TAG_TEMP1", "2018-08-23 17:43:10", 23.70204694808197], ["TAG_TEMP2", "2018-08-23 17:43:10", 33.492663120826506]]}
{"ErrorCode": 0, "ErrorMessage": "", "Data": "{\"EXECUTE RESULT\":\"Append success\"}"}

............생략...........

실시간 입력이 되는 과정을 Tag Analyzer로 확인해 보겠습니다.  

아래의 동영상에서와 같이 Tag Analyzer 화면에서 3분간의 데이터를 주기적으로 출력(3초) 하는 모습을 볼 수 있습니다.

3. 마치며

이상으로 간단하게 마크베이스가 지원하는 파이썬 Restful API를 통해 데이터를 입력해 보았습니다. 매우 쉽고 편한 방법으로 다양한 태그 센서 데이터를 입력할 수 있었습니다. 파이썬을 사용하는 다양한 환경에서 마크베이스를 활용해 보세요.

연관 포스트

C언어로 Binary data를 Machbase에 넣기

1.개요 Data를 다루다 보면 numeric, varchar 형 데이터뿐만 아니라 JPG, PNG, MP3와 같은 Binary data도 database에 저장해야 할 때가 존재한다. 그러나 일반 data들과는 달리 Binary

[MACHBASE 연동] Android studio에서 JDBC 연결하기

마크베이스 기술지원본부 이현민 1. 개요 수많은 데이터들이 많은 환경에서 생성되고 있는 오늘날, 우리 현대인들의 동반자인 스마트폰 또한 데이터생성의 주체로써 또는 전달자로서 알게 모르게 그 구실을