Showing posts with label mqtt. Show all posts
Showing posts with label mqtt. Show all posts

Wednesday, September 4, 2019

MQTT broker 서비스를 이사가다.

장치간의 메시징(통신)을 위해 MQTT - Message Queuing Telemetry Transport,  ISO standard (ISO/IEC PRF 20922) - 프로토콜을 사용하고 있고, 다음 그림과 같이 MQTT broker(or server)가 연결된 디바이스들(subscriber)의 mqtt에 기반한 메시징을 중계해준다.


Image from www.mathworks.com


알려진대로 매우 가벼운 프로토콜이기 때문에 IoT 디바이스들에 적용되기에 적합하다.

문제는 mqtt broker인데 이는 서버이므로 PC든 라즈베리 파이든 NAS든 broker를 구동할 서버가 준비되어야 한다. 여기에는 두가지 문제가 있는데, 하나는 간단한 응용을 위해 항시 켜져있는 서버를 운용해야 한다는 점과, 서버가 내부 IP 영역에 존재하면 그 외부의 장치들은 접근하기가 어렵다는 것이다. 물론, 전자의 경우 NAS같이 원래 항상 운용되는 장비가 있다면 거기에 mqtt broker를 설치/운용할 수 있으며, 후자의 경우 port forwarding 을 사용하여 내/외부 모두 접근이 가능한 서버를 구축할 수도 있을 것이다.
그런데 간단한 구축을 위해 너무 귀찮잖아!

이런 경우를 위해 유/무료로 mqtt broker 운용해주는 site들이 여럿 있다.

나같은 경우 CloudMQTT에서 제공하는 무료 서비스를 사용하고 있었다.
무료의 경우 생성할 수 있는 채널 수 등이 제한되어 있었는데, 그래도 충분히 활용할 만 했었다. 그런데, 오랜만에 새로운 채널을 생성하려고 했는데 이게 웬걸. 무료 정책이 바뀌어서 기존에 만든것은 유지하지만 새롭게 만들거나 변경하는것이 불가능했다. 뭔가 하려면 기존것을 상당부분 삭제해야 하는 상황이다!

[CloudMQTT 무료버전]

Cute Cat

  • 5 users/acl rules/connections
  • 10 Kbit/s

CloudMQTT 무료 서비스는 사용자수던, acl rule(채널)수던, 접속자 수던 5개로 제한되고 있고, 통신속도는 10 Kbit/s !  이거 너무하지 않은가?


그래서 다른 대안을 찾기 시작했고, broker로 유명한 mosquitto를 제공하는 재단에서 mqtt 테스트 서버를 무료로 제공하기에 이를 사용하기로 하였다.
물론, 다른 무료 서버들도 많이 있다. 선택은 사용자가 적절히!

[Public MQTT Brokers]
https://mntolia.com/10-free-public-private-mqtt-brokers-for-testing-prototyping/



테스트 서버의 접속 url은 http://test.mosquitto.org/ 이다.

접속 port에 따라서 서비스 형태가 약간 다르다.
  • 1883 : MQTT, unencrypted
  • 8883 : MQTT, encrypted
  • 8884 : MQTT, encrypted, client certificate required
  • 8080 : MQTT over WebSockets, unencrypted
  • 8081 : MQTT over WebSockets, encrypted


IoT의 소형장치들은 대부분 보안에 취약하다. 이는 미래에 큰 화두가 될 것이다.
나는 테스트를 위한 (보안이 필요 없는) 정보를 주고받는 정도이므로 1883 포트를 사용한다.

무료가 항상 그렇듯 본 서비스도 donation을 받는다. 한달에 약 $70가 운용비용이라고 하는데, 설마 이정도도 ECLIPSE 재단에서 지불을 못할까?

테스트 해보니 속도도 빠르고 별 문제가 없어서, 앞으로는 본 서비스를 활용할 계획이다.



Wednesday, June 6, 2018

Intel Galileo Gen II 그리고 mqtt

회사 동료로부터 얻게 된 Intel Galileo Gen II 보드.

그간 Arduino의 성공적인 인기에 목이 탔을까. 인텔에서 IoT에 힘써보겠다고 자신들의 프로세서 제작 기술을 앞세워 IoT 세계에 발을 디뎠다.

그러나 IoT 세계에는 인텔의 공룡급 기술이 어울리지는 않는 것 같다. 마치, 마차가 다닐듯 한 한적한 시골 길에 람보르기니 스포츠카를 끌고 오는 모습이랄까. 그것도 람보르기니에 달린 타이어는 모두 빼고, 리어카의 바퀴를 억지로 달아놓고, "보이지?   이차는 여기에 딱이야!" 라고 떠들어 대는 모습이다.

