Blog for QTI developers

2016/08/18

Lego Mindstorms EV3에서 AWS IoT로 메시지를 쏴보자

IoT란 말이 요즘 유행이라 한번쯤은 누구나 들어봤을 단어이다. 이 말은 Internet of thing의 줄임말로써 우리말로 풀어서 이야기하면 사물인터넷이라고 한다. 꼭 컴퓨터가 아니더라도 여러가지 기기들에서 인터넷을 이용하여 데이터를 주고 받는 것이 IoT의 핵심적인 내용. 이런 IoT를 클라우드 서비스를 통해서 관리해주는 서비스들을 국내외 유수한 IT기업들이 제공하고 있어서, 무수한 데이터가 오고가는 것을 관리할 시스템을 굳이 우리가 구축할 필요가 없이 이런 서비스를 이용하면 되는데, 그중 하나가 Amazon에서 제공하는 AWS(Amazon Web Service) IoT이다.

요즘 AWS IoT와 연동하는 샘플 프로그램을 만들어야하는 일이 생긴 참에, 문득 떠오른 것이 내가 가지고 있는 Lego Mindstorms EV3였다. 작년에 갑작스레 Mindstorms가 갖고 싶다는 지름신이 왔는데 우리 천사같은 와이프가 내 생일선물로 사줘서 당장은 애들처럼 신나했지만, 그 이후 그냥 집 구석 한편에서 잠자고 있던 이놈을 제대로 이제서야 자기 일을 찾게 해주는 것 같기도 해서 더더욱 의욕에 불타올랐다.

레고 장난감과 AWS IoT와 연동이라 하면 왠지 좀 있어보이는 것 같은... 다소 유치한 영웅심과 호기심이 발동하여, 두개를 접목시키기로 해보고 작업에 들어갔다. 그래서 일단은 가장 간단한 작업, 즉 레고 Mindstorms에서 Hello라는 단어를 AWS IoT에 보내면 AWS IoT는 이것을 받아서, 내 메일로 보내주는 것이지. 간단히 도식화 하면 다음과 같을 것이다.




그럼 먼저 Lego Mindstorms가 뭐하는 장난감인지 부터 얘기해보자.





레고에서 만든 로보트 장난감 Mindstorms




레고에서 어느 날, 단순히 블럭 조립 완구만이 아닌 좀더 창의적이고 과학적인 학습 완구를 만들것을 생각해서, 미국의 MIT와 손잡고 만든 것이 Mindstorms이다. 이것은 소형 컴퓨터를 제공하여, 사람들이 이 컴퓨터에 프로그래밍을 하여 모터와 센서들을 제어할 수 있게 하였는데, 레고 블럭의 창조력과 결합되어 매력적인 장난감으로 어른들까지 매료시켰지. 1998년 첫선을 보인 이후, RCX, NXT버전을 거쳐서 지금 버전이 EV3이다.위지윅 방식의 프로그래밍 툴(즉 IDE)을 제공하여, 아이들도 쉽게 프로그래밍의 맛을 볼수 있게 해주었지.


레고블럭처럼 프로그램을 블럭 조립식으로 개발할 수 있도록 만든 프로그램 개발툴은 판단문 및 루프까지 가능하여서 잘 이용하면 복잡한 제어도 가능하다. 그래서 굳이 별도의 언어를 사용하지 않고 저 툴만들으로도 훌륭한 로보트 제어 프로그램을 만들수가 있어. 저런 방식의 프로그램 개발툴은 요즘 교육용 프로그램 부터 Pepper와 같은 로보트 제어 프로그램까지 많이 이용되고 있고, node-red라고 하는 node.js기반의 개발툴에서도 볼수가 있는데, 레고의 것이 매우 깔끔하고 화려한 외양을 가지고 있다.

교육용 완구로써 탄생하였지만, 각종 센서(자이로 센서라던가 색상센서, 적외선 센서 등)들을 제공하므로써, 왠만한 산업용 로보트 수준까지 만들 수 있다보니, 전세계에 오타쿠 아재들의 주목을 받기 시작했지. 그리고 예전 버전인 NXT에서는 32비트 ARM7 마이크로프로세서를 기반으로 하고 64kb의 램을 가지는 성능 떨어지는 컴퓨터였지만, EV3에서는 ARM9프로세서에 64메가의 램을 갖는 것으로 발전하여 이전 버전에 비하면 획기적이라 할 수 있을 정도이다. 물론 요즘 기가급으로 메모리를 쓰는 시절에 64메가면 애들 장난처럼 여겨지겠지만, 이 정도면 로보트 제어 프로그래밍은 충분히 돌릴수 있으니까.



