달력

5

« 2025/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2016. 5. 9. 10:50

Arduino Yun과 AWS IoT 2 IOT/Arduino2016. 5. 9. 10:50

아두이노 윤으로 AWS IoT와 연결에 대한 두번째 포스팅 입니다. 지난 포스팅에서는 윤의 환경 설정부분과 AWS에서의 설정만을 다루었습니다. 이제 Arduino IDE에서 작업을 진행하여 연결되는 것을 확인 해보고, 이전에 UNO에서 작업하였던 소음 진동 센서를 붙여서, AWS IoT로 메세지를 보내고, AWS에서 제대로 받았는지 확인해 보겠습니다. 지난번과 마찬가지로 본문은 편하게 작성하고자 합니다. 양해 부탁드립니다.

5. Arduino Yun과 AWS IoT 연결 테스트

 아래는 내 컴퓨터의 Arduino IDE의 스케치북 폴더의 모습이다. 아래에서 libraries라는 폴더가 라이브러리 폴더이다. libraries 폴더 안에 이전 포스팅에서 언급되었던, "AWS-IoT-Arduino-Yun-Library" 폴더를 통채로 복사 한다. 그리고 Arduino IDE를 실행 시킨 다음 파일>예제>AWS-IoT-Arduino-Yun-Library>BasicPubSub를 클릭한다.

그럼 아래와 같이 예제 샘플 소스가 그대로 뜰 것이다. 나의 경우 소스에서 BasicPubSub의 내용을 변경할 이유가 없었다. 그러나 aws_iot_config.h 파일은 이전 포스팅에서 따로 저장하였던 AWS IoT 연결 설정에서 나왔던 코드로 변경을 하여야 한다.

aws_iot_config.h의 최초 내용이다. 이전 포스팅을 참고하여 내용을 환경에 맞게 변경한다. 복사해서 //==== 두 줄 사이의 코드 내용을 통채로 변경하면 된다. 이제 테스트를 진행 할텐데, 윤보드를 컴퓨터와 연결하고 툴>시리얼 모니터를 클릭하여 시리얼 모니터를 연다. 그리고 좌측 상단의 화살표를 클릭하여, 소스를 빌드하고 배포한다. 소스코드에 Serial.begin(115200);이라 기술 되어 있다. 당연히 시리얼 모니터의 보드레이트는 115200으로 맞쳐야 한다.

별다른 문제없이 빌드되고 배포 되었다면, 아래와 같은 메세지가 나타나야 한다. 만약 뭔가 문제가 있다면 에러와 메세지와 함께 에러 코드가 나타난다. 에러에 대해서 내가 보았던 코드는 -13이었고, 이것의 정의 AWS-IoT-Arduino-Yun-Library/aws_iot_error.h에 CONNECT_CREDENTIAL_NOT_FOUND = -13 이렇게 되어 있었다. 여담이지만, 이게 인증서와 씨름을 하다보니 해결은 되었는데, 구체적으로 어째서 해결이 되었는지 아직도 아리송하다.

이렇게 떠야 정상이다. 그리고 중간에 설명되지 않은 것이 MQTT 프로토콜인데 여기서 설명하자니 너무 내용이 많을 듯하여 대충 설명하고 넘기려 한다. IBM과 Eurotech에 의해 개발된 프로토콜로서 오픈소스로 공개가 되었다. 메세지 발행/구독을 기반으로하는 가벼운 통신 프로토컬이다. Sensor와 통신에서 많이 사용되는 것같다. 그래서 그런지 AWS IoT도 MQTT 기반으로 통신을 하더라.

이제 웹브라우져를 열어 AWS IoT로 이동한 다음,  사이트 우측 상단에 MQTT Client를 클릭한다. 아래와 같은 화면이 뜰 것이다.

Client ID는 아무거나 입력하면 된다. 정말 귀찮다면, Generate client ID버튼을 클릭하면 알아서 입력해준다. 그리고 Connect를 클릭하면 AWS IoT의 MQTT Broker로 연결한다. 화면에 보면 Subscribe to topic라는 항목이 있다. 그것을 클릭하면, 구독을 설정할 수 있는 화면이 나오는데 Subscription topic에서 이전에 Arduino IDE에서 보았던 "topic1"을 입력하고 제일 아래의 Subscribe 버튼을 클릭한다. 