Intel Galileo Gen II는 Arduino에 비하면 메인프레임 급이다.  Arduino가 16Mhz에 32kb flash, 2kb ram이 달려있는데 반해, galileo는 400Mhz SoC에 8Mb flash, 256Mb ram이 장착되어 있다. 그런데 도데체 왜 이런 성능의 시스템이 IoT에 필요한걸까?  그리고 Arduino를 의식했는지 gpio pinmap을 Arduino Uno와 동일하게 해놓았다.   Arduino Uno shield들을 호환하여 사용할 수 있도록 배려한 것이리라.  그런데 Uno는 핀 수가 적은 편이다. 핀 수 때문에 LCD 붙이고 센서 붙이면 더 이상 연결할 GPIO도 없다. 이것 때문에, Arduino Mega나 Due같이 Pin수가 충분한 보드를 사기도 한다. galileo는 그렇담 왜 uno를 호환하려 했을까. 사용자 층이 가장 폭 넓은 Uno 쪽을 흡수하고 싶었나보다. 그런데, galileo 정도의 시스템을 uno처럼 활용할 사람들은 아마 없을 것 같다. 가격차이만 봐도 uno는 6천원(클론보드) 내외로 구매할 수 있지만, galileo는 10만원 대다.   Uno에서 할 수 있는 것을 구지 galileo에서 할 필요가 없을 것이다.  그렇다면 사용자 타겟팅이 잘못된 것이라고 밖에 볼 수 없다. MCU가 이정도 수준이면, GPIO를 mega 급 이상으로 지원하던지, 전문 IoT용으로 소개를 하는것이 나을 뻔 했다.

Intel은 uno와 rasberry pi 처럼 명확한 포지셔닝을 해야 한다. 단, 저 둘과는 분명히 다른 쪽으로.(그 사이에 끼지말고)  동시에 SW부분도 uno의 철학을 참고할 필요가 있다.

잡설은 그만두자.  Galileo가 흥미로운 부분은 embedded os를 굴릴 수 있다는 점이다!   성능이 어찌나 좋은지(?)  Linux가 돌아간다.

다음 인텔싸이트에서 Galileo에 Linux를 설치할 수 있는 가이드를 제시하고 있다: https://software.intel.com/en-us/get-started-galileo-linux-step1

운영체제는 Yocto로써 나도 이번에 처음 알게 되었다.

Yocto 이미지를 SDCard에 설치하고 부팅하면...부팅된다.  화면은 없으므로 FTDI를 이용하여 putty로 Galileo 보드와 연결하여 화면을 볼 수 있다. 본인은 이 과정에서 삽질 좀 하였다.

FTDI의 rx, tx, gnd를 galileo와 잘 연결하면 부팅 후 login을 기다리는 화면을 보게 될 것이다. FTDI로 연결 시, 3.3V로 맞추어야 한다. Galileo가 3.3V로 운영된다. 5V를 rx로 보내도 되는지는 모르겠다. 궁금하시면 Galileo 스펙을 확인하고 해보기 바란다.(고장날 수도 있다.)  그리고, Baudrate는 115200이니 참고바란다.

혹은, FTDI가 없다면, Ethernet 케이블을 연결하면 자동으로 IPv4 설정이 된다. 단, 화면이 안보이는 상황이면 어떤 IP가 설정되었는지 알 수가 없는데, 같은 gateway에 물려있는 PC에서 arp -a 해보자.

자신의 PC와 유사한 IP 중 4번째 자리가 평소에 못보던 것이 있으면 아마도 그게 방금 연결된 galileo일 것이다.  putty로 ssh로 연결해보자. login 화면이 나오면 성공한 것이다.

default로 id는 root이며 passwd는 없다. 그러니 들어가서 얼른 passwd를 설정하도록 한다.


20161113_222017비로서 난 GUI도 없는 아주 심플한 linux 서버를 하나 얻게 되었다. 이걸로 무엇을 할까?  우선 linux상에서 gpio를 테스트 해보았다. 잘 되었다. 그러나, gpio 와 pin map이 일치하지 않아 자료를 찾아야 했다.

이에 관해서는 다음 기사가 도움이 될 것이다:

http://www.malinov.com/Home/sergey-s-blog/intelgalileo-programminggpiofromlinux

그런데 사실 이렇게 수동으로 gpio를 알아내고 사용할 필요는 없다. 역시, 누군가 이를 위해 잘 만들어 놓은것이 있다:

