插件

    它们依赖于 的代码 API 或者 钩子 进行实现其特殊的功能。

    然后通过打包编译工具 将其与 emqx 核心项目一起编译并打包至一个可运行的软件包中。

    目前 EMQ X 发行包提供的插件包括:

    目前启动插件有以下四种方式:

    1. 默认加载
    2. 命令行启停插件
    3. 使用 Dashboard 启停插件
    4. 调用管理 API 启停插件

    开启默认加载

    如需在 EMQ X 启动时就默认启动某插件,则直接在 添加需要启动的插件名称。

    例如,目前 EMQ X 自动加载的插件有:

    命令行启停插件

    使用 Dashboard 启停插件

    若开启了 Dashbord 的插件,可以直接通过访问 http://localhost:18083/plugins 中的插件管理页面启停插件。

    使用管理 API 启停插件

    在 EMQ X 运行过程中,可通过 的方式查看、和启停某插件。

    参考 emqx_plugin_template 插件模版创建新的插件项目。

    备注:在 \<plugin name>_app.erl 文件中必须加上标签 -emqx_plugin(?MODULE). 以表明这是一个 EMQ X 的插件。

    创建 认证/访问控制 模块

    接入认证示例代码 - emqx_auth_demo.erl

    1. -module(emqx_auth_demo).
    2. -export([ init/1
    3. , check/2
    4. , description/0
    5. ]).
    6. init(Opts) -> {ok, Opts}.
    7. check(_ClientInfo = #{clientid := ClientId, username := Username, password := Password}, _State) ->
    8. ok.
    9. description() -> "Auth Demo Module".

    访问控制示例代码 - emqx_acl_demo.erl

    1. -module(emqx_acl_demo).
    2. -include_lib("emqx/include/emqx.hrl").
    3. -export([ init/1
    4. , check_acl/5
    5. , reload_acl/1
    6. , description/0
    7. ]).
    8. init(Opts) ->
    9. {ok, Opts}.
    10. check_acl({ClientInfo, PubSub, _NoMatchAction, Topic}, _State) ->
    11. io:format("ACL Demo: ~p ~p ~p~n", [ClientInfo, PubSub, Topic]),
    12. allow.
    13. reload_acl(_State) ->
    14. ok.
    15. description() -> "ACL Demo Module".
    1. ok = emqx:hook('client.authenticate', fun emqx_auth_demo:check/2, []),
    2. ok = emqx:hook('client.check_acl', fun emqx_acl_demo:check_acl/5, []).

    在扩展插件中,可通过挂载 来处理客户端上下线、主题订阅、消息收发等事件。

    钩子挂载示例代码 - emqx_plugin_template.erl

    注册 CLI 命令

    处理命令行命令示例代码 - emqx_cli_demo.erl

    1. -module(emqx_cli_demo).
    2. -export([cmd/1]).
    3. cmd(["arg1", "arg2"]) ->
    4. emqx_cli:print ("ok");
    5. cmd(_) ->
    6. emqx_cli:usage ([{"cmd arg1 arg2", "cmd demo"}]).

    注册命令行示例代码 - emqx_plugin_template_app.erl

    1. ok = emqx_ctl:register_command(cmd, {emqx_cli_demo, cmd}, []),

    插件加载后,使用./bin/emqx_ctl 验证新增的命令行:

    1. ./bin/emqx_ctl cmd arg1 arg2

    插件自带配置文件放置在 etc/${plugin_name}.conf|config。 EMQ X 支持两种插件配置格式:

    1. Erlang 原生配置文件格式 - ${plugin_name}.config
    1. sysctl 的 k = v 通用格式 - ${plugin_name}.conf
    1. plugin_name.key = value

    注:k = v 格式配置需要插件开发者创建 priv/plugin_name.schema 映射文件。

    编译和发布插件

    clone emqx-rel 项目:

    1. git clone https://github.com/emqx/emqx-rel.git
    1. {deps,
    2. [ {plugin_name, {git, "url_of_plugin", {tag, "tag_of_plugin"}}}
    3. , ....
    4. ....

    rebar.config 中 relx 段落添加: