2010년 6월 15일 화요일
mbed RPC 인터페이스 (RPC interface for mbed)
mbed는 인터페이스 오브젝트에 이름을 부여해주면 텍스트 기반 인터페이스를 통해 제어할 수 있다.
메소드는 url과 유사한 방식으로 호출된다.
/<objectname>/<method> <arg1> <arg2> ...
가장 기본적인 예제이다.
#include "mbed.h"
DigitalOut led(p1, "led");
int main() {
char result[64];
rpc("/led/write 1", result);
printf("%s\n", result);
rpc("/led/read", result);
printf("%s\n", result);
}
Remote Control
mBed를 터미널에 연결하고 시리얼 포트 입력을 기다리도록 하면 시리얼을 통해 직접 명령어를 입력하고 그 결과를 돌려받을 수 있다.
#include "mbed.h"
Serial pc(USBTX, USBRX);
DigitalIn led(p1, "led");
AnalogIn pot(p20, "pot");
int main() {
char buf[256], outbuf[256];
while(1) {
pc.gets(buf, 256);
rpc(buf, outbuf);
pc.printf("%s\n", outbuf);
}
}
터미널이 엔터키가 눌렸을 때 LF(또는 CR+LF)를 보내도록 설정되어 있어야 한다.
위의 프로그램이 실행되고 있으면 터미널에서 직접 명령어를 넣어주면 된다.
/led/write 1<return> LED를 켠다.
/pot/read<return> 아날로그 핀 20의 값을 읽는다.
Remote Creation of mbed interfaces
RPC인터페이스를 사용하면 원격에서 인터페이스를 만들거나 삭제할 수 있다.
새 인터페이스를 만들려면 mbed에게 만들려고 하는 인터페이스에 대해 알려줘야 한다. 아래 코드는 원격 어플리케이션에서 이런 동작을 할 수 있도록 해 주는 시리얼 어플리케이션 예제이다.
/* RPCSerial - RPC over a serial port transport
* sford
*
* When running, you can send RPC commands to the mbed
* via the serial port, to create and manipulate objects
*
* Example:
* > "/DigitalOut/new p2\n"
* > > "objXYZ\n"
* > "/objXYZ/write 1\n"
* > "\n"
* > "/objXYZ/read"
* > "1\n"
*/
#include "mbed.h"
#include "rpc.h"
Serial pc(USBTX, USBRX);
int main() {
// setup the classes that can be created dynamically
Base::add_rpc_class<AnalogIn>();
Base::add_rpc_class<AnalogOut>();
Base::add_rpc_class<DigitalIn>();
Base::add_rpc_class<DigitalOut>();
Base::add_rpc_class<PwmOut>();
Base::add_rpc_class<Timer>();
Base::add_rpc_class<SPI>();
Base::add_rpc_class<BusOut>();
Base::add_rpc_class<BusIn>();
char command[256] = {0};
char response[256] = {0};
// receive commands, and send back the responses
while(1) {
pc.gets(command, 256);
rpc(command, response);
pc.printf("%s\n", response);
}
}
실행 예제 (볼드체로 된 부분이 직접 입력한 내용이고 이태릭체로 된 부분은 mbed의 응답이다.)
/DigitalOut/new LED1
obj400058B0
/obj400058B0/write 1
/AnalogIn/new p3 volume
volume
/volume/read
0.297
/volume/delete
시리얼 인터페이스 뿐 아니고 mbed에 내장된 웹서버를 사용해 HTTP 프로토콜로 RPC 호출을 할 수도 있다. URL의 페이지 주소가 '/rpc/'로 시작하면 웹 서버가 RPC 리퀘스트로 처리한다.
예를 들어 URL이 'http://mbed-ip-or-hostname/rpc/led1/write+1' 이면 시리얼 터미널에서 '/led1/write 1'을 입력한것과 동일한 동작을 수행한다. (URL주소에서 space는 '+'로 대치)
#include "mbed.h"
#include "HTTPServer.h"
#include "HTTPRPC.h"
#include "HTTPFS.h"
HTTPServer http;
DigitalOut led1(LED1, "led1");
DigitalOut led2(LED2, "led2");
DigitalOut led3(LED3, "led3");
DigitalOut led4(LED4, "led4");
LocalFileSystem local("local");
int main(void) {
Base::add_rpc_class<AnalogIn>();
Base::add_rpc_class<AnalogOut>();
Base::add_rpc_class<DigitalIn>();
Base::add_rpc_class<DigitalOut>();
Base::add_rpc_class<PwmOut>();
Base::add_rpc_class<Timer>();
Base::add_rpc_class<SPI>();
Base::add_rpc_class<BusOut>();
Base::add_rpc_class<BusIn>();
http.addHandler(new HTTPRPC());
http.addHandler(new HTTPFileSystemHandler("/", "/local/"));
http.bind();
while(1) {
http.poll();
}
}
Labels:
리모트 컨트롤,
시리얼 터머널,
시리얼 포트,
원격 제어,
Embedded,
Embedded System,
HTTP,
HTTP RPC,
mBed,
mbed 보드,
REMOTE CONTROL,
Remote Procedure Call,
RPC,
RPC 호출,
RPC interface,
Serial Port,
serial terminal
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기