위 그림과 같이 좌측에 토픽의 내용을 제대로 받으면 성공이라고 볼 수 있다. 이미 제대로 받는 것은 확인 했지만 이곳에서 메세지를 발행하면 윤이 받는 것도 테스트 해야 되지 않을까? "Pubish to topic" 항목을 클릭하고, Publish topic에 "topic1"이라고 입력한 다음 Payload 항목에 "Hi!"라고 입력한다. 그리고 아래에 Publish 버튼을 클릭한 후 Arduino IDE의 시리얼 모니터를 지켜보자.

저기 빨간색으로 밑줄그은 Hi!가 보인다면, 윤도 제대로 구독을 받는 것이라 생각 할 수 있다. 이제 윤을 이용해서 센서 회로를 구성한 다음 센서의 값을 AWS IoT로 넘겨 주고 제어신호를 받아 LED의 On/Off를 한다면, 윤으로 목표했던 것의 핵심은 다 한 것이라 할 수 있을 것이다.


6. 소음 센서 회로 구성.

아두이노 윤에서 AWS로 뭔가 값을 보내는 것은 AWS IoT SDK의 예제를 통해서 이미 해보았으니, 그 "뭔가"를 해야 한다. 사실 이것은 윤을 작업하기 이전에 벌써 모두 정해진 상태였다. 이미 아두이노 우노와 내부 NodeJS를 이용한 MQTT서버를 이용해서 한번 구현해본 바 있다.

여담이지만, ESP8266을 이용하여 구현했는데 이게 우노보드랑은 궁합이 좋지 못하다는 얘기가 많았다. 전기적인 문제가 있다고 카더라... 게다가 Uno랑 ESP8266은 다루기가 좀 힘들었다. 그래서 잘 동작하는 이넘을 보면서 회사사람들이 "저건 언제 터지니? 저걸 터트려야 윤을 사는데 도움이 되지."라고 하시는 분들이 많았다. 근데 이넘은 장수하고, 첫째 윤이 온날 업그래이드 작업을 하다 맞이 갔으니.......


지난간 일은 잊고, 우노에서는 우여곡절 끝에 ESP8266과 하드웨어 시리얼을 이용하여 통신을 하는 바람에 디버깅을 또는 상태를 위해 시리얼 모니터를 쓸 수가 없었다. 그래서 LCD가 붙어서 이런 기능을 했었는데, 윤은 그럴 필요가 없어 LCD는 빼고, 소음 센서와 LED만을 고대로 옮겨 왔다.(사진을 보면 LED가 13번핀에 연결되어 있다. 13번 핀은 보드에 이미 LED가 붙어 있으나, 일단 가져왔다.)

소음 센서 모듈에서는 아날로그 신호만 A3핀으로 받는다. 구글로 해당 모듈 혹은 소자의 정보를 찾으면 나오니 그걸 확인하고 회로를 구성하면 된다. 여기에 사용한 소자는 D, A, 5V, GND가 있는데, 윤의 GND와 연결하고, 5V는 윤의 5V에 연결 했으며, A가 A3핀에 연결되어 있다. 데이터는 A3에서 받을 것이다.

LED는 저항을 이용해서 전류를 맞추어 주고 (+)는 D13핀에 (-)는 GND에 연결한다. 소음센서와 마찬가지로 회로 구성에 대한 상세설명은 뒤로하고, 13에 연결한 이유는 윤이 MQTT로 신호를 받으면 D13핀에 HIGH를 걸어서 LED 불을 키려는 생각이다.


7. 윤 소스 변경

작업한지 몇일이 되다 보니 기억이 가물가물하다. 소스를 보면서 이 코드를 정말 내가 수정했단 말인가?라는 의문이 든다... 하지만 정황상 나밖에 없으므로, 의심의 여지는 없다.

일단 MQTT의 토픽을 지정한다.

#define mqtt_sensor_value_topic "$aws/things/Corebd_IOT_Sensor/shadow/update"

#define mqtt_sensor_commend_topic "corebd/sensor_control"

#define mqtt_sensor_status_topic "corebd/sensor_status"


아래의 변수를 추가한다.

