IOT/Arduino

Arduino Yun과 AWS IoT 1

알 수 없는 사용자 2016. 5. 3. 18:07

아두이노 윤으로 AWS IoT와 연결하기 위해 많은 시행착오를 하여, 다음에 저와 같은 작업을 진행하시는 분 혹은 저에게 도움이 되고자 하며, 이제까지 했던 내용을 공유하고자 합니다.

블러그는 오늘부터 쓰고자 마음 먹었기에, 미리 스샷을 준비하지 못하여, 스샷이 부족함을 이해해 주시고, 회사 운영 블러그이지만 편하게 쓰는 것 역시 너그럽게 이해해 주시길 부탁드립니다.

 참고

https://github.com/aws/aws-iot-device-sdk-arduino-yun/blob/master/README.md AWS IoT Arduino Yun SDK의 설명 글입니다. 이글을 기준으로 작업을 진행하였습니다.

https://www.arduino.cc/en/Guide/ArduinoYun 아두이노 윤보드 시작 문서입니다. 아두이노 업그래이드 등을 위해 참고하였습니다.

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Putty를 다운로드 받을 수 있는 사이트 입니다. 터미널 툴입니다.

http://winscp.net/eng/download.php winscp를 다운로드 받을 수 있는 사이트 입니다. 아두이노에 파일을 밀어 넣기가 뭐 같기 때문에 파일을 넣기 위해 필요한 툴입니다.

준비사항

 micro sd카드 16mb 이상

 arduino yun

 노트북

1. Arduino Yun보드를 만나다.

 처음 지시를 받고, 여기 저기 구글링 해본 결과 arduino yun 보드를 바로 지원하는 AWS SDK가 있다는 것을 알게 되었다. 이 보드가 있다면, aws iot를 이용한 개발은 아니 최소한 aws iot 연결하는 부분은 거져 먹겠구나하는 생각에 적극적으로 밀어서 결국 이 보드로 결정되었다. 그러나 처음 만난 arduino yun은 상당히 Uno와는 상당히 다른 부분이 있었으니, 프로세스가 ATmega32u4와 AR 9331가 두개가 들어가 있는 것이다. 32u4는 arduino uno의 사용법(환경이 같다)과 같은 것이고, AR9331은 리눅스였다. uno 때는 esp8266을 사용하여 인터넷을 연결하고 서버에 정보를 보냈었는데... 이 녀석은 좀 틀리다. 그래도 그런 것들은 SDK에서 다 지원 할 것이므로 나는 패스!

 AWS SDK를 다운받고 본격적으로 셋팅을 시작하였다. yun 보드를 처음 받았을 때, 상당히 구 버젼의 모습을 하고 있었다. 업그래이드 하다가 날려먹은 이력이 있기 때문에 일단은 그냥 셋팅하기로 결정하고, 하나하나 문서에 적힌 대로 설정하기 시작하였으나, 나중에는 결국 Yun보드 업그레이드를 하고야 말았다. Yun 보드 업그레이드 시에 주의 사항이 있는데 절때로 진행 도중에 보드의 전원을 끊으면 안된다. 업그래이드시 자동으로 리부팅 되는데 보드가 작업을 끝내고 재부팅이 완료 될 때까지 가만히 놔두는 것이 좋다.


2. 윈도우에서 설치

 난 윈도우를 쓰기 때문에 윈도우를 기준으로 쓴다. Linux와 MacOS관련 내용은 SDK 문서를 참고 하길 바란다. 먼저 https://www.arduino.cc/en/Main/Software 링크로 이동하여 Arduino IDE를 다운받아 설치 한다. 그리고 putty, winscp를 차례로 다운로드 받아 설치한다. 설치 방법은 특별한 것이 없으니 특별히 설명할 것이 없다.


3. Arduino Yun보드 업그레이드

 Arduino IDE를 실행시키고, Arduino IDE에서 파일>예제>Bridge>YunSerialTeminal 예제를 연다. Arduino Yun 보드에 micro sd카드를 꽃은 다음 usb케이블로 arduino yun보드와 컴퓨터를 연결하고, Arduino IDE에서 툴>포트에서 Arduino 윤이 연결된 COM포트를 지정한 후 툴>시리얼 모니터를 클릭하여 시리얼 모니터를 연다. 마지막으로 Arduino IDE 좌측 상단의 툹팁에서 오늘쪽 화살표를 클릭하면 예제가 빌드되고, 배포까지 된다. 그러면 시리얼 모니터에서 리눅스 명령을 입력할 수 있고, 리눅스 메세지를 받을 수가 있다. 여기서 일단 리눅스를 리셋하자. 리셋 버튼은 Arduino Yun 보드의 led가 모여있는 곳 옆에 있는 버튼이다. 3초간 꾹 눌러주면 리눅스가 재부팅 되는 것이 확인된다.