각종 센서 디바이스들이 값싸게 공급되는 시절이 오니 레고에 결합할 수 있는 센서들은 더 늘어나게 되었고, 그렇다보니 이것을 가지고 뭔가 더 고차원 적인 것을 만들수 있지 않을까하는 것에 많은 이들이 생각하기 시작했지.  그래서 탄생한 것이 ev3dev라고 하는 EV3용 리눅스야. 리눅스 환경을 완전히 제공함으로써, 프로그래밍 언어를 좀더 폭넓게 이용해서 마인드스톰즈를 가지고 놀고 싶었던거지


http://www.ev3dev.org 에 들어가면 이 리눅스 이미지를 받아서 micro SD카드에 부팅가능하도록 해서, 새로운 OS로 사용할 수가 있지. 당연한 이야기지만, SD카드를 빼면 원래 제공되는 기본 OS로 부팅이되고. 이런 것 보면, 리눅스가 훌륭한 OS임은 분명한 것 같아. 부팅을 하면 아래와 같이 리눅스 펭귄이 뿅하고 나타나서 리눅스가 작동한다. 리눅스가 돌아가니까 당연히 다른 컴퓨터에서 원격으로 콘솔로 접속하여, 리눅스에서 하는 짓을 할 수가 있다. EV3에서는 USB단자가 하나 달려있는데, 여기에 Wi-fi 동글을 쓰면 wi-fi 접속이 가능하여 인터넷에 연결이 되고, 아니면 기본적으로 blue tooth가 지원되어서 블루투수로 스마트폰이나 PC에 붙어서 인터넷에 붙을수도 있지.





부팅하면 위에 사진 처럼 리눅스 펭귄이 짠하고 나타난다. ev3dev는 debian리눅스이므로 apt-get이라는 명령어를 써서 여러가지 필요한 패키지들을 설치하고 업데이트해서, 작업준비를 해야하는데, 먼저 기본적으로 apt-get update, apt-get upgrade, apt-get dist-uprade로 이미 설치된 패키지들을 전부 업그레이드 시켜주는 일부터 하자. 이것도 시간이 만만치 않게 걸린다. 원래는 Mindstorms EV3에 파이썬이라던가 스몰토크라던가 이런 다소 희귀한(물론 파이썬은 희귀한 언어는 아니지만, 그래도 한국에서는 희귀한 편아니냐?) 언어들을 이용해서 말 그대로 "갖고 놀려고" 했던 것이었는데, IoT와 연동하면서 요즘 몰두하고 있는 JavaScript, 정확히는 Node.js를 이용하기로 정했다. JavaScript의 새로운 모습을 더욱더 느껴보고 싶은 욕구도 있으니까.

Mindstorms EV3는 버전이 일반용과 교육용이 있다. 일반용은 인터넷 쇼핑몰에서 검색하면 나오는 것이 다 이것이다. 제품번호가 31313인데, 교육용과 뭐가 다르냐면, 일단 박스가 달라. 일반용은 종이박스에 부품들이 담겨있지만, 교육용은 플라스틱 상자에 담겨있지. 그런데 더 큰 차이점은 센서들의 종류가 다르고 무엇보다 교육용은 충전지를 제공해줘. 일반용은 밧데리 넣어서 써야한다. 당연히 그렇다 보니 가격차이가 나겠지? 교육용이 십만원 이상 비싼걸로 알고있는데, 내가 갖고 있는 것도 교육용이다.



일단 이정도로 Mindstorms EV3는 준비해두고, AWS IoT로 가보자.



Amazon Webservice의 IoT 맛보기 - thing의 생성

아마존은 IT에 대한 연구와 투자를 적극적으로 진행하여서, 지금은 Google이나 IBM, Microsoft에 못지 않은 기술력을 지닌 IT회사이다. 아마존의 또다른 주력 사업인 AWS는 서버호스팅 부터 웹서비스 전반에 걸쳐서 훌륭한 서비스를 팔고 있는데, IoT도 그중 하나이다. 일단 개발목적으로 간단하게 사용하는 것은 돈이 들지 않으니, amazon에 계정하나 파고, 서비스를 이용하면 된다.  먼저, AWS IoT를 찾아 들어가보자.




