페이지
▼
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();
}
}
댓글 없음:
댓글 쓰기