개발자/Raspberry Pi3

Raspberry Pi로 Ubidots에 데이터 보내고 받기 1

지구빵집 2020. 11. 4. 18:14
반응형

 

 

Raspberry Pi를 Ubidots와 연결하여 데이터를 보내고 받기

 

Wi-Fi 또는 이더넷을 사용하여 Raspberry Pi를 설정하는 방법과 Ubidots로 데이터를 보내는 방법을 알아봅니다.

 

여기서는 가장 기본적인 예제를 사용하여 데이터를 보내고 최근 데이터를 받는 방법을 설명합니다. 본 문서는 Connect the Raspberry Pi with Ubidots 문서를 번역하여 작성하였으며 Ubidots에서 라즈베리파이의 연결을 돕는 문서로 제공하고 있습니다. 끝까지 잘 따라 하시면 원격에서 센서로부터 데이터를 항상 보여주는 라즈베리파이를 가질 수 있습니다.  

 

아직도 혼동스럽고 모르는 문제는 디바이스를 등록하는 문제입니다. 아무리 여러 번 시도를 해도 디바이스를 등록하는 방법은 여전히 오리무중입니다. ㅠ.ㅠ.

 

Raspberry Pi는 프로토 타이핑 및 교육 목적뿐만 아니라 회사 내 생산 프로젝트에도 널리 사용되는 장치가 되었습니다. 작은 크기, 저렴한 비용 및 완벽하게 작동하는 Linux OS 외에도 Destkop PC와 가장 큰 차이점은 GPIO 핀 (범용 입력 / Ourput 핀)을 통해 다른 주변 장치와 상호 작용할 수 있다는 것입니다.

 

이를 통해 임베디드 전자 공학 전문가가 아니어도 매우 강력한 하드웨어 애플리케이션을 코딩할 수 있습니다. 이 가이드를 끝까지 따라 하면 라즈베리파이에서 Ubidots로 데이터 값을 읽고 보낼 수 있습니다.

 

요구사항: 가이드를 따라 하는 데 필요한 것은 인터넷(WiFi 혹은 이더넷)에 연결된 라즈베리파이가 필요합니다.

 

설정: 이 가이드에서는 Raspberry Pi가 구성되었고 이미 인터넷에 연결되어 있다고 가정합니다. 이를 수행하는 방법을 배우려면 Raspberry Pi Foundation의 빠른 시작 가이드를 따르는 것이 좋습니다. WiFi 동글을 사용하는 경우 Wicd를 사용하여 WiFi 연결을 관리하는 것이 좋습니다.

 

가장 먼저 라즈베리파이를 업데이트하는 일입니다.

 

$ sudo apt-get update
$ sudo apt-get upgrade

 

Requests: HTTP for Humans

 

Requests는 컴퓨터의 터미널 또는 Raspberry Pi와 같은 임베디드 Linux 장치에서 실행할 수 있는 모든 Python 스크립트에서 HTTP 요청을 만드는 것을 단순화하는 인기 있는 Python 라이브러리입니다. 라이브러리를 설치하려면 Raspberry Pi 터미널에서 아래 명령을 실행하십시오. 

 

$ pip install requests

 

Ubidots에 하나의 값 보내기

 

좋아하는 텍스트 편집기를 사용하여 Python 스크립트를 만들어 보겠습니다. 사용하는 에디터는 "nano"를 사용합니다. 이 스크립트는 임의의 값을 Ubidots로 보내지만 Raspberry Pi의 디지털 입력에서 값을 보내거나 특별한 실드와 센서를 사용할 때 아날로그 판독 값을 보내도록 쉽게 조정할 수 있습니다.

 

Python 스크립트 만들기

 

라즈베리파이에서 아래 명령을 입력하여 파이선 스크립트를 작성합니다.

 

$nano ubi_test_post.py

 

아래 코드를 복사하여 터미널에 붙여 넣으십시오. 코드에 표시된 곳에 Ubidots TOKEN을 할당합니다. 자세한 내용은 Ubidots REST API 레퍼런스 문서를 참조하세요. 

 

import time
import requests
import math
import random

TOKEN = "..."  # Put your TOKEN here
DEVICE_LABEL = "machine"  # Put your device label here 
VARIABLE_LABEL_1 = "temperature"  # Put your first variable label here
VARIABLE_LABEL_2 = "humidity"  # Put your second variable label here
VARIABLE_LABEL_3 = "position"  # Put your second variable label here


def build_payload(variable_1, variable_2, variable_3):
    # Creates two random values for sending data
    value_1 = random.randint(-10, 50)
    value_2 = random.randint(0, 85)

    # Creates a random gps coordinates
    lat = random.randrange(34, 36, 1) + \
        random.randrange(1, 1000, 1) / 1000.0
    lng = random.randrange(-83, -87, -1) + \
        random.randrange(1, 1000, 1) / 1000.0
    payload = {variable_1: value_1,
               variable_2: value_2,
               variable_3: {"value": 1, "context": {"lat": lat, "lng": lng}}}

    return payload


