시스템 요구사항

macchina.io는 리눅스와 OS X 시스템에 설치할 수 있다. 리눅스에서는 임베디드 리눅스 타겟을 위한 크로스 컴파일이 제공된다.

첫번째 단계는 데스크탑 리눅스 또는 OS X 시스템에 macchina.io를 빌드하고 설치하는 것을 권장한다. 몇분내에 설치하고 구동이 될 것이다. 또한 라즈베리 파이나 Tinkerforge RED 블릭과 같은 시스템에도 macchina.io를 빌드 할 수 있지만, 몇시간의 시간이 소요될 것이다. 임베디드 리눅스 타켓을 위해 macchina.io를 크로스 컴파일 할 수도 있지만, 모든것이 동작하게 만들기 위해서 많은 다른 단계들을 필요로 한다.

macchina.io 얻기

macchina.io은 GitHub에서 macchina.io 저장소를 clone하여 획득할 수 있다. macchina.io GitHub 릴리즈 페이지에서 .zip이나 .tar.gz 포맷의 릴리즈 아카이브를 다운로드 할 수도 있다.

macchina.io GitHub 저장소를 clone하기 위해서 아래를 수행한다:

$ git clone https://github.com/macchina-io/macchina.io.git

가장 최근의 안전화릴리즈의 master 브랜치를 check out하기를 원할 것이다:

$ cd macchina.io

$ git checkout master

macchina.io 빌드 하기

사전준비

macchina.io는 GNU Make 기반의 POCO C++ 라이브러리로 부터의 빌드 시스템을 사용한다. GNU C++ 컴파일러(4.4 버전 이상 요구) 또는 Clang의 가장 최근의 버전이 필요하다. OpenSSL 헤더와 라이브러리가 설치되어 있어야 한다. 예를 들어:

우분투 에서는: sudo apt-get install libssl-dev

OS X 에서는: Homebrew를 통해: brew install openssl

더욱이, V8 라이브러리를 빌드하기 위해서 파이썬이 필요하다.

macchina.io 컴파일 하기

macchina.io를 빌드하기 위해서, macchina.io 소스 디렉토리의 최상위에서 간단하게 GNU Make를 호출한다. 충분한 메모리를 갖춘 멀티코어 시스템에서 병렬로 빌드를 하기를 원하면 -j 옵션을 사용하면 된다.

$ make -s -j8

이 명령어는 디버그와 릴리즈 빌드 구성 모두에서 빌드가 될 것이다. 속도를 향상시키기 위해서, 릴리즈 구성으로만 빌드 하기를 원한다면:

$ make -s -j8 DEFAULT_TARGET=shared_release

일반적인 데스크탑 또는 노트북에서 macchina.io를 빌드하는데 약 10~15분이 걸린다. 라즈베리 파이 또는 Tinkerforge RED 블릭과 같은 시스템에서 빌드한다면, macchina.io 빌드는 몇시간이 걸린다. 이러한 시스템에서 명령 빌드(-j8)을 시도하지 마시라. 게다가, 빌드를 하는 동안 메모리 부족을 격게 된다. 특히, V8 라이브러리를 빌드하는 동안에. 불필요한 프로세스들을 모두 중단하고, 충분한 가용 메모리를 갖추고 타켓 빌드와 make를 재수행하길 권한다. 데스크탑 시스템에서 크로스 컴파하고, 타겟 시스템에 바이너리를 전송하는것이 낫다.

macchina.io 크로스 컴파일 하기

<생략>

macchina.io 실행하기

macchina.io 빌그가 완료된 이후에, 추가적인 과정없이 macchina.io를 직접 실행 할 수 있다. macchina.io 서버를 실행하기 위해서:

  1. macchina.io 라이브러리를 포함시키기 위해서 시스템의 공유 라이브러리 검색 경로를 설정한다.
  2. macchina.io 서버 프로그램을 실핸한다.

리눅스 시스템에서 macchina.io를 실행하기 위해서:

$ export LD_LIBRARY_PATH=/path/to/macchina.io/platform/lib/Linux/x86_64
$ cd /path/to/macchina.io/server
$ bin/Linux/x86_64/macchina