AWS IoT링크를 누르면 아래와 같은 화면으로 이동한다.


그러면 thing을 생성하는 화면으로 연결된다. thing이라고 하는것은 IoT에 연결하고자 하는 디바이스를 의미한다.
Name에 원하는 thing의 이름을 입력하는데, 간단히 우리는 EV3에 연결할 것이므로 EV3라고 하자.
그리고 나머지는 건드리지 말고 하단의 Create 버튼을 누른다.


새로운 thing이 생성되었다는 화면이 나오는데 여기서 우리는 그다음 작업을 진행하기 위해서 상단의 Create a rule 버튼을 클릭한다.
룰을 만드는 것인데, 룰이란, thing에서 메시지를 받으면 무엇을 할 것인가 하는 것을 정하는 것이다.
맛보기 차원이라 AWS IoT의 각각의 기능이나 설정이 어떤것이고 왜 저렇게 하는지에 대해서는 묻지 말자. 나도 잘 모르고, 일단은 기본적인 세팅으로 마인드스톰즈와 통신이 되는 것이 주된 목표니까.



Rule 생성하기


Name항목에는 앞선 항목에서 처럼 아무 이름이나 써넣으면 되는데, 여기서는 EV3_RULE이라고 입력하였고, Description은 이 룰이 무엇인지 간단히 설명하는 글을 입력하면 된다. 그 다음 중요한 것으로 Attribute에는 *을 일벽하고, Topic filter에 topic/sns라고 입력해준다. 이것은 뭐냐면 디바이스에서 메시지를 보낼때 메시지를 분류하기 위한 필터링항목이다. 실제로 디바이스에서 메시지를 보낼때에 여기서 정한 내용을 사용한다.
그리고 마지막으로 Choose an action 항목에서 우리가 실제로 메시지를 받아서 무엇을 처리할 지를 지정해준다. 메일로 보내기로 했으니까 목록에서 Send the message as a push notification(SNS)를 선택한다.



SNS를 설정하면 위 화면처럼 SNS target을 지정하는 폼이 표시된다. 이 표시된 화면에서 우리가 할일은, SNS를 이용한다고 했지만, 실제로 일반적인 의미의 SNS를 이용하는 것이 아니라 AWS의 SNS서비스를 이용하는 것이다. 따라서 AWS SNS를 설정해줘야한다. 그래서 SNS target항목의 우측 Create a new resource를 클릭하여 SNS설정에 들어가도록 하자.




링크를 클릭하면 위와 같이 브라우저 새 탭에서 새로운 화면으로 SNS설정 화면이 나타난다. 여기서 Create new topic 버튼을 클릭해보자. 클릭하면 Topic Name과 Display Name 두개의 입력폼이 화면에 뜨는데, 간단히 IOT-SNS라고 Topic name에 입력하고, display name에는 IOT SNS라고 입력한다. 입력하고 나서, 우측하단 파란색 배경의 Create topic버튼을 눌러 작업을 완료하자.



완료하고 나면 화면목록에 아래와 같이 등록된 내용이 표시될 것인데, 여기가 마지막이 아니니 추가 설정작업을 위해서 목록에 표시된 ARN 컬럼의 내용을 클릭하자.



클릭하면 또다른 화면이 등장할 것이다. 여기서 Subscriptions라고 되어있는 부분의 Create subscripion 버튼을 클릭한다. 여기서 뜨는 화면에서 우리는 이메일을 설정할 것이다.



Protocol항목에서 Email을 선택하고, 그 아래에 수신할 메일 주소를 입력해주고 Create Subscription버튼을 누르면 목록에 등록한 이메일이 표시가 된다.



그런데 등록된 이메일옆에 PendingConfirmation이라고 뜰것이다. 이메일 확인대기중이라는 표시인데 그 다음 할일은 등록한 이메일에 가서 AWS에서 온 확인 메일을 열어서 확인 링크를 클릭하여 확인작업을 완료해주는 것것이다. 등록한 메일의 받은메일함에 가면 AWS Notification - Subscription Confirmation 이라는 제목으로 메일이 한통 와있을 것이다. 해당 메일 내용을 보면 아래와 같이 링크가 보일 것인데 그것을 클릭한다.



