LINUX.ORG.RU

MQ для встраиваемого софта


0

4

Разрабатываем свой протокол для общения одного клиента (ПК, линукс) с кучкой кастомных железок на микроконтроллерах без ОС по ethernet'у, поверх либо tcp либо udp — ещё не решено.

Вопрос: может кто-нибудь знает какой-нибудь message queue manager, для которого клиентский код удовлетворяет следующим требованиям:

  • написан на С или С++ без использования динамической памяти (ну или в крайнем случае очень ограниченно использующий);
  • не требует никаких библиотек, работает как сериализатор\десериализатор с rpc — т.е. по сути более навороченная замена protobuf'у.

Заранее спасибо.


Если вам нужно только RPC, то зачем искать MQ с поддержкой RPC?

Напиши простейший RPC сам, там делов-то.

mv ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

первый вариант не катит, ибо нету RPC

держи наколенковую реализацию RPC, для людого mq поканает

struct call {
    char * fun_name;
    void * data;
};

typedef void * (* fun_p)(void *);

struct my_cmd {
    char * fun_name;
    fun_p fun;
}

void *
my_fun(const void *data)
{
    printf("hello %s!\n", (char *data));
    return "hello success";
}

#define MAX_CMD 1

struct my_cmds[] = {
    {"my_fun", &my_fun},
    {NULL, NULL}
}


fun_p
search_cmd(const char *name)
{
    int i;

    for(i = 0; i < MAX_CMD; i++) {
        if (0 == strcmp(name, my_cmds[i].name))
            return my_cmds[i].fun
    }
    
    return NULL;
}

void
big_loop()
{
    msg_t msg;
    struct call *c;
    fun_p fun = NULL;
    void *res;

    while (1) {
        msg = wait_msg();
        c = decode_msg(msg);
        fun = search_cmd(call.fun_name);

        if (NULL == fun) {
            send_msg(create_error_msg("fun not found"));
        } else {
            res = *fun(call.data);
            send_msg(encode_msg(res));
        }
    }
}

зы: мог с typedef на функцию промахнуться, давно на сях не писал ):

Skolotovich ★★★ ()

посмотри в сторону LINX - оно под embedded заявлено.

Dark_SavanT ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

первый вариант не катит, ибо нету RPC

ТС не требует RPC - только сериализатор/десериализатор.

tailgunner ★★★★★ ()
Ответ на: комментарий от Skolotovich

Ну да, вариант со своей реализацией всегда есть в запасе, но хочется чего-нибудь готового. Задокументированного, возможно с кодогенерацией.

mkh ()
Ответ на: комментарий от mkh

zeromq как я понимаю требует posix, а у меня ОСи нет совсем, только libc.

всмысле посикс? из того что я вижу у него в зависимостях идет libstdc++ и libuuid, в остальном он вроде самодостаточен

зы: я зеро не использовал, в свое время под задачи был выбран rabbitmq, а вот знакомый его пользует усердно, говорил что зеро на каких то сферических тестах выдавал 80k сообщений в секунду

Ну да, вариант со своей реализацией всегда есть в запасе, но хочется чего-нибудь готового. Задокументированного, возможно с кодогенерацией.

ой ленивый...

по опыту говорю, при наличии нормального транспорта, реализовать какие либо фичи к нему (типа рпц) ну совсем не проблема

Skolotovich ★★★ ()
Ответ на: комментарий от Skolotovich

Честно говоря я не разбирался детально, ZeroMQ меня сразу отпугнула наличием в примерах вызова таких вещей типа zsocket_connect (snapshot, «tcp://localhost:5556»); Т. е. у неё своя обёртка к сокетам. А у меня нет POSIX'овского интерфейса к сокетам и вообще вводу/выводу.

anonymous ()
Ответ на: комментарий от anonymous

Честно говоря я не разбирался детально, ZeroMQ меня сразу отпугнула наличием в примерах вызова таких вещей типа zsocket_connect (snapshot, «tcp://localhost:5556»); Т. е. у неё своя обёртка к сокетам. А у меня нет POSIX'овского интерфейса к сокетам и вообще вводу/выводу.

упс, «без ОС» в условии не заметил ):

походу только ручками тогда

Skolotovich ★★★ ()
Ответ на: комментарий от anonymous

ZeroMQ меня сразу отпугнула наличием в примерах вызова таких вещей типа zsocket_connect (snapshot, «tcp://localhost:5556»); Т. е. у неё своя обёртка к сокетам

zmq_socket реализуется самим zmq, транспортные уровни есть разные, в том числе не-сокетные.

tailgunner ★★★★★ ()
Ответ на: комментарий от Skolotovich

zmq не подойдёт, ибо жирный слишком.

mv ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.