OS X 시스템에서 macchina.io를 실행하기 위해서:

$ export DYLD_LIBRARY_PATH=/path/to/macchina.io/platform/lib/Darwin/x86_64
$ cd /path/to/macchina.io/server
$ bin/Darwin/x86_64/macchina

노트: macchina.io의 구성 파일 macchina.properties 가 서버가 실행되어질 같은 디렉토리에 위치하지 않거나, 이것의 부모 디렉토리내에 있지 않으면, 서버가 시작할 때 구성 파일을 path에 명시해줄 필요가 있다:

$ bin/Darwin/x86_64/macchina --config=/path/to/macchina.properties

macchina.io 서버가 시작한(느린 시스템에서는 수 초가 소요됨) 다음 웹 브라우저를 http://localhost:22080으로 입력한다. macchina.io 로그인 화면을 보게될 것이다. 사용자명 "admin"과 암호 "admin"으로 로그인 한다. 성공적으로 로그인하면, 웹 인터페이스의 Launcher 페이지를 보게 된다. 웹 사용자 인터페이스에서 다른 웹 앱을 사용해보고 스스로 익숙해 지도록 한다.

macchina.io의 기본 구성은 온도와 주변 광 센서를 포함하여 다양한 센서들의 시뮬레이션을 가능하게 한다. 여러분의 코드에 어떠한 실제 연결된 센서들을 사용하는 것처럼 이러한 시뮬레이트된 센서들을 사용할 수 있다. 가능한 센서와 그들의 현재 측정값은 "Sensor & Devices" 앱에서 볼 수 있다.

macchina.io를 최대한 활용하기 위해, 실제 센서들을 얻기를 원할 것이다. macchina.io의 개발자 미리보기 릴리즈에서, 오직 일부 Tinkerforge 센서만 지원된다. 좀더 많은 센서와 디바이스는 향후 릴리즈에서 지원될 것이다. macchina.io SDK에 익숙해 지면, 물론 여러분만의 센서 타입을 구현하길 원할 것이다.

첫번째 나만의 자바스크립트 프로그램 작성하기

macchina.io에서 실행되는 첫번째로 자바스크립트 프로그램을 작성하기 위해서, "Playground" 앱을 열어라. Playground는 편리한 문서 편집기를 이용하여, 브라우저에서 직접 자바스크림트 프로그램을 만들고 수정하는 것을 허용한다.

macchina.io Playground, 자바스크립트 에디터

센서 데이터 얻기

Playfround는 "Hello, world!" 프로그램의 macchina.io variant로 pre-loaded되어 있다. 온도 센서를 발견하고, 센서로부터 현재 온도를 얻는 작은 프로그램. 이 프로그램은 참조를 위해 아래에 소개한다(?).

//
// Playground Sample Script
//
// This script will look for a temperature sensor and, if found,
// output the current temperature.
//
// Feel free to modify this script as you like to try out
// macchina.io features.
//

// Search for temperature sensors in the Service Registry
var temperatureRefs = serviceRegistry.find('io.macchina.physicalQuantity == "temperature"');
if (temperatureRefs.length > 0)
{
    // Found at least one temperature sensor entry in the registry.
    // Resolve the first one.
    var temperatureSensor = temperatureRefs[0].instance();
    // Get current temperature.
    var temperature = temperatureSensor.value();
    logger.information('Current temperature: ' + temperature);
}
else
{
    logger.error('No temperature sensor found.');
}

이 프로그램은 2자리를 보여준다:

  1. 서비스 레지스트리로부터 센서 서비스 오브젝트를 얻는 방법
  2. logging 출력을 작성하는 방법