이제 Wifi를 연결해보자, 노트북 컴퓨터의 Wifi 네트워크를 띄워보면, arduino-어쩌고저쩌고 하는 ap가 보인다. 이 녀석은 arduino yun이 서버가 되는 ap인데, ap란 연결하라고 있는 것이 아니겠는가? 연결한다. 그리고 웹브라우져를 띄워 http://192.168.240.1으로 이동한다. arduino yun의 암호 입력 창이 보인다면, yun 보드의 암호를 입력하면 된다.(암호를 모르겠거든, 시리얼 모니터 화면에서 passwd를 입력한 후 새암호를 입력하여 암호를 변경하여도 된다.) 암호를 입력하고 로그인을 하면 "CONFIGURE"라는 버튼이 보인다. 클릭하면 아래와 같을 수도 있고, 비슷한 화면이 보일 것이다. 대충 보기만 해도 Wire less parameter의 내용을 채워 넣으면 된다는 감이 올 것이고, 버젼이 달라 다른 화면이 떠도, 크게 다르지 않을 것이기에 큰 어려움은 없을 것이다.



arduino yun의 wifi를 설정을 적용하였다면, arduino yun과 연결이 끊히게 된다. 노트북의 네트워크 설정을 윤이 연결한 네트워크로 지정하고, putty 프로그램을 사용하여 arduino yun과 연결한다. 만약 ip를 잘모르겠거든 시리얼 모니터에서 ifconfig -a 명령으로 ip를 알수가 있다. ssh, 21포트, yun ip 이렇게 입력하고 연결하면, 계정을 물어볼것이다. 계정은 root이고 암호를 입력하면 프롬프트가 뜬다.


이제 컴퓨터에서 파일을 자유롭게 다루기 위해  시리얼 모니터의 상단에 있는 입력 박스에 다음의 명령을 넣고 전송버튼을 클릭한다. 

opkg update

opkg install openssh-sftp-server

그리고 winscp 프로그램을 실행시키고 마찬가지로 윤보드에 당연히 IP정보를 이용해서 연결한다. 여기서 부터 윤보드를 업그래이드를 안내하는데, 업그레이드하다가 윤보드 하나를 못쓰게 만들어 버린 이력이 있다. 지금이야 시간이 없기 때문에 윤보드를 샀지만, 조만간 수단과 방법을 가리지 않고 살릴 것이다. 뜬금없이 이런 얘기하는 이유는 아래 작업이 실패 할 경우 곤란한 상황이 있을 수 있다는 경고의 의미이다.
https://www.arduino.cc/en/Main/Software 에서 Arduino yun linux OS openwrt-yun x.x.x upgrade image라는 버튼이 있을 것이다. 다운 받고, 이 파일을 scp를 이용해 arduino yun의 micro sd 카드의 루트 폴더에 위치 시킨다. 그런 후 putty 창에서 아래의 명령을 입력 시킨다. Arduino 공식 홈페이지에서는 웹 페이지에서 업그레이드 시키는 방법이 소개 되어 있으나, 내가 받은 윤은 오래된 놈이라 그런지 UI도 많이 틀린데다가 기능을 찾을 수가 없었다.

run-sysupgrade /mnt/sda1/openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin

그러면 아래의 메세지가 띄는데 복잡한 문제에 부딪치고 싶지 않다면, 주의하길 바란다. 시스템이 리부팅 될 때까지 절때 건들지 말자. 

run-sysupgrade /mnt/sda1/openwrt-ar71xx-generic-yun-16M-squashfs-sysupgrade.bin 
Sending TERM to remaining processes ... uhttpd dbus-daemon dnsmasq avahi-daemon thd ntpd uSDaemon sleep syslogd klogd hotplug2 procd ubusd netifd 
Sending KILL to remaining processes ... 
Switching to ramdisk...
Performing system upgrade...
Unlocking firmware ...

Writing from <stdin> to firmware ...     
Upgrade completed
Rebooting system...