byte stateState = LOW; // led state

char strOut[64]; // lcd print string

int soundVal = 0;

unsigned long prevMillis = 0;


다음 MQTT 메세지 콜벡 메서드를 아래와 같이 수정한다.

void msg_callback(char* src, int len) {

  Serial.println("CALLBACK:");

  int i;

  for(i = 0; i < len; i++) {

    Serial.print(src[i]);

  }


  byte* p = (byte*)malloc(len);

  memcpy(p,src,len);

  

  if (strstr((char*)p, "-1")) {

      // 현재 상태에 대한 질의를 받았을 경우.

    } else if (strstr((char*)p, "1")) {

      stateState = HIGH;

      digitalWrite(13, stateState);

    } else if (strstr((char*)p, "0")) {

      stateState = LOW;

      digitalWrite(13,stateState);

    }


    sprintf(strOut,"{ \"id\":\"%s\" ,\"value\" : \"%d\" }",AWS_IOT_CLIENT_ID , stateState);

    if((rc = myClient.publish(mqtt_sensor_status_topic, strOut, strlen(strOut), 1, false)) != 0) {

      Serial.println("Publish failed!");

      Serial.println(rc);

    }

}


그리고 loop의 코드를 다음과 같이 변경한다.

void loop() {

  if(success_connect) {

    unsigned long currentMillis = millis();

    int curSoundVal = analogRead(A3);

    

    if (soundVal < curSoundVal) {

      soundVal = curSoundVal;

    }


    if (currentMillis - prevMillis > 1000) 

    {

      prevMillis = currentMillis;

      sprintf(strOut,"{ \"id\":\"%s\", \"value\":\"%d\"}",AWS_IOT_CLIENT_ID , soundVal);

      if((rc = myClient.publish(mqtt_sensor_value_topic, strOut, strlen(strOut), 1, false)) != 0) {

        Serial.println("Publish failed!");

        Serial.println(rc);

      } else {

        Serial.println(strOut);

      }

      

      soundVal=0;

    }


    if((rc = myClient.yield()) != 0) {

      //Serial.println("Yield failed!");

      //Serial.println(rc);

    }

  }

}

그리고 

셋업에 아래의 문구를 추가하고

  pinMode(13, OUTPUT);

  pinMode(A3, INPUT);


myClient.subscribe(...  ); 함수를 다음과 같이 변경한다.

myClient.subscribe(mqtt_sensor_commend_topic, 1, msg_callback))

이제 AWS IoT에 연결한 다음, MQTT Client에서 $aws/things/Corebd_IOT_Sensor/shadow/update 토픽을 구독하여 값이 계속 올라오는지를 확인한다. 그 다음 corebd/sensor_control 토픽에 1을 보내고, 0을 보내본다. 각각 LED가 켜지고 꺼져야 정상이다. corebd/sensor_status 토픽을 구독하고, corebd/sensor_control토픽에 -1,0,1을 보내서 corebd/sensor_status가 값을 받으면 정상이다.


이로서 윤보드의 AWS IoT 연결 작업은 일단 끝났다. 이제iPhone 작업을 하여 윤과 통신하게 하고, 각 기능들을 이용해여 간단한 센서 연동 프로그램을 만드는 작업이 남았으나, 포스팅은 여기까지로 하려고 한다. 

긴 글 읽어주신 분들 감사합니다.

'IOT > Arduino' 카테고리의 다른 글

Arduino Yun과 AWS IoT 1  (0) 2016.05.03
:
Posted by 알 수 없는 사용자
2016. 5. 3. 18:07

Arduino Yun과 AWS IoT 1 IOT/Arduino2016. 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 메세지가 잘날아가는지 확인하는 작업이 남았다. 이 작업에 대한 내용은 다음 포스팅으로 미루고 우선 여기서 글을 끊고자 한다.

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



'IOT > Arduino' 카테고리의 다른 글

Arduino Yun과 AWS IoT 2  (2) 2016.05.09
:
Posted by 알 수 없는 사용자

Windows Server 2012 이상에서 클러스터를 구성하는 경우, 나름(?) 고급 설정에 포함될 수 있는 부분이 CSV 캐시동적 쿼럼 정도가 됩니다.