시스템에서 사용가능한 센서를 검색하기 위해서, macchina.io 서비스 레지스트리를 사용한다. macchina.io에서 제공하는 모든 센서와 디바이스들은 그 레지스트리응 통해 서비스 오브젝트로써 항상 이용가능할 것이다. 특정 오브젝트를 찾기 위해서, 서비스 레지스트리는 그들의 속성에 기초한 서비스들을 찾는 간단한 쿼리 표현 언어를 지원한다. 위의 예제에서, 우리는 특별히 온도 센서를 찾는다. mcachina.io에서 센서들은 항상 io.macchina.physicalQuantity라는 이름의 속성을 갖는다. 이것은 특정 물리적인 양을 측정하는 센서들을 검색하기 위해 사용할 수 있다. find 메소드는 서비스 레퍼런스의 배열로 리턴할 것이다. 서비스 레퍼런스들은 실제 서비스 오브젝트와는 다르다. 그들의 목적은 실제 서비스 오브젝트로의 레퍼런스로써 서비스 프로퍼티들(io.macchina.physicalQuantity에서 언근된 것처럼)을 저장하기 위함이다. 실제 서비스 오브젝트는 샘플에서와 같이 instance() 함수를 호출함으로써 획득된다.

한번 온도 센서 오브젝트를 얻으면, value() 함수를 호출해서 현재 값을 얻기 위해서 이것을 사용할 수 있다.

Playground 앱에서 편집기 위의 "Run" 버튼을 클릭해서 프로그램을 실행 할 수 있다. 이것을 수행하고 macchina 서버의 logging 출력을 관찰한다. 다음과 같은 출력을 얻을 것이다:

2015-03-07 13:12:31.630 [Information] osp.core.BundleLoader<2>: Bundle io.macchina.webui.playground.sandbox started
2015-03-07 13:12:31.630 [Information] osp.bundle.com.appinf.osp.js<2>: Starting script sandbox.js from bundle io.macchina.webui.playground.sandbox.
2015-03-07 13:12:31.631 [Information] osp.web.access<2>: POST /macchina/playground/run.json HTTP/1.1
2015-03-07 13:12:31.688 [Information] osp.bundle.io.macchina.webui.playground.sandbox<28>: Current temperature: 26.999999999999975

센서 데이터를 주기적으로 Query하기

다음 단계로 프로그램을 수정할 것이고, 그래서 현재 온도를 주기적으로 출력하게 될 것이다. 타이머를 설정해서 이것을 수행한다. 여기 수정된 코드가 있다:

var temperatureRefs = serviceRegistry.find('io.macchina.physicalQuantity == "temperature"');
if (temperatureRefs.length > 0)
{
    var temperatureSensor = temperatureRefs[0].instance();
    logger.information('Found temperature sensor.');
    setInterval(
        function() {
            logger.information('Current temperature: ' + temperatureSensor.value());
        },
        1000
    );
}
else
{
    logger.error('No temperature sensor found.');
}

편집기에서 위의코드로 코드를 교체하고 Restart 버튼을 클릭하라. 매초마다 출력되는 온도를 보게될 것이다.

센서 이벤트 다루기

마지막 단계로 우리는 변화가 있을 때 온도를 출력할 것이다. 이러한 목적을 위해, 센서 오브젝트는 콜백 함수를 bind할 수 있는 이벤트를 제공한다. 센서가 값을 변경할 때면, 콜백 함수는 호출되고, 현재 온도는 log에 쓰여질 것이다.

var temperatureRefs = serviceRegistry.find('io.macchina.physicalQuantity == "temperature"');
if (temperatureRefs.length > 0)
{
    var temperatureSensor = temperatureRefs[0].instance();
    temperatureSensor.on('valueChanged', 
        function(event) {
            logger.information('Temperature changed: ' + event.data);
        }
    );
}
else
{
    logger.error('No temperature sensor found.');
}

MQTT를 사용해서 센서 데이터 보내기

이제 MQTT 프로콜을 사용해서 서버로 인터넷을 통해 센서 데이터를 보내는 예제로 확장하자. Eclipse 재단에 의해서 제공되는 MQTT sandbox 서버를 사용할 것이며, 이것은 이미 macchina.io 구성 파일에 이미 설정되어 있다. 타이머를 사용해서 예제를 리턴할 것이고 매 10초마다 현재 온도를 전송하도록 수정할 것이다.

var temperatureSensor;
var temperatureRefs = serviceRegistry.find('io.macchina.physicalQuantity == "temperature"');
if (temperatureRefs.length > 0)
{
    logger.information('Temperature sensor found.');
    temperatureSensor = temperatureRefs[0].instance();
}
else
{
    logger.error('No temperature sensor found.');
}

