ubus-listen

ubus listen說明


更新記錄

item note
20170208 第一版

目錄


ubus listen

使用方式

ubus 提供event listen功能,測試如下

  • 先帶起ubus listen
    若沒有帶listen的event參數,則全部的event都會收進來

    1
    ubus listen event_a
  • client端送出even_a及參數

    1
    ubus send event_a '{"layout":"9x9"}'
  • 此時server將會收到event_a的訊息
    其它的event訊息將會被省略 (ex. ubus send event_b xx)

    1
    2
    ~ # ubus listen event_a
    { "event_a": {"layout":"9x9"} }

一次listen多個event

  • ubus
    listen後面可帶多個event

    1
    2
    3
    4
    ~ # ubus listen event_b event_c
    { "event_b": {"layout":"2x2"} }
    { "event_c": {"layout":"3x3"} }
    ^C~ #
  • client

    1
    2
    3
    ubus send event_a '{"layout":"1x1"}'
    ubus send event_b '{"layout":"2x2"}'
    ubus send event_c '{"layout":"3x3"}'

ubus listen 實現

  1. 由ubus_socket(/var/run/ubus.sock)取得ubusd的ctx
  2. ubus_add_object將目前需要加入ctx裡面
  3. uloop_run: 開始listen fd及等待timeout, 執行callback function
  • ubus listen

    [ubus listen]
  • ubus register event handler

    [ubus_register_event_handler]
  • 需設定ubus_event_handler內的cb
    這邊是設定為receive_event

    1
    2
    3
    4
    5
    struct ubus_event_handler {
    struct ubus_object obj;

    ubus_event_handler_t cb;
    };
  • receive_event
    直接打印取得訊息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    static void receive_event(struct ubus_context *ctx, struct ubus_event_handler *ev,
    const char *type, struct blob_attr *msg)
    {
    char *str;

    str = blobmsg_format_json(msg, true);
    printf("{ \"%s\": %s }\n", type, str);
    fflush(stdout);
    free(str);
    }

ubus send 實現

  • ubus send

    [ubus send]
  • ubus_send_event

    [ubus send]

參考