putty는 리부팅이 되면 끊어진다. 물론 winscp도 끊어질 것이다. 리부팅 완료 여부는 시리얼 모니터를 통해서 확인 할 수 있다. 시리얼모니터에서 정상적으로 리부팅이 된다면, 정상적으로 업그레이드가 완료 된 것이다. 보드가 업그레이드 되면, 그전에 설정했던 것들이 모두 날아간다. 그러므로, 여태 arduino yun보드에 했던 짓(wifi 설정, sftp 서버 설치)을 다시 설정을 해야 한다.


4. AWS IoT SDK 설치

 아래의 명령은 SDK설치와 순서는 없다. 순서에 관계없이 Linux가 업그레이드고 난 이후 한번은 실행되어야 한다. 

opkg update
opkg install distribute
opkg install python-openssl

구글 형님께 AWS IoT Yun SDK라고 물어보면 제일 먼저 뜨는 것이 https://github.com/aws/aws-iot-device-sdk-arduino-yun 이 사이트이다.  github에 올라가있는 프로젝트 들인데, 여기서 지금 필요한 항목은 "AWS-IoT-Arduino-Yun-Library", "AWS-IoT-Python-Runtime"이다. 전자는 Arduino 라이브러리이고, 후자는 윤보드에 들어갈 내용이다. 

AWS-IoT-Python-Runtime 폴더를 통채로 윤보드의 root에 넣을 것인데, 이동하기 전에 해야 할 일이, AWS IoT의 thing객체(테스트 용도라도...)와 연결하기 위한 인증서를 받아야 한다. AWS IoT의 사용방법 등은 AWS 문서가 있으니 생략하고 연결하는 방법만 설명 하겠다. 

우측 하단에 보면 "Connect a device"라는 버튼을 클릭한다. 그러면 화면이 바뀐다.

고맙게도 Connect a device 문구 아래 Arduino Yun이라는 라디오 박스가 있다. 그 라디오 박스를 선택하면 화면 중간에 "Generate certificate and policy"라는 버튼이 보이는데 클릭한다. 

다운로드 링크가 3개가 보이는데 모두 다운로드 받는다. 그리고 "Confirm & start connecting"버튼을 클릭한다.

그러면 위 그림과 같이 C 코드가 나온다. 이 코드는 "AWS-IoT-Arduino-Yun-Library"에 있는 aws_iot_config.h 헤더 파일에 들어갈 내용 들이다. 노트패드 같은 프로그램을 열어 콘트롤C,V 신공을 활용하여 코드를 보관해두든, 웹 사이트를 그대로 두든, aws_iot_config.h 헤더파일에 해당 부분을 변경하든 하여야 타이핑을 줄일 수 있다. 그림에 보면 AWS_IOT_MQTT_HOST 항목이 있는데 이곳에 주소는 [식별자].iot.[서버지역].amazonaws.com 식으로 입력되어야 한다. HOST에 들어갈 내용은 thing의 REST API endpoint에서 "https://" 떼어내고, "/thing/~"부분을 떼어낸 부분이 들어가면 된다.

 ex) https://[식별자].iot.ap-northeast-1.amazonaws.com/things/Corebd_IOT_Sensor/shadow
      [식별자].iot.ap-northeast-1.amazonaws.com

AWS에서 받은 인증서 파일들를 "AWS-IoT-Python-Runtime" 폴더 안에 certs 폴더로 이동 시킨다. 이것들은 MQTT 통신 시 암호화에 사용되는 인증서들이다. AWS IoT는 보안 레이어가 없으면 아예 통신이 되지 않으므로 반드시 필요한 것들이다. 다음 단계는 "AWS-IoT-Python-Runtime" 폴더를 윤보드 리눅스 환경의 /root 폴더로 이동시키는 것이다. 이 작업은 winscp를 이용하여 파일을 옮기면 드래그 한번으로 쉽게 옮길수 있다.

위의 그림은 winscp로 폴더를 옮긴 직후의 그림이다. 이제 남은 작업은 AWS IoT Arduino Yun SDK에 있었던 예제 프로그램을 윤보드에 올려 실제 연결이 되어 MQTT 메세지가 잘날아가는지 확인하는 작업이 남았다. 이 작업에 대한 내용은 다음 포스팅으로 미루고 우선 여기서 글을 끊고자 한다.

긴 글 읽으시느라 수고하셨습니다. 나머지 내용도 빠른 시일내에 포스팅을 하도록 하겠습니다. 혹씨나 내용에 문제가 있으면 꼭 알려주시길 부탁드리겠습니다.