이로써 다소 길게 느껴지는 이 SNS 설정작업이 완료되었고, 우리는 다시 AWS IoT의 룰 설정화면으로 돌아가서 작업을 완료하도록 하자.



SNS target에서 목록 박스 옆 새로고침을 누르고 다시 목록박스로 마우스를 이동하면 방금 등록한 SNS 이름이 뜰것이다. 이것을 선택하도록 하자. 선택하고 나면 아래 화면과 같이 Role을 등록하라는 폼이 나타난다.
Role은 간단히 얘기하자면 권한 관리라고 볼수 있다. 일단은 Role name을 처음으로 생성하여야 하므로, Create a new role을 클릭하자.



클릭하면 아래와 같이 입력폼이 뜰것이다. Role이름은 EV3_ROLE이라고 입력하고 Create 버튼을 누른다. 그러면새로운 Role이 생성되고,  화면에서 Role name 선택에 보면 방금 입력한 EV3_ROLE이 있을 것이다. 그것을 선택하자.



선택한 후, 아래에 있는 Add action 버튼을 누르면 Action이 등록되었다고 표시된다.
여기서 Create을 눌러서 Rule 등록을 마치도록 하자. 등록이 마무리되면 아래 화면과 같이 EV3_RULE이 표시된다.





Policy 만들기

AWS IoT에서 여러 동작들의 허가를 관리하는 것을 Policy라고 하는데, 이것을 생성해보도록 하자.
화면상단의 Resouces 관리 버튼에서 가장 마지막 Create a policy 버튼을 클릭하면 아래와 같이 policy 등록 화면이 나온다.





다음과 같이 Name은 EV3_POLICY, action은 iot:*, Resource에는 *을 입력하고, Allow에 체크해준다. 체크하는 순간 아래 Add statement 버튼이 활성화된다.



Add statement 버튼을 누르면 statement가 추가된 것이 표시되고, Create 버튼이 활성화 된다. Create 버튼을 눌러서 Policy 생성을 마무리 하자.
마무리되면 하단에 Policy 박스가 표시되는 것을 확인할 수 있다.






증명서의 작성


외부 디바이스들이 IoT에 접속하기 위해서는 보안을 위한 증명서가 필요하다. IoT 설정의 마지막 작업으로써 증명서 발급 작업을 하도록 하자.
상단 Resources 버튼들에서 Create certificate을 클릭한다.




위 화면에서 1-Click certificate create 버튼을 클릭하면 증명서 파일 세가지를 다운로드 할 수 있는 링크가 표시된다. Activate 체크박스는 체크하면 발급받은 증명서를 자동으로 Active시키게 된다.
이것을 체크하고 1-Click certificate create 버튼을 누르자. 버튼을 누르면 아래와 같이 다운로드 링크가 표시되고, 하단에 증명서 박스가 표시된다.



링크를 눌러서 각각의 증명서 파일들을 다운로드 받는다. 이 다운로드 링크는 이 화면이 사라진 이후로는 다시는 나타나지 않으므로 파일을 잘 다운로드 받아서 잘 보관해두자.



증명서에 Policy 연결



하단 증명서 박스를 체크하고 우측 중간에있는 Action버튼을 누른 후 표시되는 목록에서 Attach a policy를 선택한다.




그러면, Policy이름을 입력하라는 입력폼이 화면에 표시되는데, 아까 우리가 생성하였던, EV3_POLICY를 입력한다. 몇글자만 입력해도 자동으로 리스트가 뜰 것이니, 일일이 다 입력안하고 선택해주면 된다.



Attach 버튼을 누르면 Policy에 증명서가 첨부되었다는 확인 메시지가 표시된다.




증명서와 thing의 연결

우리가 만들었던 thing 즉 디바이스에도 증명서를 연결해줘야한다. Policy에 첨부했던 것과 마찬가지로, 증명서 박스 아래의 체크박스를 선택하고, Action에서 Attach a thing을 선택한다.



그러면, 아래와 같이 입력폼이 뜨는데, Policy에서와 마찬가지로 thing name입력에서 리스트가 자동으로 뜨니 거기서 우리가 생성하였던 EV3를 선택하여준다.
그리고 마찬가지로 Attach를 눌러서 마무리 짓도록하자.



