跳到主要内容

HelloWorld插件示例

最快速的方式了解WA-EDGE插件开发的方式是开始编译和执行插件示例plugin-hello>>

该目录下包含两个插件子目录:clientservice,分别展示微服务的client和server的角色。

下载代码

在Ubuntu系统上下载代码:

git clone https://gitee.com/wasome/wa-iot-edge-sdk.git

编译

cd wa-iot-edge-sdk/samples/plugin-hello
./build_hello.sh

打包插件

cd wa-iot-edge-sdk/samples/plugin-hello
./build_hello.sh -a

快速运行插件

运行插件需要使用一个简易的框架程序,从源码编译得到simple-edge-broker>>

cd samples/simple-edge-broker/
./build_broker.sh run

该命令会编译简易框架,并加载运行hello world插件。

在专用线程中执行回调函数

执行下面命令来打开代码中的WA_THREAD_DEMO宏,启用在专用线程中执行回调函数:

  • client侧的response handler
  • service侧的resource handler
cd samples/simple-edge-broker/
WA_THREAD_DEMO=true ./build_broker.sh run

1. 资源实现函数 (service端)

参考示例:hello_world_service>>

下面代码提供调用WA_SetRemotePoster, 指定用job_poster函数来分发来自总线上的微服务请求消息。

static void E2EModule_Start(MODULE_HANDLE module)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)module;

RESTFUL_CONTEXT ctx = WA_InitRestful(module_data->broker, module, "mod-server");
module_data->restful_context = ctx;
WA_SetRemotePoster(ctx, job_poster, module_data);
ThreadAPI_Create(&module_data->threadHandle, service_HandlingThread, module_data);
}

函数job_poster将消息转发至线程service_HandlingThread所拥有的消息队列。dlist_node_try_process会触发资源回调函数的执行。

static void job_poster (void * job, RemoteHandler job_handler, void * arg_for_poster)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)arg_for_poster;
dlist_post(module_data->internal_queue, T_Message_Handler, job, job_handler);
}

int service_HandlingThread(void *param)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)param;

while(1)
{
dlist_node_t job = dlist_get_wait(module_data->internal_queue, 10);
if(job)
{
if(!dlist_node_try_process(job))
{
WARNING2("failed to process job!");
dlist_node_free(job);
}
}
}
return 0;
}

2. 回复消息回调函数 (client端)

参考示例:hello_world_service>>

下面代码提供调用WA_SetRemotePoster, 指定用job_poster函数来分发来自总线上的微服务请求消息。

static void E2EModule_Start(MODULE_HANDLE module)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)module;

RESTFUL_CONTEXT ctx = WA_InitRestful(module_data->broker, module, "mod-client");
WA_SetRemotePoster(ctx, job_poster, module_data);
module_data->restful_context = ctx;
ThreadAPI_Create(&module_data->threadHandle, client_WorkingThread, module_data);
ThreadAPI_Create(&module_data->threadHandle, client_HandlingThread, module_data);

}

函数job_poster将消息转发至线程client_HandlingThread所拥有的消息队列。dlist_node_try_process会触发Response回调函数的执行。

static void job_poster (void * job, RemoteHandler job_handler, void * arg_for_poster)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)arg_for_poster;
dlist_post(module_data->internal_queue, T_Message_Handler, job, job_handler);
}

int client_HandlingThread(void *param)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)param;

while(1)
{
dlist_node_t job = dlist_get_wait(module_data->internal_queue, 10);
if(job)
{
if(!dlist_node_try_process(job))
{
WARNING2("failed to process job!");
dlist_node_free(job);
}
}
}
return 0;
}