ubus以订阅方式发送TLV格式的数据代码
时间: 2023-06-25 10:04:29 浏览: 163
以下是一个简单的ubus订阅方式发送TLV格式数据的示例代码:
```
#include <libubox/blobmsg.h>
#include <libubox/uloop.h>
#include <libubus.h>
#define MSG_TYPE_HELLO 1
static struct ubus_context *ctx;
static void send_hello_msg(int id)
{
struct blob_buf b;
uint8_t msg[128];
int len = 0;
blob_buf_init(&b, 0);
blobmsg_add_u32(&b, "id", id);
len = blobmsg_buf_length(&b);
msg[0] = MSG_TYPE_HELLO;
msg[1] = len & 0xFF;
msg[2] = (len >> 8) & 0xFF;
memcpy(msg + 3, blobmsg_buf_head(&b), len);
ubus_send_event(ctx, "my_event_name", msg, len + 3);
blob_buf_free(&b);
}
static void event_handler(struct ubus_context *ctx, struct ubus_event_handler *ev,
const char *type, struct blob_attr *msg)
{
uint8_t *data = blobmsg_data(msg);
int len = blobmsg_data_len(msg);
if (data[0] == MSG_TYPE_HELLO) {
uint16_t data_len = (data[2] << 8) | data[1];
struct blob_attr *attr;
struct blob_parser parser;
blob_parser_init(&parser, data + 3, data_len);
blob_for_each_attr(attr, parser.head, blob_data(msg)) {
if (!strcmp(blobmsg_name(attr), "id")) {
printf("Received hello message with id %d\n", blobmsg_get_u32(attr));
break;
}
}
}
}
static void subscribe_event()
{
struct ubus_event_handler handler = {.cb = event_handler};
ubus_register_event_handler(ctx, &handler, "my_event_name");
}
int main(int argc, char **argv)
{
ctx = ubus_connect(NULL);
if (!ctx) {
printf("Failed to connect to ubus\n");
return 1;
}
subscribe_event();
while (1) {
send_hello_msg(123);
uloop_timeout_set(&timeout, 1000);
uloop_run();
}
ubus_free(ctx);
return 0;
}
```
这段代码中,我们首先创建一个`ubus_context`对象,并连接到ubus守护进程。然后,我们注册一个事件处理器,用于处理来自名为`my_event_name`的事件。在`send_hello_msg`函数中,我们使用`blob_buf`库构建一个包含`id`字段的TLV格式消息,并在前面添加一个消息类型字节和两个长度字节。最后,我们使用`ubus_send_event`函数将消息发送到ubus守护进程。在`event_handler`函数中,我们解析收到的TLV消息,并提取出其中的`id`字段。
阅读全文