2016년 3월 30일 수요일

[Arduino] 거리측정센서와 OLED 이용하기.


[Arduino] 거리측정센서와 OLED 이용하기.



Arduino 실습으로 아래와 같은 내용으로 실습해 보았다.


1. 개요

초음파 거리 측정 센서에서 측정한 거리값을 아두이노로 받고, 이를 OLED 모듈에 출력한다.


2. 구성요소


  • WiDo(Arduino Leonardo + Adafruit Wi-Fi)
  • HC-SR04 (초음파 거리 측정 센서)
  • 128x64 OLED (OLED 디스플레이)

3. 필요한 라이브러리

OLED를 사용하기 위한 라이브러리가 필요하다.

4. Pin Mapping

(1) HS-SR04(초음파거리센서)
ArduinoHC-SR04
5VVcc
D2Trig
D3Echo
GNDGnd

(2) 128x64 OLED (OLED 디스플레이)
ArduinoOLED
D9Data
D10Clk
D11DC
D13Rst
D12CS
-3v3
5VVin
GNDGnd


5. 소스코드

(!주의!) 아래 코드는 128x64 OLED에서 SPI방식으로 연결한 예이다!! I2C방식이나 128x32 OLED의 예제는 라이브러리의 예제에 있으니 거기를 참고하길 바랍니다!!!
https://github.com/ChanMinPark/makeup/blob/master/007_Distance-OLED_Arduino/Arduino_code/pcmOLED.ino

6. 구성한 모습


2016년 3월 29일 화요일

[JAVA] Java에서 CoAP Client 구현하기.(Californium 라이브러리 이용)


[JAVA] Java에서 CoAP Client 구현하기.(Californium 라이브러리 이용)




Java에서 CoAP을 구현하기 위해서 라이브러리를 가져와야하는데 가장 널리 이용되는 것이 Californium 라이브러리인 것 같다.

다양한 CoAP 라이브러리들을 아래 링크에서 확인 할 수 있다.
http://coap.technology/impls.html
Constrained devices, Server-side, Browser-based 등의 분류별로 라이브러리가 소개된다.


Californium은 Server-side에서 Java로 구현된 라이브러리라고는 하지만 Client도 구현되어 있다.
Californium은 Github에서 소스를 공개하고 있다.
https://github.com/eclipse/californium

최신 버전 확인은 MVN Repository 사이트가 어떤 라이브러리든 좋은거 같다.
http://mvnrepository.com/artifact/org.eclipse.californium/californium-core


Java에서 Californium 라이브러리 사용하는 방법

[1] 우선 Java에서 Californium을 이용하기 위해서는 Maven에서 dependency를 설정해줘야 한다.
(Maven 설치 및 Eclipse 연동은 다른 좋은 글들이 많으니 구글에서 찾아보자. 간편하게는 STS(Spring Tool Suite)을 사용해도 된다.)

아래의 설정을 프로젝트의 pom.xml에 추가 한다.( 점은 삭제한다. 다른 내용이 있을 수 있다는 표시인 것이므로... )

 <dependencies>
    ...
    <dependency>
            <groupId>org.eclipse.californium</groupId>
            <artifactId>californium-core</artifactId>
            <version>1.0.3</version>
    </dependency>
    ...
  </dependencies>
  ...
  <repositories>
    ...
    <repository>
      <id>repo.eclipse.org</id>
      <name>Californium Repository</name>
      <url>https://repo.eclipse.org/content/repositories/californium/</url>
    </repository>
    ...
  </repositories>


[2] 이제, Californium 라이브러리를 사용할 수 있다. 아래는 CoAP 서버로 부터 시간정보를 반환 받는 Client 예제이다.

import org.eclipse.californium.core.CoapClient;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello! This is CoAP Sample Application." );

        CoapClient client = new CoapClient("coap://californium.eclipse.org:5683/obs");

        if(!client.ping()){
            System.out.println("Server is down. Terminate program.");
            return;
        }

        System.out.println("Request Get mothod of CoAP.");
        String content1 = client.get().getResponseText();
        System.out.println("Response : " + content1);
    }
}



2016년 3월 28일 월요일

[Arduino] WiDo에서 MQTT 메세지 Publish하기.


[Arduino] WiDo에서 MQTT 메세지 Publish하기.




IoT에서 센싱을 담당하는 기기들은 주로 사양이 낮다.
그래서 메세지를 주고 받는 통신에서도 HTTP와 같은 프로토콜이 버거울 수 있다고 한다.
그래서 IoT 기기들을 위한 메세지 프로토콜로 CoAP과 MQTT가 발전하고 있다.

