라즈베리파이로 Push 서버 만들기

2016. 10. 12. 17:49IT관련

반응형


라즈베리파이로 만드는 전자액자 구상


집에 놔둔 라즈베리파이로 웹서버는 구성해 두었고 이제 Push 서버를 만들어야 한다.

결국 Push 서버라는건 심플하게 생각해 보면 소켓을 이용한 서버-클라이언트 프로그램과 다를게 없어 보인다. 그런데 소켓 프로그램은 클라이언트가 루프를 돌면서 메시지가 오는지 계속 체크를 해야하기 때문에 배터리 소모가 꾸준히 있을 것 같아 문제가 될것 같다.


뭔가 손쉽게 Push 서버를 만들수 있는 방법이 뭐가 없을까 찾아보는 도중 RabbitMQ를 확인하게 되었다.

요즘은 Node.JS 처럼 비동기 프로그램이 유행인데 RabbitMQ가 AMQP(Advanced Message Queuing Protocol)을 이용한 비동기 메시지 전송 서버로 보여진다. 물론 내가 필요한건 대용량도 아니고 클라이언트가 수백개도 아니니 조금 오버인것 같지만 한번 공부하다 생각하고 이것을 이용하기로 하였다.


먼저 AMQP라는 개념을 처음 보게 되었는데 자세한 내용은 AMQP Introduce를 한번 읽어보면 좋겠다.


라즈베리파이에 RabbitMQ 설치

sudo apt-get install rabbitmq-server

이렇게 설치를 하면 rabbitmq-server가 자동으로 부팅시 구동되는 것으로 확인된다. 

그리고 RabbitMQ는 기본적으로 5672포트를 사용하기 때문에 공유기에서 5672 포트를 포워딩 해야만 클라이언트가 정상적으로 연결이 될 수 있다.



RabbitMQ 웹페이지에서 python 예제 코드를 보면 pika라는 라이브러리를 사용하고 있다. 

알아보니 pika는 python으로 AMQP 0-9-1 protocol을 구현한 것으로 RabbitMQ에서 python으로 권장하는것 같다. 즉, pika도 설치를 하자.


라즈베리파이에 pika 설치

sudo pip install pika

물론 AMQP 라이브러리가 pika 말고도 Celery와 Haigha도 존재하니 편한걸로 선택하자.


설치를 하고 RabbitMQ 튜토리얼을 읽어보며 샘플을 실행했지만 내 라즈베리 서버와 연동해서는 동작하지 않는다.

확인해 보니 아직 RabbitMQ 서버 설정이 마무리 되지 않은 것이다.


RabbitMQ 계정도 필요하고 Virtual host필요 하단다.

다행히 잘 정리해 블로그가 있어 링크를 걸어둔다.


[Rabbitmq] 1. 초보를 위한 RabbitMQ 후딱 설치하고 설정하기

[RabbitMQ] 2. 초보를 위한 RabbitMQ 서비스용 계정 및 Virtual Host 설정하기


위 블로그를 읽고 설정을 마무리하면 외부 PC에서 내 라즈베리파이의 RabbitMQ 서버를 이용하여 서로 메세지를 보내고 받을 수 있는 환경이 구축된다.


아래와 같이 작성해서 실행해 보자. 튜토리얼 코드를 조금 수정했다.


receive.py

#!/usr/bin/env python

import pika


connection = pika.BlockingConnection(pika.URLParameters('amqp://RabbitMQ 계정 ID:RabbitMQ 계정 PWD@서버 IP or URL/virtual_host'))

channel = connection.channel()


channel.queue_declare(queue='hello')


def callback(ch, method, properties, body):

print("[x] Received %r" % body)


channel.basic_consume(callback, queue='hello', no_ack=True)


print(' [*] Waiting for messages. To exit press CTRL+C')

channel.start_consuming()


send.py

#!/usr/bin/env python

import pika


connection = pika.BlockingConnection(pika.URLParameters('amqp://RabbitMQ 계정 ID:RabbitMQ 계정 PWD@서버 IP or URL/virtual_host'))

channel = connection.channel()


channel.queue_declare(queue='hello')

channel.basic_publish(exchange='', routing_key='hello', body='hello world!')

print("[x] Sent 'Hello World!'")

connection.close()






반응형