连接同步组件

更新时间:
2024-05-15
下载文档

连接同步组件

本节内容介绍连接同步组件(ConnSyncMCom)的使用方法。连接同步组件用于客户端连接或重连时,向服务端发起 CALL 调用请求,同步一个或一组数据资源,数据将从相应资源订阅接口返回,从而实现同步客户端连接时使用同一套资源订阅接口从服务端同步数据。

开发须知

  1. 本节示例可以从模板 demo-connsync 创建工程。

  2. 本示例演示通过订阅发布接口数据,在订阅端连接服务端时通过连接同步组件,同步数据资源进行展示。

  3. 本节仅对连接同步组件开发进行最基本的介绍,更详细的使用请参考工程建模-连接同步组件。连接同步组件模型介绍请参考连接同步组件

服务模型

本示例由 2 个服务组成,展示连接同步功能。

说明:

  • serc2 VSOA 接口定时发布事件

  • serc1 订阅 serc2 的 VSOA 接口。

  • serc1serc2 发起 RPC 调用。

组件模型与接口

serc1 组件

serc1 中存在两个组件,com1 是一个连接同步组件,com2 订阅 /serc2/elema VSOA 接口发布。

com2.event1 打印接收的数据。

/*
 * @func: serc1_com2_event1_vsub_i
 * @thread: serc2-client
 */
ac_result_t serc1_com2_event1_vsub_i(ac_t *acs, serc2_elem_t *param, void *data, size_t len)
{
    ac_result_t ret = AC_RET_OK;

    /*---------------------------------------------------------------------------------------------------
     * @begin: HANDLE
     * @desc: make you code below to handle input data.
     *-------------------------------------------------------------------------------------------------*/
    printf("------ serc1_com2_event1 ------ Run\n");
    printf("Get pub : %s - %d\n", param->name, param->numa);
    /*---------------------------------------------------------------------------------------------------
     * @end: HANDLE
     *-------------------------------------------------------------------------------------------------*/

    return  (ret);
} /* @func-end */

serc2 组件

serc2 中存在一个组件中定义了一个 连接同步组件 com1com1 订阅 /serc1/puba VSOA 接口发布。

com1.comStrat 初始化数据。

static int numTime;

/*
 * @func: serc2_com1_comStart_sinit_i
 * @thread: main
 */
ac_result_t serc2_com1_comStart_sinit_i(ac_t *acs)
{
    ac_result_t ret = AC_RET_OK;

    /*---------------------------------------------------------------------------------------------------
     * @begin: HANDLE
     * @desc: make you code below to handle input data.
     *-------------------------------------------------------------------------------------------------*/
    numTime = 0;
    /*---------------------------------------------------------------------------------------------------
     * @end: HANDLE
     *-------------------------------------------------------------------------------------------------*/

    return  (ret);
} /* @func-end */

com1.event1 设置每 1 秒间隔发布一次数据并打印。

/*
 * @func: serc2_com1_event1_stimer_vpub_io
 * @thread: timer
 */
ac_result_t serc2_com1_event1_stimer_vpub_io(ac_t *acs)
{
    ac_result_t ret = AC_RET_OK;
    bool port_ret = true;
    vsoa_payload_t out;
    serc2_elem_t _jout;
    serc2_elem_t *jout = &_jout;

    ac_payload_init(&out, NULL, 0, NULL, 0);
    serc2_elem_init(jout);

    /*---------------------------------------------------------------------------------------------------
     * @begin: HANDLE_INIT
     * @desc: make you code below to handle input data, init output data.
     *-------------------------------------------------------------------------------------------------*/
    numTime++;
    jout->name = "serc2_com1_event1";
    jout->numa = numTime;
    printf("------serc2_com1_event1 %d\n", jout->numa);
    /*---------------------------------------------------------------------------------------------------
     * @end: HANDLE_INIT
     *-------------------------------------------------------------------------------------------------*/

    out.param = serc2_elem_json_stringify(jout);
    out.param_len = strlen(out.param);
    port_ret = ac_port_pub(acs, "/serc2/elema", &out, FALSE);
    serc2_elem_json_stringify_free(out.param);

    ret = port_ret ? AC_RET_OK : AC_RET_BREAK;

    /*---------------------------------------------------------------------------------------------------
     * @begin: FREE
     * @desc: make you code below to free output data if needed.
     *-------------------------------------------------------------------------------------------------*/

    /*---------------------------------------------------------------------------------------------------
     * @end: FREE
     *-------------------------------------------------------------------------------------------------*/

    return  (ret);
} /* @func-end */

com1.event2 设置连接同步组件在连接时需要同步的数据。

/*
 * @func: serc2_com1_event2_vcall_i
 * @thread: serc2-service
 */
ac_result_t serc2_com1_event2_vcall_i(ac_t *acs, void *data, size_t len)
{
    ac_result_t ret = AC_RET_OK;
    bool reply_ret = true;
    vsoa_payload_t reply;
    uint8_t status = VSOA_STATUS_SUCCESS;
    serc2_elem_t _jreply;
    serc2_elem_t *jreply = &_jreply;

    ac_payload_init(&reply, NULL, 0, NULL, 0);
    serc2_elem_init(jreply);

    /*---------------------------------------------------------------------------------------------------
     * @begin: HANDLE_INIT
     * @desc: make you code below to handle input data, init output data.
     *-------------------------------------------------------------------------------------------------*/
    jreply->name = "serc2_com1_event2";
    jreply->numa = numTime;
    /*---------------------------------------------------------------------------------------------------
     * @end: HANDLE_INIT
     *-------------------------------------------------------------------------------------------------*/

    reply.param = serc2_elem_json_stringify(jreply);
    reply.param_len = strlen(reply.param);
    reply_ret = ac_port_reply(acs, status, &reply);
    serc2_elem_json_stringify_free(reply.param);

    ret = reply_ret ? AC_RET_OK : AC_RET_BREAK;

    /*---------------------------------------------------------------------------------------------------
     * @begin: FREE
     * @desc: make you code below to free output data if needed.
     *-------------------------------------------------------------------------------------------------*/

    /*---------------------------------------------------------------------------------------------------
     * @end: FREE
     *-------------------------------------------------------------------------------------------------*/

    return  (ret);
} /* @func-end */

运行结果

serc2com1.event1 每秒发布的数字,如下图所示。

serc1 连接或重新连接 serc2 时,向 serc2 发起 CALL 调用请求,同步数据资源,如下图所示。

文档内容是否对您有所帮助?
有帮助
没帮助