이번 포스팅에서는 WiDo(Arduino Leonardo + WiFi)를 이용한 MQTT 메세지를 보내는 방법을 설명해본다. (사실 혼자 정리해보는 것에 가깝다.)
(WiDo 사이트: http://www.dfrobot.com/index.php?route=product/product&product_id=1159#.VvnI3OKLSUk)


MQTT를 실습하기 전에 이론을 조금 아는 것이 좋다.

우선, MQTT메세지는 Topic과 Data로 이루어진다.
노드들은 Data를 Topic으로 식별한다.
아래 그림에서 예를 들면, temperature가 Topic이 되고 온도값이 Data가 된다.

MQTT의 통신 구성은 노드와 브로커(서버)로 이루어진다.
노드들은 메세지를 보내거나 받는다. 보내는 것을 Publish라고 하고, 받는 것을 Subscribe라고 한다. 여기서 노드들이 보내고 받을 때는 노드들 간에 1대1 연결이 아니다. 노드들의 메세지는 무조건 브로커(서버)를 통한다.
노드가 Publish를 하는 것도 브로커로 하는 것이고, 노드가 Subscribe를 하는 것도 브로커로 부터 받아 오는 것이다.

(출처:http://arsviator.blogspot.kr/2015/03/mqttmessage-queue-telemetry-transport.html)

Publish와 Subscribe의 과정은 아래와 같다.
(1) 수신노드에서 Subscribe하기 위한 연결을 만들어 놓는다. 이것의 의미는 특정 브로커(서버)에게 "내가 원하는 Topic을 가진 Data가 들어오면 나한테 보내줘~"라는 것이다.
(2) 송신노드는 Data를 전송할 필요가 있을 때마다 Topic을 지정해서 브로커에게 Publish한다.
(3) 브로커는 새로 받은 Data의 Topic을 확인하고 이를 Subscribe하는 모든 노드에게 보내준다.



이제 실습을 정리해본다.

1. 실습 과정
  (1) MQTT 서버 준비
    나는 오픈소스인 Mosquitto를 이용했다.
    (다운로드 : http://mosquitto.org/download/)
    링크에서 'Binary Installation'에 있는 설치파일을 다운 받는다.
    설치의 전반적인 과정은 아래 링크를 참고하면 좋다. 아래는 주의 사항만 적어본다.
    (http://midnightcow.tistory.com/category/MQTT)
   
    나는 윈도우7이어서 'mosquitto-1.4.8-install-win32.exe'를 다운 받았다.
    설치할 때 주의 사항이 2가지 있다.
    첫 번째는 아래 그림처럼 나오는 화면에서 지시사항을 따라줘야 한다는 것이다.


    OpenSSL에 대한 링크는 다운받아서 설치하면 되고, 두번째 링크는 바로 dll파일을 받기만 하면 된다.
    단, OpenSSL 설치 시에도 아래 그림처럼 dll 복사 위치를 bin 폴더에 하는 것이 좋다.
    왜냐하면 OpenSSL을 설치하면서 생기는 dll파일을 Mosquitto 폴더에 옮겨줘야 하기 때문에 dll파일이 뭐가 어디에 있는지 알아야하기 때문이다.



  (2) Publish 할 노드 준비
    서버를 준비했으니, Publish할 노드와 Subscribe할 노드를 만들어야 하는데 여기서는 Subscribe는 mosquitto에서 제공하는 프로그램을 이용하고, 나는 WiDo를 이용해서 Publish하는 노드를 만들어 본다.

    WiDo는 Adafruit WiFi 모듈을 이용한다. 그래서 대중적인 MQTT for Arduino 모듈인 knolleary의 MQTT Client 모듈을 사용하기 힘들다.
    다행히 Adafruit를 위한 MQTT 모듈이 있다. Github에서 zip으로 다운받아서 'cc3000_PubSubClient' 폴더를 Arduino설치 폴더의 libraries 폴더에 복사한다.

    예제 소스는 아래 링크에서 확인할 수 있다.
    (https://github.com/ChanMinPark/makeup/blob/master/002_NFC_Door/MQTT_example_for_Arduino/MQTTpcm.ino)
    wifi ssid와 password를 설정하고 브로커의 ip주소를 설정해주고 setup()과 loop()부분을 자신에게 필요한 기능으로 구현하면 된다.

2016년 3월 21일 월요일

[JAVA] Java에서 Json객체 사용하기(Gson 사용)


[JAVA] Java에서 Json객체 사용하기(Gson 사용)




Java에서 Json 객체를 사용하기 위한 방법은 4가지가 있다고 한다.
(출처 : http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/)

저번에 올린 Json Parsing 포스트에서는 Json-simple을 사용한 경우였다.
(저번 포스트 : http://walkinpcm.blogspot.kr/2016/03/java-json-json-parsing.html)

이번에는 또 다른 Java의 Json 라이브러리인 Gson을 사용하는 방법을 정리해본다.
Gson은 구글에서 만든 라이브러리이다.
(참고. Gson docs : http://google.github.io/gson/apidocs/)

본 방법은 이클립스에서 Gson 라이브러리를 추가하여 Java에서 Json 객체를 사용하는 것이다.

(1) 아래 사진 처럼 링크를 따라가서 Gson라이브러리를 다운받는다.
(다운로드 링크 : https://github.com/google/gson)





(2) 이클립스에서, Gson 라이브러리를 추가할 프로젝트에서 우클릭!
    맨 아래 'Properties'를 클릭한다.



































(3) 왼쪽 항목에서 'Java Build Path'를 선택하고 오른쪽 'Libraries' 탭에서 'Add External JARs'를 클릭한다. 여기서 아까 다운받은 Gson 라이브러리 파일을 선택해준다.




(4) 새로 추가된 것을 확인하고 아래 'Apply'와 'OK'를 차례대로 클릭한다.






이 과정을 마치면 프로젝트에 Gson 라이브러리가 추가된다.
예제코드는 저번에 포스팅한 Json-simple을 이용한 Json Parsing 글을 보면 있는데
(저번 포스트 : http://walkinpcm.blogspot.kr/2016/03/java-json-json-parsing.html)
Json-simple과 Gson의 차이점은 simple에서는 'JSON'으로 대문자로 쓰고 Gson에서는 'Json'으로 앞글자만 대문자로 쓴다.
(ex. Json-simple > JSONParser jparser = new JSONParser();)
(ex. Gson > JsonParser jparser = new JsonParser();)

2016년 3월 18일 금요일

[JAVA] Open 날씨 API

[JAVA] Open 날씨 API

(참고 site : http://yooic.tistory.com/43 , 감사합니다.)
날씨 정보를 획득할 수 있는 OpenAPI가 있다.
http://openweathermap.org/
프로그램에서 날씨 정보를 쉽게 얻을 수 있다.
하지만 완전 무료는 아니다.
분당 60건의 조회는 무료로 사용할 수 있는데, 그 이상의 조회를 가능하게 하려면 돈을 지불해야 한다.
금액은 아래에서 확인가능하다.
http://openweathermap.org/price
아! 비쌀수록 더 많은 API를 제공한다.

도시 이름, zip code, GPS로 지역을 선택해서 해당 지역의 날씨 정보를 획득 할 수 있는데,
나는 GPS정보를 이용했다.

예제로 서울시청(위도 37.566386, 경도 126.977948)을 이용해보겠다.
날씨정보를 가져오는 방법은 RESTapi를 call하는 것 같다.

예제코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class WeatherByGPSApplication {
    public static void main(String[] args) {
        try{
            //서울시청의 위도와 경도
            String lon = "126.977948";  //경도
            String lat = "37.566386";   //위도

            //OpenAPI call하는 URL
            String urlstr = "http://api.openweathermap.org/data/2.5/weather?"
                        + "lat="+lat+"&lon="+lon
                        +"&appid=본인의키를넣으세요";
            URL url = new URL(urlstr);
            BufferedReader bf;
            String line;
            String result="";

            //날씨 정보를 받아온다.
            bf = new BufferedReader(new InputStreamReader(url.openStream()));

            //버퍼에 있는 정보를 문자열로 변환.
            while((line=bf.readLine())!=null){
                result=result.concat(line);
                //System.out.println(line);
            }

            //문자열을 JSON으로 파싱
            JSONParser jsonParser = new JSONParser();
            JSONObject jsonObj = (JSONObject) jsonParser.parse(result);

            //지역 출력
            System.out.println("지역 : " + jsonObj.get("name"));

            //날씨 출력
            JSONArray weatherArray = (JSONArray) jsonObj.get("weather");
            JSONObject obj = (JSONObject) weatherArray.get(0);
            System.out.println("날씨 : "+obj.get("main"));

            //온도 출력(절대온도라서 변환 필요)
            JSONObject mainArray = (JSONObject) jsonObj.get("main");
            double ktemp = Double.parseDouble(mainArray.get("temp").toString());
            double temp = ktemp-273.15;
            System.out.printf("온도 : %.2f\n",temp);

            bf.close();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}

실행결과
지역 : Seoul
날씨 : Clear
온도 : 17.57

[JAVA] json형식의 문자열을 json객체로 parsing하기

[JAVA] json형식의 문자열을 json객체로 parsing하기




웹 등에서 문자열을 리턴 받는데 이게 JSON 형식이면 프로그램에서 훨씬 처리하기 좋다.
문자열을 그대로 이용하면 split으로 문자열을 쪼개는 과정이 필요한데 반해, JSON형식이면 사용성이 좋아진다.

java에서 json을 다루는 라이브러리가 몇몇 있는데 이 글에서는 json-simple 라이브러리를 사용해보려 한다.
(gson 라이브러리도 있는데 이는 https://walkinpcm.blogspot.kr/2016/03/java-java-json-gson.html 에서 정리하였다.)

java에서 json-simple을 사용하기 위해서는 먼저, json-simple 라이브러리를 다운받아서 build path에 추가시켜 줘야한다.

아래 링크에서 json-simple 라이브러리를 다운 받는다.
https://code.google.com/archive/p/json-simple/downloads
맨 위의 최신버전을 받으면 될 듯하다.

다음으로 다운받은 라이브러리를 이클립스에서 생성한 프로젝트의 build path에 추가시켜 준다.
순서는 다음과 같다.
프로젝트 이름에서 우클릭->Properties->왼쪽에서 'Java Build Path'클릭
-> 오른쪽 상단 탭에서 'Libraries' 클릭 -> 'Add External JARs...'클릭
-> 다운받은 json 라이브러리 선택 -> 하단 'Apply'클릭 -> 'OK' 클릭

이제 json 라이브러리를 이용한 코드를 작성하면 된다.
예제는 아래와 같다.
json형식의 문자열을 json객체로 파싱하고 json클래스의 메서드들을 이용해서 정보를 출력한다.

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParserApplication {
    public static void main(String[] args) {
        //JSON으로 Parsing할 문자열 데이터
        String jsonStr = "{\"members\":["
                + "{\"name\":\"홍길동\","
                + "\"email\":\"gildong@hong.com\","
                + "\"age\":\"25\""
                + "},"
                + "{\"name\":\"홍길서\","
                + "\"email\":\"gilseo@hong.com\","
                + "\"age\":\"23\""
                + "}]}";

        try {
            JSONParser jsonParser = new JSONParser();
            JSONObject jsonObj = (JSONObject) jsonParser.parse(jsonStr);
            JSONArray memberArray = (JSONArray) jsonObj.get("members");

            System.out.println("=====Members=====");
            for(int i=0 ; i<memberArray.size() ; i++){
                JSONObject tempObj = (JSONObject) memberArray.get(i);
                System.out.println(""+(i+1)+"번째 멤버의 이름 : "+tempObj.get("name"));
                System.out.println(""+(i+1)+"번째 멤버의 이메일 : "+tempObj.get("email"));
                System.out.println(""+(i+1)+"번째 멤버의 나이 : "+tempObj.get("age"));
                System.out.println("----------------------------");
            }

        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

코드를 실행하면 아래와 같은 결과가 출력된다.
=====Members=====
1번째 멤버의 이름 : 홍길동
1번째 멤버의 이메일 : gildong@hong.com
1번째 멤버의 나이 : 25
----------------------------
2번째 멤버의 이름 : 홍길서
2번째 멤버의 이메일 : gilseo@hong.com
2번째 멤버의 나이 : 23
----------------------------

2016년 3월 17일 목요일

[JAVA] 자바에서 웹크롤러(Web Crawler) 구현하기

[JAVA] 자바에서 웹크롤러(Web Crawler) 구현하기



가끔 특정 웹페이지의 특정 문자열을 프로그램으로 가져오고 싶을 때가 있다.
이럴때 간단하게 할 수 있는 방법이 웹크롤러를 구현해서 해당 웹페이지의 소스코드를 가져오는 것이다.

가져온 소스코드에서 split함수로 필요한 문자열을 추출해 내면 된다.

아래 예제는 예제사이트인 example.com의 소스코드를 추출해서 출력하는 프로그램이다.

import java.net.*;
import java.io.*;

public class WebCrawler {

    public static void main(String[] args) {
        try{
          //example.com은 연습으로 사용하기 위한 페이지이다. 간단한 페이지로 소스코드의 양도 적다.
            String urlstr = "http://www.example.com";
            //URL 문자열을 처리하기 위해 URL클래스를 이용한다.
            URL url = new URL(urlstr);

            //소스코드를 가져오기 위한 스트림을 선언한다.
            BufferedReader bf;
            String line;

      //URL클래스의 openStream()함수로 지정한 웹주소의 소스코드를 받아올 수 있다.
            bf = new BufferedReader(new InputStreamReader(url.openStream()));

            while((line=bf.readLine())!=null){
                System.out.println(line);
            }

            //스트림을 닫아준다.
            bf.close();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}