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();
    }
}



댓글 없음:

댓글 쓰기