그런데 말입니다(음성 지원 되지요?).. Windows Server 2012 R2가 되면서 동적 쿼럼은 기본적으로 Enable로 설정되었기 때문에 별도로 설정을 하시지 않으셔도 됩니다.


궁금하시다면, 클러스터 구성 후 PowerShell에서 다음과 같이 클러스터 속성 값을 나열해 보시면 DynamicQuorum 값이 1(Enable)로 설정되어 있는 것을 확인할 수 있습니다. 사실 Disable 하는 메뉴는 GUI 상에서 찾을 수가 없더군요.



두 번째 항목으로 CSV 캐시가 있는데 기능도 마찬가지로 기본 값이 Enable되어 있으며, BlockCacheSize 값이 저의 경우 2,048(2GB)로 설정되어 있습니다. Microsoft에서 권장하는 구성으로는 Hyper-V 클러스터의 경우 512MB, 스케일 아웃 파일 서버 클러스터의 경우 R2 기준으로 물리 메모리 대비 최대 80%까지 설정 가능하며 '크면 클 수록 좋음' 입니다.


현재 CSV 볼륨들에 대한 CSV 캐시 설정 확인 (값이 1이면 Enable 상태입니다.)

Get-ClusterSharedVolume | Get-ClusterParameter | where {$_.Name -eq "EnableBlockCache"}



서론이 길었습니다. 말씀 드린 것처럼 Windows Server 2012 R2에서는 동적 쿼럼이 기본 값이기 때문에 별도로 설정하실 필요는 없으며, CSV 캐시의 경우 PowerShell에서 다음 명령으로 캐시 크기를 설정합니다.

(Get-Cluster).BlockCacheSize = <크기, 단위는 MB>


예들 들어, 메모리가 32GB인 스케일 아웃 파일 서버 클러스터 노드의 CSV 캐시 크기를 10GB로 설정하는 경우에는 다음과 같이 입력합니다.

(Get-Cluster).BlockCacheSize = 10240


잘 입력되었는지는 PowerShell에서 다음과 같이 입력해 확인합니다.

(Get-Cluster).BlockCacheSize



참고로, CSV 캐시는 CSV 볼륨마다 할당됩니다. 즉, CSV 캐시를 10GB로 설정했는데 CSV 볼륨이 두 개인 경우 10GB x 2 해서 클러스터 노드마다 20GB의 캐시가 할당되게 됩니다.



아래는, CSV 캐시의 Hit 상황을 모니터링할 수 있는 성능 카운터 정보입니다.



CSV 캐시(메모리)에서 가져오는 I/O

- Cache IO Read-Bytes

- Cache IO Read-Bytes/Sec

- Cache Read

- Cache Read/Sec


캐시에 없어 스토리지에서 가져오는 I/O

- Disk IO Read-Bytes

- Disk IO Read-Bytes/Sec

- Disk Read

- Disk Read/Sec


전체 I/O

- IO Read-Bytes

- IO Read-Bytes/Sec

- IO Read

- IO Read/Sec




:
Posted by 커널64
2016. 4. 4. 09:59

긴 URL 주소 짧게 줄이기 ETC2016. 4. 4. 09:59

긴 URL 주소 및 동영상 주소의 경우 엄청난 텍스트 길이를 요구했으나, 요즈음 아래와 같은 서비스가 되면서 주소들이 많이 짧아 졌습니다. 한 번 이용해보시면 좋을 듯 합니다.

https://goo.gl/



필요에 따라 자신이 원하는 주소를 만들 수 도 있다고 하네요. 응용한다면 매우 높은 가치의 정보를 만들수도 있겠죠?

 

줄여진 주소에 사용된 대소문자 주소는 모두 구분되야 한다는 것입니다. 한 글자만 바껴도 다른 곳으로 링크될 수 있습니다.

그리고 짧은 주소를 제공하는 쪽이 없어지게 될 경우, 짧아진 주소는 무용지물이 됩니다.




:
Posted by 알 수 없는 사용자
2016. 4. 2. 22:47

System Center 2012 R2 요구 사항 설치 Cloud2016. 4. 2. 22:47