MRAA (https://github.com/intel-iot-devkit/mraa)

Linux Library for low speed IO Communication in C with bindings for C++, Python, Node.js & Java. Supports generic io platforms, as well as Intel Edison, Intel Joule, Raspberry Pi and many more.


mraa를 사용하면 우리가 아는 pinmap으로 사용할 수 있다. 그리고 linux에서 gpio를 사용하기 위한 귀찮은 과정을 생략할 수 있다. 무엇보다 보드에 따라 핀번호가 바뀌어서 헤매는 일은 없을 것이다.

MRAA 설명글에 있듯이, 이 라이브러리를 사용하여 native c/c++ 혹은 python등 다양한 언어를 사용할 수 있다.

Python에서 mraa를 사용하여 LED를 blinking 하는 예제: https://communities.intel.com/thread/98922

물론, python이 설치되어 있어야 한다.


자, 인텔에서는 Arduino의 그것과 같이, IDE도 제공하고 있다.

짜잔~!   Intel XDK!!

Galileo가 있다면 어서 Intel XDK를 설치하고 실행해보자.

intelxdk

위와 같은 화면이 뜬다. (물론 그냥 뜨지 않는다. 가입해야 한다.)

Galileo가 연결되어 있고 드라이버문제가 없다면 IoT device에 자동으로 잡힐 것이다. (필자는 드라이버 문제가 해결되지 않아 수동으로 잡았다.)

생김새는 여느 IDE와 비슷하다. 다만, editor는 Bracket이라는 code editor(오픈소스)를 사용하였는데, 따로 받아서 사용해보니 훌륭하다. 웹 프로젝트를 개발 할 때 도움이 되는 기능들을 많이 가지고 있다. MS에서 이와 유사한 Code를 제공하고 있고, 또 다른 오픈소스인 Atom도 있으나 이들은 너무 무겁다. 시작이 엄청 느리다.   MS의 그것은 아직 정식버전이 아니라서 그런지 업데이트도 매우 잦다.  (또 다른 Sublime이라는 프로젝트는 오픈소스는 아니지만 code editor로써는 훌륭하다.   시간이 나면 PSEditor라는것도 사용해보기 바란다.  PSEditor는 code-v 문법을 유일하게 지원해서 사용해봄)



아무튼, XDK를 사용하여 Linux가 운영중인 상황에서도 아두이노처럼 sketch들을 돌려볼 수 있다. 어짜피 Linux상에서 실행되는 또 다른 프로세스일 뿐이다. 위의 예는, node.js로 구현된 blinking 예제이다.

지금까지 galileo를 이래저래 사용해 보았다. 그리고 이제 뭘할지 고민하였다. 아직 딱히 할 게 없더라. 고성능 IoT라 가정하면, 무언가 복잡한 연산이 필요한 IoT가 될 것 같다.(근데 핀수가 적어서...)  실제로 그런 아이디어가 나올 때 까지는 얘는 그냥 리눅스 서버다.



전에 IoT 메세징 서비스를 소개하면서 MQTT를 소개한 적이 있다.

MQTT는 브로커 서버가 필요한데, 필자의 NAS를 사용하려고 했었으나 알 수 없는 오류로 보류한 상태이다. 그래서 무료로 mqtt 브로커 서비스를 제공해주는 cloudmqtt.com을 사용하고 있었다.

이제 전기세 부담 안되는(?) 미니 서버가 탄생하였으니 이것을 mqtt broker로 사용해보고자 한다.

mqtt 브로커로는 mosquitto를 사용하였다.

Intel에서 Edison보드에 mosquitto를 설치하는 글을 올렸으나 당연히 Galileo에서도 잘 된다: https://software.intel.com/en-us/blogs/2015/02/20/building-and-running-mosquitto-mqtt-on-intel-edison

글에서와 같이 설치하고 나면 mosquitto 브로커를 실행시킨다.

그리고 휴대폰에서 mqtt client 아무거나 설치하고 접속해본다.

mosq1.png

위와 같이 New client로 접속한 것이 보인다.  그러면 또 다른 터미널을 열어서 publish 해보자.

mqtt3

/broadcast라는 주제로 "Hi, there!" 라는 메세지를 날렸다.

그러면, 다음과 같이 Subscribe한 mqtt client에도 메세지가 도착한다.



mqtt2이 메세징은 양방향이며, 다중 subscriber가 존재할 수 있다. Facebook은 mqtt를 사용하여 chatting 서비스를 구현하였다고 한다.

이제 galileo에서는 mqtt 브로커 만이 아니라, mqtt subscriber를 구현하여, 전달 되는 메세지에 대해 어떤 기능을 수행하면 될 것이다. 메세징은 양방향이므로 galileo가 센서가 되어, 필요 시 메세징을 해주면 mqtt client들은 모두 메세지를 받게 될 것이다.

mqtt는 양방향 메세징이 되는것이 매우 유용하다. 그리고 다른 서비스들과 달리 표준이므로 앞으로 계속 발전하며 다양한 응용 가능성을 보이게 될 것이다.












IoT messaging service와의 연동

1. Blynk

전에는 장치와 휴대폰을 연계하기위해 nodemcu로 서버를 만들고 웹에서 접속하여 장치를 컨트롤하거나 장치의 메세지를 휴대폰에 전달하기위해 안드로이드에서 푸쉬서비스를 구현하려 했었다. 그런데 이게 다 필요없다.

blynk는 무엇보다 단순하다. 장치를 제어하기위해 필요한 소프트웨어 측면의 노력이 현저히 줄어든다. 간단한 경우에는 추가적인 프로그래밍도 필요 없다.    그런데 그렇게 다 만들어져 있어서 커스터마이즈가 어렵다. 안될지도 모른다.내가 아직 모르는 것인가?

blynk테스트는 pc에 서비스를 연동하여 테스트하였다. 즉, pc 인터넷을 활용한 것이다.  다음에는 esp8266을 연동해보았다. 그러나 이건 실패다.  컴파일 후 다운로드 시 esp8266 sync 오류가 발생한다. → 설정에 문제가 있었다. 지금은 잘 된다.ㅋ

2. Pushover

그 전까지는 ifttt를 응용하여 푸시서비스를 구현할 수 있다고만 알다가, 새다리님 블로그에서 pushover, pushbullet, mqtt를 알게 되었다. 그분의 호기심은 정말 대단한것 같다.  아무튼 푸쉬서비스를 직접 개발하는것을 매우 귀찮게 여기던 중(그런데 난 소프트웨어 개발자임 ㅋ)  이러한 서비스를 접하니 다시 iot를 해보고자 의욕이 솟는다.

pushover는 유료이다. 약 5천원에 퍼머넌트 라이선스를 제공하므로 비용 부담은 사실상 없다.  테스트 결과는 빠르다.  잘 동작한다.  pushover는 api서버가 ssl을 사용한다.  따라서 esp8266 01버전만 가지고 있는 나로서는 nodemcu에서 ssl을 지원하는 https를 사용할 수가 없었다.  nodemcu를 커스텀빌드해서 https만이라도 사용해보려고 하였는데 역시 esp8266 01은 폭주한다.  누군가 01버전에서 https를 성공하였다면 그 성공기를 듣고 싶다.

다행이다.  pushover는 그냥 http도 지원하더라. 요즘은 보안이 중요시되는 시대라 나중에 nodemcu에서 https가 지원되면 그때 다시 테스트할 예정이다.

3. Pushbullet

얘는 단순히 푸쉬메세징 서비스를 넘어서는 것 같다. 노트 프로그램은 아니지난 에버노트처럼 어디서든 사용 가능하다.  윈도우를 위한 앱도 있고 모바일용 앱도 있다.  그리고 그냥 웹상에서도 된다. 푸쉬메세지에 등록되어 있는 기기들은 모두 연동된다. 꼭 채팅서비스와 같다고 할까?  급하게 파일을 공유할 필요가 있을때 유용했다.  단, 파일을 한번에 하나씩만 선택가능하더라.

중요한건 어쨋든 푸쉬알람서비스인데 얘는 api서버가 https만 지원한다.   그래서 나는 아직 esp8266을 통한 테스트를 못해봤다.  curl이나 javascript를 통한 테스트에서는 훌륭하게 잘 동작하였다.  아, pushbullet은 무료로 사용할 수 있다.

4. MQTT

위에 훌륭한 서비스들이 있지만 표준은 아니다.  mqtt(message queue telemetry transport)는 가벼운 양방향 메세징 프로토콜이다. 너무 가벼워 IoT에도 버겁지 않다.  페북도 메세징 서비스를 위해 mqtt를 사용한다더라.  표준프로토콜이므로 향후 발전할 가능성이 무궁무진하다.  얘는 양방향메세징이 기본이므로 메세지를 받는것만이 아니라 보낼 수 있어 기기에 대한 제어를 가능케 한다.

mqtt는 서비스를 운용할 서버가 필요하다. 내가 가지고 있는 synology 215j에서 mosquitto라는 mqtt 앱을 설치할 수가 있다는 것을 알았다. 어짜피 nas는 일년내내 켜놓고 있으므로 mqtt서버로서 안성마춤이었다. 그런데 설치만되고 구동이 안된다. nas에 shell로 접속하여 mqtt를 설정하고 실행해보니 사용자 id관련 오류가 난다. 특별히 설정을 안해도 동작해야하는 상황이라 난감하다. 좀더 조사를 해봐야겠는데 시간은 없다. 인터넷에서도 관련이슈를 어렵지않게 찾을 수 있었으나 뾰족한 해결책은 보이지 않았다.

그런데 새다리님 블로그에서 cloudmqtt.com 서비스를 알게 되었다. 무료로 사용할 경우 약간의 제약은 있지만 이 상황에서는 최선의 선택일것이다.  새다리님덕에 요즘 다시 iot자작이 재미있어진다.

차후 테스트가 더 진행되면 업데이트 하겠다.