搜索
您的当前位置:首页【从零开始一步步学习VSOA开发】订阅发布变速器

【从零开始一步步学习VSOA开发】订阅发布变速器

来源:乌哈旅游

订阅发布变速器

概念

在许多场景中,我们需要控制发布频率。例如,一个 UI 界面不能过快的接收处理信息,而此时发布者的发布频率又非常快。在这种场景下,我们需要改变发布的频率。
使用 VSOA Regulator 可以解决这个问题,它既可以使用在服务端,也可以使用在客户端。

例程

我们在原 axis 试验客户端程序基础上进行修改,原发布频率是每秒一次,我们使用变速器改为 5 秒一次。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include "vsoa_client.h"
#include "vsoa_cliauto.h"
#include "vsoa_regulator.h"

#define MY_SERVER_PASSWD                    "123456"

static vsoa_regulator_t* regulator;

static void onmessage (void *arg, struct vsoa_client *client, vsoa_url_t *url, vsoa_payload_t *payload, bool quick)
{
    printf("subscribe message, url:%.*s, quick:%s\n",
            (int)url->url_len, url->url,
            quick ? "ture":"false");

    printf("subscribe message, param:%.*s, data:%.*s\n",
               (int)payload->param_len, payload->param,
               (int)payload->data_len, (char *)payload->data);

    vsoa_regulator_update(regulator, url, payload);
}

static void slow_onmessage (void *arg, vsoa_url_t *url, vsoa_payload_t *payload)
{
    printf("slow subscribe message, url:%.*s\n",
            (int)url->url_len, url->url);

    printf("slow subscribe message, param:%.*s, data:%.*s\n",
               (int)payload->param_len, payload->param,
               (int)payload->data_len, (char *)payload->data);
}

int main (int argc, char **argv)
{
    vsoa_client_auto_t *cliauto;
    static char *sub_urls[] = { "/axis" };
    struct timespec period = { 5, 0 };
    vsoa_url_t      url;

    /*
     * 创建并注册发布订阅变速器,每5秒处理器一次订阅
     */
    regulator = vsoa_regulator_create(&period);
    url.url = "/axis";
    url.url_len = strlen(url.url);
    vsoa_regulator_slot(regulator, &url, slow_onmessage, NULL, 1024);

    /*
     * 创建客户端机器人
     */
    cliauto = vsoa_client_auto_create(onmessage, NULL);

    vsoa_client_auto_consistent(cliauto, sub_urls, 1, 1000);
    /*
     * 启动客户端机器人127.0.0.1:4001  vsoa://axis_server
     */
    vsoa_client_auto_start(cliauto, "vsoa://axis_server", MY_SERVER_PASSWD, sub_urls, 1, 1000, 1000, 1000);

    while (true) {
        sleep(1);
    }
}

运行效果

服务端运行效果:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top