var mqttClientRefs = serviceRegistry.find('io.macchina.mqtt.serverURI != ""');
if (mqttClientRefs.length > 0)
{
    logger.information("MQTT Client found.");

    var mqttClient;
    mqttClient = mqttClientRefs[0].instance();

    setInterval(
        function () {
            var payload = JSON.stringify(temperatureSensor.value());
            logger.information('Sending temperature: ' + payload);
            // Send payload using QoS 0
            mqttClient.publish('macchina-io/samples/temperature', payload, 0);
        },
        10000
    );
}
else
{
    logger.error('No MQTT Client found.');
}

MQTT 클라이언트는 서비스 레지스트리로부터 사용가능한 다른 서비스이다. 우리는 io.macchina.mqtt.serverURI 속성을 찾는것으로 이것을 발견할 수 있다. 이 속성값에 기반하여, 우리는 특정 클라이언트를 찾을 수 있다.

HTTP 웹 서비스

이 튜토리얼의 마지막 예제로, 우리는 자바스크립트로 부터 어떻게 HTTP 기반 웹 서비스를 invoke하는지 보여줄 것이다. 만약, 온도가 특정 제한을 넘어선다면, 우리는 Twilio를 사용해서 SMS 메시지를 전송할 것이다. 이러한 작업을 하기위한(?) 당신은 SMS 메시지를 전송하기 위해서는 Twilio 계정이 필요하다.

var net = require('net');

function sendSMS(message)
{
    var username = application.config.getString('twilio.username');
    var password = application.config.getString('twilio.password');
    var from = application.config.getString('twilio.from');
    var to = application.config.getString('twilio.to');

    var twilioHttpRequest = new net.HTTPRequest('POST', 'https://api.twilio.com/2010-04-01/Accounts/' + username + '/SMS/Messages');
    twilioHttpRequest.authenticate(username, password);
    twilioHttpRequest.contentType = 'application/x-www-form-urlencoded';
    twilioHttpRequest.content = 
        'From=' + encodeURIComponent(from) + 
        '&To=' + encodeURIComponent(to) + 
        '&Body=' + encodeURIComponent(message);

    var response = twilioHttpRequest.send(function(result) {
        logger.information('SMS sent with HTTP status: ' + result.response.status);
        logger.information(result.response.content);
    });
}

var smsSent = false;

var temperatureRefs = serviceRegistry.find('io.macchina.physicalQuantity == "temperature"');
if (temperatureRefs.length > 0)
{
    var temperatureSensor = temperatureRefs[0].instance();
    temperatureSensor.on('valueChanged', 
        function(event) {
            logger.information('Temperature changed: ' + event.data);
            if (event.data > 30 && !smsSent)
            {
                logger.warning('Temperature limit exceeded. Sending SMS.');
                sendSMS('Temperature limit exceeded!');
                smsSent = true;
            }
        }
    );
}
else
{
    logger.error('No temperature sensor found.');
}

새로운 코드는 snedSMS() 함수에 있다. 우리는 macchina.properties 구성 파일로부터 구성 설정을 접근하기 위해서 application.config 오브젝트를 사용한다. 동작시키기 위해 이 예제에서는 구성 파일에 다음 라인을 추가할 필요가 있다:

twilio.username = <your_twilio_account_sid>
twilio.password = <your_twilio_auth_token>
twilio.from = <your_twilio_outgoing_phone_number>
twilio.to = <recipient_phone_number>

물론 당신은 당신의 Twilio 계정으로 부터 적절한 값들과 함께 placeholders(<yourtwilio_account_sid> 등)을 교체할 필요가 있다. Twilio API로 HTTPS POST 리퀘스트를 전송하기 위해 net 모듈로부터의 TTPSHTTPRequest class를 사용한다. HTTPS 리퀘스트는 비동기적으로 전달된다. 우리는 send() 함수를 제공하는 콜백 함수를 통해 결과를 통지 받게 될것이다.

macchina.io 0.7.0

Copyright © 2017,

Applied Informatics Software Engineering GmbH

(CC BY 3.0)

results matching ""

    No results matching ""