Programing/Springboot

Springboot 기반 Californium COAP 통신 서버 구현

리커니 2018. 7. 13.
반응형

Springboot 기반 Californium COAP 통신 서버 구현

 

웹 개발자로 6년간 일을 하고, 슬슬 지처가는 중에

서버를 구현해 볼 기회가 생겼습니다.!

 

COAP 통신 서버 구현과, 기존에 있던 MFC 서버와 TCP 통신으로 데이터를 주고 받는 것이 미션이였습니다.

 

우선 기반 프레임워크는 SpringBoot 로 결정했고,

서버 개발자분들의 조언을 받아 고성능 비동기 네티워크 프레임워크인 Netty를 얹기로 결정했습니다.

 

스펙은 아래와 같습니다.

 

Java : 1.8.0_131

IDE : eclipse Mars 4.5.2

SpringBoot : 2.0.2

dependency tool : gradle

 

우선 이클립스에서 SpringBoot 프로젝트를 생성합니다.

Package Explorer>마우스오른쪽클릭>New>Other

 

 

팝업창>Spring>Spring Starter Project 선택

 

 

아래와 같이 설정 후 Next

 

 

그 다음창에서 Next, 그 다음다음창에서 Finish

그럼 기본적인 jar 파일들이 다운로드 되며, 프로젝트가 생성됩니다.

 

이제 COAP 통신을 위한 의존성 주입을 gradle에 추가 하도록 합니다.

 

프로젝트의 root 경로에 있는 build.gradle 파일을 열어 dependencies 안에 의존성을 주입합니다.

 

compile group: 'org.eclipse.californium', name: 'californium-core', version: '1.0.6'

 

 

작성 후 프로젝트>마우스오른쪽클릭>gradle>refresh gradle project를 하면

Project and External dependencies 에 californium-core가 추가된 것을 확인 하실 수 있습니다.

 

 

 

이제 생성한 패키지 내에 CoapServerApplication.java 파일로 이동합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
package com.coap.geon;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class CoapServerApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(CoapServerApplication.class, args);
    }
}
cs

 

기본적으로 SpringBoot 프로젝트가 실행되면 @SpringBootApplication 어노테이션이 설정된 클래스의

메인 메소드가 실행이 됩니다.

확인을 하셨으면 실제 COAP 서버 기능을 하기위한 클래스를 작성해보도록 하죠.

californium의 CoapServer 클래스를 extends 해서 구현하도록 합니다.

 

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
32
33
34
35
36
37
38
@Service
public class CoapCollectionServer extends CoapServer{
    
    private static final Logger logger = Logger.getLogger(CoapCollectionServer.class.getName());
    
    @Autowired
    private CollectionMSDService cms;
    
    @Override
    protected Resource createRoot() {
        return new ResourceSetting();
    }
    /* COAP 통신에서 받은 데이터를 핸들링 하기 위해 Resource를 Override해서 사용*/
    public class ResourceSetting extends CoapResource{
        public ResourceSetting() {
            super("");
        }
        /* COAP POST 방식으로 전달된 데이터 핸들링 */
        @Override
        public void handlePOST(CoapExchange exchange) {
            exchange.respond(ResponseCode.CONTENT);
            int size = exchange.getRequestPayload().length;
            byte[] data = new byte[size];
            data = exchange.getRequestPayload();
            ByteArrayInputStream bais = new ByteArrayInputStream(data);
            /* CBOR decode - use jackson Library */
            CBORFactory cf = new CBORFactory();
            ObjectMapper mapper = new ObjectMapper(cf);
            try {
                /* CBOR 을 JsonNode로 변환 */
                JsonNode json = mapper.readValue(bais, JsonNode.class);
                cms.insertMsd(json);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }    
    }
}
cs

 

루트 리소스를 생성하는 부분과 리소스로 받은 데이터를 핸들링 하는 두가지를 Override 해서 사용합니다.

COAP은 UDP 통신인데도 Http 통신의 Rest 방식과 같은 get, post, put, delete 메소드를 제공합니다.

 

 

 

 

저는 장비로부터 Post 방식으로 데이터를 받기 때문에 handlePOST  메소드를 재정의 해서 사용했는데,

다른 방식으로 받는 분들은 californium 라이브러리 내 CoapResource 클래스를 참고하시어

각 방식에 맞는 메소드를 재정의 해서 사용하시면 됩니다.

 

위의 코드는 COAP Post방식으로 CBOR type 데이터를 받아 JSON으로 변환해서 데이터를 핸들링하는 예제 입니다.

CBOR to JSON 이 궁금하신 분은 아래의 Link를 참고하세요.

 

Link : Java CBOR parsing, CBOR to JSON Object

 

Java CBOR parsing, CBOR to JSON Object

Java CBOR parsing, CBOR to JSON Object CBOR 타입에 대한 설명은 아래의 Link를 참고하세요. Link : http://cbor.io/impls.html 어떤 문제인지는 모르겠지만, co.nstant.in 에서 제공하는 CBOR 디코더를 사용하..

aljjabaegi.tistory.com

 

이제 다시 CoapServerApplication.java 로 이동해서 COAP 서버를 실행하도록 구현하도록 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.coap.geon;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
 
import com.coap.geon.collection.server.CoapCollectionServer;
 
@SpringBootApplication
public class CoapServerApplication {
 
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(CoapServerApplication.class, args);
 
        CoapCollectionServer server = ctx.getBean(CoapCollectionServer.class);
        logger.info("Netty COAP Server Start");
        server.start();
    }
}
cs

 

server.start(); 전에 endpoint 설정도 해주세요.

server.addEndpoints();

이제 스프링부트 프로젝트를 실행하면 서버가 실행되는 것을 확인 하실 수 있습니다.

 

 

저는 포트 설정을 따로 안해주었기 때문에 COAP 기본 포트인 5683 포트로 서버가 실행되었습니다.

그럼 완료~!

 

포트 및 기타 설정은 자동으로 생성되는 Californium.properties 파일에서 설정이 가능합니다.

반응형

댓글

💲 추천 글