def post_request(payload):
    # Creates the headers for the HTTP requests
    url = "http://industrial.api.ubidots.com"
    url = "{}/api/v1.6/devices/{}".format(url, DEVICE_LABEL)
    headers = {"X-Auth-Token": TOKEN, "Content-Type": "application/json"}

    # Makes the HTTP requests
    status = 400
    attempts = 0
    while status >= 400 and attempts <= 5:
        req = requests.post(url=url, headers=headers, json=payload)
        status = req.status_code
        attempts += 1
        time.sleep(1)

    # Processes results
    if status >= 400:
        print("[ERROR] Could not send data after 5 attempts, please check \
            your token credentials and internet connection")
        return False

    print("[INFO] request made properly, your device is updated")
    return True


def main():
    payload = build_payload(
        VARIABLE_LABEL_1, VARIABLE_LABEL_2, VARIABLE_LABEL_3)

    print("[INFO] Attemping to send data")
    post_request(payload)
    print("[INFO] finished")


if __name__ == '__main__':
    while (True):
        main()
        time.sleep(1)

 

코드가 Ubidots TOKEN을 입력하여 컴파일되면 CONTROL + O 및 ENTER를 눌러 파일을 저장합니다. 저장할 때 파일 이름을 할당합니다. (파일 이름에 ". py"를 기억해야 함). 스크립트가 저장되면 CONTROL + X를 눌러 Nano 편집기를 종료하고 컴퓨터의 터미널로 돌아갑니다.

 

스크립트 실행 명령은 아래와 같습니다.

 

$python ubi_test.py 

 

실행하면 가장 아래 부분 time.sleep(1)의 시간 간격으로 반복해서 데이터를 보내는 결과를 확인할 수 있습니다. 축하합니다.

 

pi@raspberrypi:~/ubidots $ python ubi_test_post.py
[INFO] Attemping to send data
[INFO] request made properly, your device is updated
[INFO] Attemping to send data
[INFO] request made properly, your device is updated
... 영원히

 

이 데이터를 받아 처리하는 Ubidots 페이지는 아래와 같습니다. 아래 3개의 데이터는 전부 랜덤하게 만들어 보내고 있습니다. 1분에 한 번씩 보내는 데이터는 잘 수집 됨을 확인할 수 있습니다. 다음 포스팅은 실제로 센서를 달아서 올라오는 데이터를 확인하고 위젯도 아름답게 만들어 보겠습니다. 

 

 

 

다음으로 데이터를 받는 스크립트를 설명합니다.

 

아래의 ubi_test_get.py 프로그램은 Ubidots에서 하나의 데이터를 받아옵니다. 텍스트 편집기를 사용하여 Python 스크립트를 만듭니다. 이 경우에는 "nano"를 사용합니다. Python 스크립트를 라즈베리파이에서 아래와 같이 명령어를 입력하고 편집합니다.

 

$ nano ubi_test_get.py

 

아래 코드를 복사하여 터미널에 붙여 넣으십시오. 코드에 표시된 곳에 Ubidots TOKEN을 할당합니다. 또한 원하는 정보를 얻으려면 원하는 장치 레이블과 변수 레이블을 할당해야 합니다. 자세한 내용은 Ubidots REST API 레퍼런스 문서를 참조하세요. 

 

import requests
import random
import time

TOKEN = "xxxxxxxx" # Assign your Ubidots Token
DEVICE = "xxxxxxxx" # Assign the device label to obtain the variable
VARIABLE = "xxxxxxxx" # Assign the variable label to obtain the variable value
DELAY = 1  # Delay in seconds

def get_var(device, variable):
    try:
        url = "http://industrial.api.ubidots.com/"
        url = url + \
            "api/v1.6/devices/{0}/{1}/".format(device, variable)
        headers = {"X-Auth-Token": TOKEN, "Content-Type": "application/json"}
        req = requests.get(url=url, headers=headers)
        return req.json()['last_value']['value']
    except:
        pass


if __name__ == "__main__":
    while True:
        print(get_var(DEVICE, VARIABLE))
        time.sleep(DELAY)

 

라즈베리파이 터미널에서 아래와 같은 명령어로 실행합니다.

 

$python ubi_test_get.py

 

아래와 같은 결과 화면을 얻을 수 있다면 성공한 것입니다. 축하합니다!

 

pi@raspberrypi:~/ubidots $ python ubi_test_get.py
19.0
-8.0
34.0
-2.0
19.0
31.0
18.0
27.0
49.0
-1.0
-10.0

 

여기까지 가장 간단한 예제로 동작 방식만을 확인했습니다. 다음 과정은 여러분의 센서를 붙이고 데이터를 보내는 방법을 실습을 통해 확인하기로 합니다. 궁금한 점이나 이해가 안 되는 부분, 보충할 설명이 필요하시면 말씀해 주세요. 며칠 신나게 놀았더니 오늘은 좀 일이 잘됩니다. ^^

 

 

라즈베리파이 3 Model B

 

 

 

 

 

 

 

반응형