System Center를 설치하다 보면 운영 체제 상의 요구 사항을 자동으로 설치해 주는 경우도 있지만 수동으로 설치해 주어야 하는 항목들도 있습니다. 아래는 Windows Server 2012 R2를 기준으로 일반적인 구성인 단일 서버에 모든 구성 요소를 설치하는 경우의 요구 사항을 설치하기 위해 필요한 PowerShell 명령어입니다.


PoC 또는 소규모 시스템에 대한 관리 인프라 구성 시 사용하시기 바랍니다.




공통 항목

.NET Framework 3.5 (Windows Server 2012 R2 설치 미디어가 D 드라이브에 있는 경우)

dism.exe /enable-feature /all /featurename:NetFX3 /online /Source:d:\sources\sxs /LimitAccess


NET Framework 4.6.1 (http://go.microsoft.com/fwlink/?LinkId=671744)



SCCM (Configuration Manager)

- 역할 및 기능

Install-WindowsFeature Web-Windows-Auth, Web-ISAPI-Ext, Web-Metabase, Web-WMI, BITS, RDC, NET-Framework-Features, Web-Asp-Net, Web-Asp-Net45, NET-HTTP-Activation, NET-Non-HTTP-Activ


- Windows 8.1 Update 용 Windows 평가 및 배포 키트(http://go.microsoft.com/fwlink/p/?LinkID=302319)

> 배포 도구, Windows 사전 설치 환경(Windows PE), 사용자 상태 마이그레이션 도구(USMT)



SCOM (Operations Manager)

- 역할 및 기능

Add-WindowsFeature Web-Server,Web-Request-Monitor,Web-Windows-Auth,Web-Asp-Net,Web-CGI,Web-Mgmt-Tools,NET-WCF-HTTP-Activation45,Web-Metabase


- Microsoft Report Viewer 2012 (http://go.microsoft.com/fwlink/?LinkId=327917)



SCAC (App Controller)

- 역할 및 기능

Add-WindowsFeature NET-Framework-Features,NET-Framework-Core,Web-Mgmt-Console,Web-Static-Content,Web-Default-Doc,Web-Http-Errors,Web-Http-Logging,Web-Request-Monitor,Web-Http-Tracing,Web-Stat-Compression,Web-Filtering,Web-Basic-Auth,Web-Windows-Auth,Web-ISAPI-Filter,Web-ISAPI-Ext,Web-Net-Ext,Web-Asp-Net45



SCO (Orchestrator)

- 역할 및 기능

Add-WindowsFeature Web-Server,Web-Log-Libraries,Web-Request-Monitor,Web-Http-Tracing,Web-Digest-Auth,Web-Windows-Auth,Web-Net-Ext,Web-Asp-Net,Web-CGI,Web-Mgmt-Tools,NET-WCF-HTTP-Activation45,NET-WCF-MSMQ-Activation45,NET-WCF-Pipe-Activation45,NET-WCF-TCP-Activation45,MSMQ,RDC,WAS



SCVMM (Virtual Machine Manager)

- Windows 8.1 Update 용 Windows 평가 및 배포 키트 (http://go.microsoft.com/fwlink/p/?LinkID=302319)

> 배포 도구, Windows PE(Windows 사전 설치 환경)





:
Posted by 커널64

기존 물리적인 서버를 가상화 환경으로 변환하는 P2V 작업은 서버 가상화 프로젝트를 하시면서 늘 있는 일입니다.


그런데, 몇몇 서버들의 경우 기본 설정이 BIOS가 아닌 UEFI로 설정되어 있어 담당자도 모르게 Windows 서버가 UEFI 모드에서 실행되고 있는 경우, MS에서 제공하는 MVMC는 P2V 작업 자체가 진행되지 않으며, disk2vhdVMware Converter를 통해 이미징을 해서 Hyper-V 환경으로 가져오더라도 부팅이 되지 않는 상황이 발생합니다.


참고: 노트북 BIOS 메뉴에서의 UEFI 설정 화면(서버의 경우에도 비슷한 메뉴가 있습니다.)



이러한 경우 다음과 같은 절차를 통해 UEFI 서버를 가상 환경으로 변환/마이그레이션 하실 수 있습니다.


1. 먼저 disk2vhd를 이용해 로컬 볼륨에 대한 이미징 작업을 진행합니다.

https://technet.microsoft.com/en-us/sysinternals/ee656415.aspx


2. 생성된 가상 디스크 파일(VHDX)을 마운트합니다.


3. AOMEI Partition Assistant 등의 파티션 도구를 이용해서 이미징 작업을 수행한 부트 볼륨에 대해

   - MBR 디스크로 변환하고,

   - EFI 파티션과 시스템 예약 파티션을 삭제한 후

   - 부트 파티션을 활성(Active)으로 설정합니다.


4. 일반적으로 위와 같은 작업을 진행한 후 1세대 VM으로 생성해 디스크를 연결하면 부팅이 됩니다.

만약, 위와 같이 진행 후 커서만 깜빡 거리고 부팅이 되지 않는다면 BCD를 재생성해야 합니다.


5. BCD 재생성은 Windows PE로 부팅하거나, Windows 설치 미디어로 부팅 후 복구 모드에서 명령 프롬프트를 실행한 후 다음 명령을 통해 진행합니다.

bootrec /fixmbr 

bootrec /fixboot 

bootrec /rebuildbcd







:
Posted by 커널64
2016. 4. 1. 12:13

AWS 서울 리전 신규 서비스 출시 소식 Cloud2016. 4. 1. 12:13

아마존 웹 서비스(AWS)에서 생각보다 빠르게 서울 리전에 대한 서비스를 추가해 나가고 있습니다.


AWS에서 발생하는 모든 변경 사항을 추적하고 로깅하는 서비스인 AWS Config를 이제 서울 리전에서도 사용할 수 있으며,

아직 도쿄 리전에서도 제공되지 않는 MS SQL의 RDS 서비스에 대한 Multi-AZ(이중화)를 지원합니다. (와우~!) 


그리고, AWS의 말을 빌리면 'MySQL과 완벽한 호환성을 제공하면서 5배의 성능을 제공한다'고 하는 Aurora RDS 서비스도 서울 리전에서 사용할 수 있게 되었습니다.



위에 언급한 서비스들은 지금 바로 사용이 가능합니다.




자세한 내용은 아래 링크를 참고하세요.



AWS Config, 서울 리전 출시!

https://aws.amazon.com/ko/blogs/korea/aws-config-launches-in-asia-pacific-seoul/


Amazon RDS for SQL Server, 다중-AZ 미러링 기능 서울 리전 지원!

https://aws.amazon.com/ko/blogs/korea/amazon-rds-for-sql-server-add-mirroring-support-seoul-region/


Amazon Aurora, 서울 리전 출시!

https://aws.amazon.com/ko/blogs/korea/amazon-aurora-now-available-in-seoul-region/



:
Posted by 커널64

HAProxy는 L4/L7 로드 밸런서 역할을 해주는 오픈 소스 소프트웨어입니다.

성능 또한 나쁘지 않기 때문에 물리적으로 로드 밸런서를 둘 수 없는 상황이라면 좋은 대안이 될 수 있을 것 같습니다.


저는 개인적으로 Linux 환경에 익숙하지 않은데, 저와 같은 분들을 위해 설치 절차를 정리해 공유합니다.


먼저, 테스트 시스템 환경은 다음과 같습니다.


- HAProxy VIP: 192.168.0.150

- HAProxy #1: 192.168.0.151

- HAProxy #2: 192.168.0.152


- Web Server #1: 192.168.0.153

- Web Server #2: 192.168.0.154



1. CentOS 7을 설치합니다. 저의 경우 최소 설치 모드로 설치한 후 SELINUX를 Disable 하였습니다.

vi /etc/sysconfig/selinux

SELINUX=disabled


2. 두 HAProxy 서버에 HAProxy와 keepalived 패키지를 설치합니다.

yum install -y haproxy keepalived


3. 먼저, keepalived를 설정하겠습니다. 원본 설정 파일을 복사해 새 설정 파일을 만듭니다.

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.origin


4. 텍스트 편집기로 /etc/keepalived/keepalived.conf 설정 파일을 엽니다.

vi /etc/keepalived/keepalived.conf


5. 메일 알림 관련 설정은 삭제합니다.

global_defs {

   notification_email {

   }

}


6. virtual_ipaddress 항목을 VIP로 설정하고, 아래의 나머지 설정들은 삭제합니다. MASTER 서버는 state MASTER, priority 200, BACKUP 서버는 state BACKUP, priority 100으로 설정합니다.

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 200

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.0.150

    }

}


7. 두 HAProxy 서버에서 keepalived를 실행합니다.

service keepalived start


8. 간단히 테스트를 위해 VIP로 ping으로 테스트해 본 결과 MASTER에서 BACKUP으로의 Failover 시에는 ping이 적게는 1개, 많게는 3개가 빠지는 것으로 확인되었으며, BACKUP에서 다시 MASTER로의 Failback 시에는 ping loss 없이 되는 것을 확인할 수 있었습니다.




여기까지는 HAProxy 서버에 대한 이중화를 위한 구성이었으며, 이제부터의 작업은 실제 로드 밸런싱을 처리하는 패키지인 HAProxy에 대한 설정을 설명합니다.


HTTP 및 TCP에 대한 로드 밸런싱이 가능하기 때문에 필요에 따라 여러 서비스(DB, Redis 등)에 대한 부하 분산 용도로 사용이 가능합니다만, 여기서는 일반적으로 웹 서버에 대한 부하 분산 설정으로 구성합니다.


또한, 단순히 HTTP 요청(TCP 80)을 Backend 서버로 전송하도록 설정하는 경우에는 웹 서비스마다 HAProxy를 두어야 하는 상황이 될 수 있기 때문에 요청 주소에 따라 분기하도록 하고, 쿠키를 사용한 Sticky Session 설정을 한 구성입니다.



9. 원본 파일은 복사해 둔 후 HAProxy 설정 파일을 텍스트 편집기로 엽니다.

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.origin

vi /etc/haproxy/haproxy.cfg


10. 아래는 호출한 도메인에 따라 두 대의 Backend 서버로 각각 분기하는 예제입니다. 

global

    log           127.0.0.1 local2

    chroot      /var/lib/haproxy

    pidfile       /var/run/haproxy.pid

    maxconn 100000

    user        haproxy

    group      haproxy

    daemon

    stats socket /var/lib/haproxy/stats


defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000


#-------- Custom Error Page

#    errorfile 400 /etc/haproxy/errors/400.html

#    errorfile 403 /etc/haproxy/errors/403.html

#    errorfile 408 /etc/haproxy/errors/408.html

#    errorfile 500 /etc/haproxy/errors/500.html

#    errorfile 502 /etc/haproxy/errors/502.html

#    errorfile 503 /etc/haproxy/errors/503.html

#    errorfile 504 /etc/haproxy/errors/504.html



#------- Main Frontend

frontend   http *:80

#-- redirect http to https     

#   redirect scheme https if !{ ssl_fc }

    acl host_name1 hdr(host) -i naver.com www.naver.com

    acl host_name2 hdr(host) -i daum.net www.daum.net


    use_backend webfarm1 if host_name1

    use_backend webfarm2 if host_name2


#------- Web Farm #1

backend webfarm1

    mode http

    balance roundrobin

    option httpchk GET / HTTP/1.0

    option log-health-checks

    option forwardfor

    option httpclose

    cookie SERVERID insert indirect nocache

    stats enable

    stats uri /haproxy

    server node1 192.168.0.153:8081 cookie node1 check inter 1000 rise 3 fall 3

    server node2 192.168.0.154:8081 cookie node2 check inter 1000 rise 3 fall 3


#------- Web Farm #2

backend webfarm2

    mode http

    balance roundrobin

    option httpchk GET / HTTP/1.0

    option log-health-checks

    option forwardfor

    option httpclose

    cookie SERVERID insert indirect nocache

    stats enable

    stats uri /haproxy

    server node1 192.168.0.153:8082 cookie node1 check inter 1000 rise 3 fall 3

    server node2 192.168.0.154:8082 cookie node2 check inter 1000 rise 3 fall 3


11. 구성 파일을 저장한후 각각의 HAProxy 서버에서 서비스를 시작 후 정상적으로 시작되었는지 확인합니다.

service haproxy start

systemctl status -l haproxy.service

12. 부팅 시 각각의 서비스가 시작되도록 설정합니다.

systemctl enable keepalived

systemctl enable haproxy


13. 이제 테스트를 위해 Windows 클라이언트에서 HOSTS 파일에 daum.net과 naver.com에 대한 IP 주소를 HAProxy의 VIP로 설정한 후 테스트해 정상적으로 부하분산이 되는 것을 확인하였습니다. Fiddler로 요청을 확인해 보면 아래와 같이 Cookie 정보를 받아오는 것을 확인할 수 있습니다.



14. 설정에 따라 /haproxy 페이지로 이동하면 전체적인 노드 응답 상태, 요청 수 등의 상황을 확인할 수 있습니다.




전체 설정 옵션은 아래 링크를 참고하세요.

http://cbonte.github.io/haproxy-dconv/configuration-1.5.html




HAProxy_cfg_L4_PortOnly.txt


HAProxy_cfg_L7_Hostname.txt








:
Posted by 커널64
2016. 3. 29. 20:24

AWS Auto Scaling의 기본 Termination 정책 Cloud2016. 3. 29. 20:24

AWS의 서비스 중 부하에 따라 L4 하단 노드(서버)를 자동으로 증가(Scale out) 또는 축소(Scale in) 시키는 Auto Scaling이라는 좋은 기능이 있습니다. 그런데, Scale in 발생 시 어느 노드를 선택해 중지(Termination) 시킬까요?




기본적으로, 가용성을 최우선 순위로 하며, 순서적으로 정리하면 다음과 같습니다.

Scale-in 이 발생할 때의 순서이며, 해당하는 EC2 인스턴스가 하나이면 종료됩니다.


1) 다중 가용존(Muliple AZ) 구성의 경우, EC2 인스턴스가 가장 많은 AZ 선택

2) 가장 오래된 Launch Configuration으로 구동된 EC2 인스턴스(들) 선택

