나는 webiopi라는 라즈베리파이 상에서 web으로 GPIO를 제어하는 프로그램을 참조하여
자바 스프링으로 유사한 기능을 제어하려고 하고 있다.
webiopi는 REST API를 사용하여 GPIO를 제어하고 있어서 자바 스프링에서 REST API를 어떻게 처리하는지 파악하고 있다.
이 글에서는 webiopi에서 제공하는 REST API 기능에 대하여 자바 스프링으로 처리하기 위한 전 단계로 REST API 처리를 위한 Controller, Method 및 입력 파라미터 파싱에 대하여 알아본다.
1. Get GPIO function
- HTTP GET /GPIO/(gpioNumber)/function
package com.talanton.rest.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/GPIO")
public class GpioController {
@RequestMapping(value="/{gpioNumber}/function", method=RequestMethod.GET)
public ResponseEntity<String> getFunction(@PathVariable("gpioNumber") Integer gpioNumber) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : in";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
}
2. Set GPIO function
- HTTP POST /GPIO/(gpioNumber)/function/("in" or "out" or "pwm")
@RequestMapping(value="/{gpioNumber}/function/{value}", method=RequestMethod.POST)
public ResponseEntity<String> postFunction(@PathVariable("gpioNumber") Integer gpioNumber, @PathVariable("value") String value) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + value;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
3. Get GPIO value
- HTTP GET /GPIO/(gpioNumber)/value
@RequestMapping(value="/{gpioNumber}/value", method=RequestMethod.GET)
public ResponseEntity<String> getValue(@PathVariable("gpioNumber") Integer gpioNumber) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : 0";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
4. Set GPIO value
- HTTP POST /GPIO/(gpioNumber)/value/(0 or 1)
@RequestMapping(value="/{gpioNumber}/value/{value}", method=RequestMethod.POST)
public ResponseEntity<String> postValue(@PathVariable("gpioNumber") Integer gpioNumber, @PathVariable("value") Integer value) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + value;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
5. Output a single pulse
- HTTP POST /GPIO/(gpioNumber)/pulse/
@RequestMapping(value="/{gpioNumber}/pulse", method=RequestMethod.POST)
public ResponseEntity<String> postPulse(@PathVariable("gpioNumber") Integer gpioNumber) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + "pulse";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
6. Output bit sequence
- HTTP POST /GPIO/(gpioNumber)/sequence/(delay),(sequence)
@RequestMapping(value="/{gpioNumber}/sequence/{delay},{sequence}", method=RequestMethod.POST)
public ResponseEntity<String> postSequence(@PathVariable("gpioNumber") Integer gpioNumber,
@PathVariable("delay") Integer delay, @PathVariable("sequence") String sequence) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : " + "sequence : " + delay + " : " + sequence;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
7. Output PWM with a duty cycle ratio
- HTTP POST /GPIO/(gpioNumber)/pulseRatio/(ratio)
// 소수점 데이터를 입력받기 위한 방법 {variable:.+}
// 참고 : http://stackoverflow.com/questions/16332092/spring-mvc-pathvariable-with-dot-is-getting-truncated
@RequestMapping(value="/{gpioNumber}/pulseRatio/{ratio:.+}", method=RequestMethod.POST)
public ResponseEntity<String> postPulseRatio(@PathVariable("gpioNumber") Integer gpioNumber,
@PathVariable("ratio") Float ratio) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : pulseRatio : " + ratio;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
8. Output PWM with an angle for servos
- HTTP POST /GPIO/(gpioNumber)/pulseAngle/(angle)
@RequestMapping(value="/{gpioNumber}/pulseAngle/{angle}", method=RequestMethod.POST)
public ResponseEntity<String> postPulseAngle(@PathVariable("gpioNumber") Integer gpioNumber,
@PathVariable("angle") Integer angle) {
ResponseEntity<String> entity = null;
String result = gpioNumber + " : pulseAngle : " + angle;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
9. Call a macro on the server
- HTTP POST /macros/(macro)/(args)
왜냐하면 URL이 /macros로 시작하기 때문이다. 기존의 GpioController는 REST API URL이 /GPIO로 시작하였기 때문에 사용할 수 없고, 새로운 MacroController를 사용한다.
package com.talanton.rest.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/macros")
public class MacroController {
@RequestMapping(value="/{macro}/{args}", method=RequestMethod.POST)
public ResponseEntity<String> macroFunction(@PathVariable("macro") String macro, @PathVariable("args") String args) {
ResponseEntity<String> entity = null;
String result = "macroFunction : " + macro + ", " + args;
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
}
10. Get full GPIO state/configuration
- HTTP GET /*
/* 라는 URL을 처리하기 위하여 새로운 RestController StateController를 정의한다.
package com.talanton.rest.controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("")
public class StateController {
@RequestMapping(value="*", method=RequestMethod.GET)
public ResponseEntity<String> gpioState() {
ResponseEntity<String> entity = null;
String result = "getState";
entity = new ResponseEntity<String>(result, HttpStatus.OK);
return entity;
}
}
이제는 Webiopi에서 제공하는 REST API에 대한 처리 함수와 입력 파라미터 파싱을 완료하였다. 이후 실제 라즈베리파이에 적용하여 기능을 개발하는 것이 필요하다.