이로써 기본 설정작업은 모두 마무리 되었다. 마지막으로 하단 박스드에서 EV3를 클릭하여보자. 클릭하면 다음과 같이 우측에 상세정보가 표시되는데, 여기서 REST API End point 정보를 잘 기록해둔다. 나중에 MQTT로 AWS IoT와 Mindstorms가 통신할때에, 여기서 표시된 도메인이 Host가 된다.



꽤 길고긴 과정이서 사실 무작정 따라하기도 다소 지겨울 수 있다. 그리고 이 설정들의 상세 설명은 추후로 미루도록하고, 이 글의 목표, 일단 한번 연결해보자에 충실하기 위해서, 일단은 무작정 따라하기 방식으로 계속 진행하여나가기로 하겠다. 다음은 마인드 스톰이다.






AWS IoT통신을 위한 Mindstorms EV3 작업



우선 Mindstorms EV3의 리눅스인 ev3dev에 원격으로 접속을 하자. ev3dev를 인터넷에 연결하는 것은 http://www.ev3dev.org/docs/tutorials/로 들어가서 Network항목에서 자신이 원하는 방법을 택한다. 내 경우는 참고로, Connecting to the Internet via USB에 나와있는 방식을 사용하였다. 터미널 프로그램으로 연결하면 다음과 같이 접속된다.



우리가 마인드스톰즈와 AWS IoT를 연결하는데 사용하는 것은 mosquitto 라고 하는 MQTT 브로커이다. ev3dev에 당연히 그것이 처음부터 없으므로 우선 이것을 설치하도록 하자


sudo apt-get update
sudo apt-get install mosquitto
sudo apt-get install mosquitto_clients



그 다음 AWS IoT처리를 위한 디렉토리를 만들자. 디렉토리 네임은 aws_iot_test라고 이름짓자.


mkdir aws_iot_test && cd $_



AWS IoT 보안 인증을 위해서 우리가 IoT 설정작업에서 다운로드 받았던 파일들 중,  private.pem.key로 이름이 끝나는 파일과, certificate.pem.crt로 끝나는 파일 두개를 위 디렉토리에 업로드한다.
그리고 루트 인증 파일이 필요한데, 이것은 AWS IoT에서 symantec에서 발급하는 것을 다운로드 받아서 이용하라고 나와있다.
Symantec에서 제공하는 인증서 파일을 디렉토리에 다운로드 받아 rootCA.pem 파일명으로 저장 시키자




자 이제 마지막 작업만이 남았다.  mosquitto를 이용하여, 메시지를 AWS IoT에 보내는 것이다. 일단 다음과 같이 메시지를 보내보자


mosquitto_pub --cafile rootCA.pem --cert b7447d6b23-certificate.pem.crt --key b7447d6b23-private.pem.key -h a2cbqzqenb9ahq.iot.us-west-2.amazonaws.com -p 8883 -q 1 -d -t topic/sns -i EV3 -m "hello" --insecure



mosquitto_pub을 이용하여 메시지를 보내는데, 각각의 옵션들에서 cert는 우리가 다운로드 받았던 인증서 파일에서 pem.crt라고 이름이 끝나는 파일명을 적어주고, key는 private.pem.key 파일명을 적어준다. h는 호스트로써, 아까 thing상세정보에서 확인하였던 url에서 도메인까지만 적어주고, t는 Topic으로 우리가 등록하였던 topic/sns를 써준다.  i옵션에는 thing의 이름을 적어주면된다. 위와 같이 해서 메시지를 보내면 다음과 같다.




정상적으로 메시지가 전송된 것은 콘솔에서 확인하였고, 그러면 메일로 가서 IoT에서 보낸 메일을 확인해보자.



메일이 도착했다!!!! 그러면 무슨 내용이 왔는가 열어보자!



우리가 메시지 내용에 보냈던 hello가 적혀있다. 이로써 길고 긴 준비과정을 거쳐서 Lego Mindstorms EV3에서 AWS IoT에 메시지 송신을 성공적으로 마무리 지었다.

 AWS IoT의 JavaScript SDK를 이용하여 프로그래밍을 짜서 좀더 정교하게 제어하는 것을 해보고 다시 글을 올리도록 하겠다.







Share:

댓글 1개: