连接同步组件
本节内容介绍连接同步组件(ConnSyncMCom)的使用方法。连接同步组件用于客户端连接或重连时,向服务端发起 CALL 调用请求,同步一个或一组数据资源,数据将从相应资源订阅接口返回,从而实现同步客户端连接时使用同一套资源订阅接口从服务端同步数据。
开发须知
本节示例可以从模板
demo-connsync
创建工程。本示例演示通过订阅发布接口数据,在订阅端连接服务端时通过连接同步组件,同步数据资源进行展示。
本节仅对连接同步组件开发进行最基本的介绍,更详细的使用请参考工程建模-连接同步组件。连接同步组件模型介绍请参考连接同步组件。
服务模型
本示例由 2 个服务组成,展示连接同步功能。
说明:
serc2
VSOA 接口定时发布事件
serc1
订阅serc2
的 VSOA 接口。
serc1
向serc2
发起 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
中存在一个组件中定义了一个 连接同步组件 com1
,com1
订阅 /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 */
运行结果
serc2
中 com1.event1
每秒发布的数字,如下图所示。
serc1
连接或重新连接 serc2
时,向 serc2
发起 CALL 调用请求,同步数据资源,如下图所示。