3) 구동 시간 기준으로 다음 과금 시간에 가장 가까운 EC2 인스턴스(들) 선택

4) 위 과정을 거쳤으나 선택된, 해당되는 EC2 인스턴스가 여러 개일 경우 무작위 선택




:
Posted by 커널64

On-premise의 AD를 원본으로 두고 Azure AD Connect(구. DirSync)를 통해 Office 365를 사용하고 있는 경우, Office 365 상의 계정 정보는 Read-Only가 되므로, 계정 설정에 대한 변경 작업의 상당수는 동작하지 않습니다.


예를 들어, 다음과 같이 특정 계정 또는 그룹 계정을 '주소 목록에서 숨김' 기능을 사용하려고 하면 오류가 발생합니다.


한글

'OOOO' 개체는 온-프레미스에서 동기화되고 있으므로 작업 'Set-DistributionGroup', 'HiddenFromAddressListsEnabled'은(는) 해당 개체에서 수행할 수 없습니다. 이 작업은 온-프레미스 조직의 개체에 대해 수행해서는 안 됩니다.


영문

The action 'Set-DistributionGroup', 'HiddenFromAddressListsEnabled', can't be performed on the object 'OOOO' because the object is being synchronized from your on-premises organization. This action should be performed on the object in your on-premises organization.



이러한 경우, On-Premise AD에 대한 속성 MsExchHideFromAddressLists 값을 TRUE로 설정한 후 동기화되도록 해야 합니다.


그런데, 현재 On-premise 환경에는 Exchange 인프라가 없는 상태입니다.

그렇기 때문에 MsExchHideFromAddressLists 속성 자체가 없는 상태입니다.


이와 같이 현재 On-premise에 Exchange 인프라가 없는 경우 다음 절차를 참고해 진행합니다.



1. Exchange Server의 설치 미디어를 준비합니다. 체험판도 상관없습니다.

http://www.microsoft.com/download/en/details.aspx?id=21570


2. 압축을 해제하고 Enterprise Admins 및 Schema Admins 구성원 계정으로 다음 명령을 실행하고 기다립니다.

Setup /PrepareSchema


3. 명령이 정상적으로 수행된 것을 확인한 후 ADSI 편집기 또는 ADUC의 View -> Advanced Features 체크 후 계정의 속성 창을 열어 속성 편집기 탭에서 필요한 속성을 수정하실 수 있습니다.




:
Posted by 커널64