变速器组件
本节内容介绍变速器组件(SubRegulMCom)的使用方法。当一个服务从其它服务订阅资源,该资源发布频率非常快或不能满足当前服务处理频率时,可以使用变速器组件,配置该资源输出频率。变速器组件接收一个订阅资源,可以创建多个事件,每个事件可单独配制事件回调周期。
开发须知
本节示例可以从模板
demo-subregul
创建工程。本示例演示通过变速器组件订阅 VSOA 发布接口,并使用不同于 VSOA 发布接口的频率将接收到的数据打印展示。
本节仅对变速器组件开发进行最基本的介绍,更详细的使用请参考工程建模-变速器组件。变速器组件模型介绍请参考变速器组件。
服务模型
本示例由 2 个服务组成,展示变速器功能。
说明:
serc1
VSOA 接口发布事件。
serc2
订阅serc1
的 VSOA 接口。
组件模型与接口
serc1 组件
serc1
服务中定义了一个组件,组件中存在一个定时器事件,每 1 秒进行一次发布。
com1.event1
VSOA 发布接口每秒发布一个数字,并打印发布的内容。
static int numTime = 0;
/*
* @func: serc1_com1_event1_stimer_vpub_io
* @thread: timer
*/
ac_result_t serc1_com1_event1_stimer_vpub_io(ac_t *acs)
{
ac_result_t ret = AC_RET_OK;
bool port_ret = true;
vsoa_payload_t out;
serc1_elem_t _jout;
serc1_elem_t *jout = &_jout;
ac_payload_init(&out, NULL, 0, NULL, 0);
serc1_elem_init(jout);
/*---------------------------------------------------------------------------------------------------
* @begin: HANDLE_INIT
* @desc: make you code below to handle input data, init output data.
*-------------------------------------------------------------------------------------------------*/
numTime += 1;
jout->numt = numTime;
printf("serc1-com1-event1------ %d\n", jout->numt);
/*---------------------------------------------------------------------------------------------------
* @end: HANDLE_INIT
*-------------------------------------------------------------------------------------------------*/
out.param = serc1_elem_json_stringify(jout);
out.param_len = strlen(out.param);
port_ret = ac_port_pub(acs, "/serc1/puba", &out, FALSE);
serc1_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 */
serc2 组件
serc2
服务中定义了一个变速器组件 com1
,com1
订阅 /serc1/puba
VSOA 接口发布。
com1.event1
设置输出周期为 2 秒,并打印输出的数据。
/*
* @func: serc2_com1_event1_vsub_i
* @thread: serc1-client
*/
ac_result_t serc2_com1_event1_vsub_i(ac_t *acs, serc1_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("serc2-com1-event1------ %d\n", param->numt);
/*---------------------------------------------------------------------------------------------------
* @end: HANDLE
*-------------------------------------------------------------------------------------------------*/
return (ret);
} /* @func-end */
com1.event2
设置输出周期为 5 秒,并打印输出的数据。
/*
* @func: serc2_com1_event2_cbind_i
*/
ac_result_t serc2_com1_event2_cbind_i(ac_t *acs, serc1_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("serc2-com1-event2------ %d\n", param->numt);
/*---------------------------------------------------------------------------------------------------
* @end: HANDLE
*-------------------------------------------------------------------------------------------------*/
return (ret);
} /* @func-end */
运行结果
serc1
中 com1.event1
每秒发布的数字,如下图所示。
serc2
中 com1.event1
将订阅周期为每 2 秒处理一次,serc2
中 com1.event2
将订阅周期为每 5 秒处理一次,如下图所示。